最近、私は Web ワーカーをいじっています。これは、Web ワーカーの使用を開始するために知っておく必要のあるすべてのことについての包括的なガイドです。
ブログを読むのをスキップして、代わりにコードをチェックアウトしたい場合は、すべてのスニペットが含まれている Github リポジトリを参照してください。
Github Web ワーカー リポジトリ
それで、私が Web ワーカーについて調べるきっかけとなったのは、構築しているプラットフォームで計算量の多いタスクが UI をブロックしていたからでした。
そこで私は、「そうですね、これを UI をブロックしないようにするにはどうすればよいでしょうか?」と考えました。 setTimeout を使用して、メイン スレッド内のすべてのコードの実行が完了したことを確認し、その後、計算量の多いタスクを実行できますか?
ここに誤解があります。setTimeout を使用しても UI がブロックされないという意味ではありません。はい、setTimeout コールバックが実行される前にメイン スレッド上のすべてが実行されますが、このコールバックはマクロ タスク キューからポップアウトされるときにメイン スレッド自体で実行されるため、UI が応答しなくなります。
setTimeout の仕組みについて詳しく知りたい場合は、いくつかの参考資料を参照してください —
JavaScript は本質的に「シングルスレッド言語」ですが、Web ワーカーを使用すると、計算量の多いコードを別のスレッドで実行できます。
始める前に、いくつか注意すべき点があります -
const worker = new Worker("./worker.js")
注: worker.js はモジュールではないため、import ステートメントを使用できません。まだ。 :')
worker.jsをモジュールとして使用するには、コンストラクターのオプションにtype: moduleを指定します。
const worker = new Worker("./worker.js")
const worker = new Worker('./worker.js', { type: 'module' })
すべてをまとめる
ここで、Web ワーカーを統合した後にコードがどのように見えるかを見てみましょう。
メインスレッドコード:
worker.terminate()
ワーカー スレッド コード:
// ... function workerFunction() { // Don't spin up a new worker instance if the process has already been started. if (statusElement.textContent !== PROCESS_STATUS.PROCESSING && window.Worker) { const worker = new Worker('./worker.js', { type: 'module' }) // Sending 10000000000000 to the web worker worker.postMessage(10000000000000) statusElement.textContent = PROCESS_STATUS.PROCESSING // This piece of code is executed after worker finishes its task and returns data. worker.onmessage = function (event) { statusElement.textContent = event.data } } } // ...
そして結果:
アプリケーションを実行すると、計算量の多いタスクが UI をブロックすることなく実行されていることがわかります。
Comlink は 小さなライブラリ (1.1kB) で、postMessage ロジックについて考える際の精神的な障壁を取り除きます。
より抽象的なレベルでは、postMessage と ES6 プロキシの RPC 実装です。
私が Comlink を使用した具体的な理由は、プレーンな JavaScript を使用してメインスレッドからワーカーに関数を渡すことができなかったからです。 Comlink のプロキシを使用すると、メインスレッドからワーカーにコールバック関数を簡単に渡すことができました。 [このセクションを参照]
プロジェクトで comlink の使用を開始するには、ライブラリをインストールします
const worker = new Worker("./worker.js")
このライブラリを使い始めるには、次のメソッドについて知っておく必要があります -
Comlink.wrap(エンドポイント)
const worker = new Worker('./worker.js', { type: 'module' })
Comlink.expose(value, endpoint?, allowedOrigins?)
worker.terminate()
さらに読む
以上がWeb ワーカーについて知っておくべきことはすべて、使い始めるために必要な情報です。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。