web-dev-qa-db-ja.com

Web WorkerでWebAssembly(wasm)コードを使用するにはどうすればよいですか?

現在、Webワーカーは次のようにインスタンス化されています。

let worker = new Worker('worker.js');

次に、ブラウザはworker.jsをフェッチし、メッセージへの応答を開始できます。

WebAssemblyを使用してワーカーの機能を実装したいと思います。理想的には、次のようなことをしたいと思います。

let worker = new Worker('worker.wasm');

しかし、それは不可能だと私は確信しています。最も明白な代替手段は、worker.jsworker.wasmをフェッチし、それをコンパイルして実行することです。ただし、これは、別のスクリプト(worker.js)をフェッチして実行することが唯一のジョブである1つのスクリプト(worker.wasm)をフェッチすることを意味します。これは私にはひどく感じます。だから私の質問:Webワーカー内でWebAssemblyを使用するよりクリーンな方法はありますか?それは余分なフェッチステップを導入しませんか?

10
Josh Hansen

postMessage a WebAssembly.ModuleからWorkerにできます。したがって、メインスクリプトでfoo.wasmをコンパイルしてから、postMessageをコンパイルします。これにより、コードを再コンパイルまたは重複しないように最適化することが期待されます(ただし、現時点ではすべての実装がそうするわけではありません)。 。次に、インスタンス化するためにワーカーが必要になるだけです。

インスタンス化に必要なものの1つはimportObjectであり、渡すものはそのワーカーに常駐している必要があります。したがって、「この.wasmの新しいワーカー」と言っても、importObjectを指定する方法はありません。

これは文書化されています 構造化クローンで これはIndexDBにも影響します。

2
JF Bastien