なぜ WASM を JS に変換するのですか?
.wasm バイナリは単独でページ内で実行することはできません。ブラウザは JavaScript を介してそれをロードします。モジュールをインポートし、インポートを渡し、エクスポートされた関数を通常の関数のように呼び出せるように、人々は .js ファイルを必要とします。ツールチェーンがこのグルーコードを生成するため、生のロード用コードを直接触ることは稀です。
WASM から JS への変換方法
Emscripten のグルー出力 OPEN-SOURCE
C/C++ をコンパイルする際、emcc app.c -o app.js を実行すると、Emscripten は app.wasm とそれをインスタンス化する app.js ローダーの両方を出力します。インポート可能なモジュールにするには -s MODULARIZE=1 を追加します。
Rust 用の wasm-pack OPEN-SOURCE
Rust + wasm-bindgen の場合、wasm-pack build --target web を実行します。これにより、.wasm とすべての関数を再エクスポートする .js バインディングファイルが生成されます。アプリからは init() を使用してインポートします。
これらの形式について
.wasm ファイルは、コンパイルされた WebAssembly モジュールを保持します。これは C、C++、Rust などの言語から生成されたポータブルなバイナリバイトコードであり、ネイティブに近い速度で実行されます。ほとんどの .wasm…
.WASM の詳細を開く →JSファイルはJavaScriptのソースコードファイルです。これは、Node.jsを介してウェブページのインタラクティブ性やサーバーサイドアプリを動かす、プレーンで読み取り可能なテキストです。VS…
.JS の詳細を開く →品質と注意点
.jsファイルにはモジュールのロジックは含まれていません。.wasmをロードして橋渡しをするだけであり、.wasmも一緒に配布する必要があります。- 手書きのローダーは、モジュールが期待する正確なインポートオブジェクトを提供する必要があります。そうしないと、インスタンス化時に
LinkErrorが発生します。 - Emscripten や
wasm-bindgenのグルーコードは、その.wasmを生成した特定のビルドと紐付いています。バージョンを混ぜるとバインディングが壊れます。
よくある質問
WASM を完全に読み取り可能な JavaScript に戻せますか?
.js を生成した後も .wasm ファイルは必要ですか?
.js は実行時に .wasm を取得してインスタンス化するため、両方を一緒にデプロイする必要があります。wasm-pack ではどの target フラグを使うべきですか?
--target web、webpack/Vite には --target bundler、Node.js には --target nodejs を使用します。