wasm-packとReactでRustをWASMに変換する
wasm-packでRustコードをWebAssemblyにコンパイルし、生成されたJSバインディングをReactアプリで利用します。
「wasm-packとReactでRustをWASMに変換する」はCoddyKit上の無料React Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
RustのWASMツールチェーン
標準的なRustからWASMへのワークフローでは、2つのツールを使用します。wasm-packはビルドを統括し(RustからWASMへのコンパイル、wasm-bindgenの実行、npmパッケージの生成)、wasm-bindgenは、Rustの関数を適切な型処理によって通常のJavaScript関数として呼び出せるようにするJavaScriptバインディングを生成します。
wasm-bindgen属性
#[wasm_bindgen]属性は、JavaScriptにエクスポートするRustの関数、構造体、メソッドを示します。これがない場合、関数はWASMにコンパイルされますが、JavaScriptからアクセスできません。関数に#[wasm_bindgen]を付けると、wasm-bindgenが引数と戻り値の変換を処理するJavaScriptのグルーコードを生成します。
単純なRust関数
最小限のエクスポートされたRust関数は次のとおりです。use wasm_bindgen::prelude::*; #[wasm_bindgen] pub fn add(a: u32, b: u32) -> u32 { a + b }この関数は符号なし32ビット整数を2つ受け取り、1つの値を返します。wasm-bindgenは、この関数を数値の引数で呼び出し、数値の結果を返すJavaScriptコードを生成します。
wasm-packでのビルド
Rustクレートのディレクトリでwasm-pack build --target webを実行します。RustコードをWASMにコンパイルし、wasm-bindgenを実行してJavaScriptバインディングを生成します。その後、.wasmバイナリ、JavaScriptのグルーコードモジュール、TypeScriptの型定義を含むpkg/ディレクトリを出力します。
Reactでのインポート
生成されたモジュールをReactコンポーネントにインポートします。import init, { add } from '../pkg/my_lib'のinit関数がWASMバイナリを読み込んでインスタンス化するため、useEffect内で一度呼び出します。初期化後は、エクスポートされた関数を直接呼び出します。const result = add(2, 3)
複雑なデータの受け渡し:js_sysとJsValue
プリミティブな数値以外の複雑なデータを扱うために、wasm-bindgenはjs_sys::Array(JavaScript配列)、js_sys::Object(JavaScriptオブジェクト)、wasm_bindgen::JsValue(任意のJavaScript値)を提供します。これらの型を使うと、Rust関数でJavaScriptの配列やオブジェクトを受け取ったり返したりできますが、プリミティブ型よりもシリアライズのオーバーヘッドが大きくなります。
マーシャリングのオーバーヘッドを最小化
重要なパフォーマンス原則は、データをWASMメモリ内に保持し、すべての計算をそこで行うことです。データを一度渡して計算し、最後の結果だけを返します。各ステップでWASM境界を越えてデータを繰り返し転送するパターンは避けてください。境界を越えるたびに発生するオーバーヘッドは小さくても、タイトなループでは積み重なります。
構造体に対する serde-wasm-bindgen
serde-wasm-bindgenクレートを使用すると、SerdeによってRustの構造体とJavaScriptオブジェクトの間でシリアライズおよびデシリアライズを行えます。構造体に#[derive(Serialize, Deserialize)]を付け、serde_wasm_bindgen::to_value()とfrom_value()を使用します。複雑な構造化データを受け渡す場合の標準的な方法です。
Web Worker で WASM を実行
長時間実行されるWASMの計算は、実行しているスレッドをブロックします。WASMをWeb Workerに配置して、Reactのメインスレッドを空けておきます。WASMモジュールを初期化してメッセージを処理するWorkerファイルを作成します。postMessageでWorkerにデータを送り、messageイベントで結果を受け取ったら、その結果でReactの状態を更新します。
wasm-pack から生成される TypeScript 型
wasm-packは、エクスポートされたすべての関数と型について、TypeScriptの宣言ファイル(.d.ts)を自動生成します。これにより、Rustの関数を呼び出すReact TypeScriptプロジェクトで完全な型安全性を確保できます。生成される型はRustの関数シグネチャ(add(a: number, b: number): number)を反映するため、IDEの自動補完も正しく機能します。
本番環境での考慮事項
WASMバイナリは、最適化後で通常100KB〜2MBになります。積極的にサイズを最適化するには、Cargo.tomlのreleaseプロファイルでopt-level = "z"を設定して、wasm-packのビルド時にwasm-optを有効にします。WASMファイルはContent-Type: application/wasmで配信し、HTTP/2を有効にして、ブラウザーがバイナリを効率的にストリーミングできるようにします。
wasm-bindgen 属性
Rustコードにおける#[wasm_bindgen]属性の目的は何ですか?
レッスンのまとめ
wasm-pack build --target webはRustをWASMにコンパイルし、wasm-bindgenによってJavaScriptバインディングを生成します。エクスポートする関数には#[wasm_bindgen]を付けます。Reactでinitとエクスポートされた関数をインポートし、useEffect内でinit()を呼び出してから、通常のJavaScriptと同じように関数を呼び出します。複雑な構造体のシリアライズにはserde-wasm-bindgenを使用します。長時間の計算では、WASMをWeb Workerで実行してReactのメインスレッドを空けておきます。
よくある質問
「wasm-packとReactでRustをWASMに変換する」レッスンは無料ですか?
はい。「wasm-packとReactでRustをWASMに変換する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「wasm-packとReactでRustをWASMに変換する」で何を学びますか?
wasm-packでRustコードをWebAssemblyにコンパイルし、生成されたJSバインディングをReactアプリで利用します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「wasm-packとReactでRustをWASMに変換する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- WebAssemblyとは何か、Reactとの関係
- ReactでWASMモジュールを読み込む
- wasm-packとReactでRustをWASMに変換する
- WASM の活用例:画像処理と計算