前回は、Dedicated Worker を触ってみましたが、引き続き WebWorker を触っていきます。
今回は、Shared Worker です。
参考
試す
環境準備
前回に引き続き環境の準備は、vite で準備します。
1 | npm init @vitejs/app app --template vanilla |
このタイミングで、main.js は main.ts に変更。
index.html での参照先も main.ts に変えておきます。
main.ts で Worker として作成するソースコードを URL で指定します。
1 | const myWorker = new SharedWorker("worker.ts"); |
1 | const _worker: SharedWorkerGlobalScope = self as any; |
SharedWorker は、Dedicated Worker と異なり、onconnect
の実装が必要だそう。
そして SharedWorker でのconsole.log
は、通常の開発者コンソールに出て来ませんでした。
調べてみると、chrome://inspect/#workers
にアクセスして inspect を押すと、別画面で開発者コンソールが開きます。
こちらに console.log の内容が出力されていました。
main スレッド(UI スレッド) <= Worker スレッド 方向の通信
続けて、main スレッド(UI スレッド) <= Worker スレッド 方向の通信を試します。
1 | const myWorker = new SharedWorker("worker.ts"); |
1 | const _worker: SharedWorkerGlobalScope = self as any; |
これを実行すると、Worker 側のコンソールで以下のように表示されます。
1 | (3) [1, 2, 3] |
複数のタブで、同じページを開くと複数 (3) [1, 2, 3]
が出てきます。
Chrome の場合、別のウィンドウでも開くと、 (3) [1, 2, 3]
が出てきますが、ユーザーをゲストにしたら表示されませんでした。
境界点が「ユーザー」のようです。
main スレッド(UI スレッド) => Worker スレッド方向の通信
逆方向の Worker から、main スレッドの通信は以下の通り。
1 | const myWorker = new SharedWorker("worker.ts"); |
1 | const _worker: SharedWorkerGlobalScope = self as any; |
実行すると、ページ側の開発者コンソールで (3) [1, 2, 3]
側の表示が確認できました。
onerror の定義ができるかと思ったがどうもうまくいかない様子。
調べても、明確に記述が見つけられず。
Dedicated Worker の時と同様に、vite では、SharedWorker の import に対応していました。
次の通りです。
1 | // ?sharedworker ?sharedworker&inline も可 |
ちょっと不思議な現象?
複数タブで SharedWorker の確認をしていた時、動きのおかしくなった瞬間があった。chrome://inspect/#workers
で、terminate
を押して停止。
再度ページ開き直したら、最新のコードで Worker が動き出した。
今回は SharedWorker を触ってみました。
引き続き、WebWorker 関連の確認を進めていきます。
ではでは。