Rust

React/ViteでRustとWebAssembly環境を構築する手順

ⓘ本ページはプロモーションが含まれています

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


スポンサードリンク

開発環境の構築と前提条件

このセクションでは、Rust + WebAssembly を React/Vite プロジェクトで利用できるようにするために必要なツールとそのインストール手順をまとめます。各ツールは公式ドキュメントや 2025 年版の Qiita ガイド(Qiita 記事)で推奨されているものです。環境が整っていれば、以降の章で紹介する非同期 Rust コードをそのままブラウザ上で実行できます。

⚠️ Rust のバージョンについて
本稿では「Rust 1.91 以上」を目安にしていますが、執筆時点(2026‑05‑13)では最新の安定版は 1.78 系 です。将来的に 1.91 がリリースされた際に同等かそれ以降のバージョンであれば問題ありません。実際に使用する際は rustup update stable で最新の安定版を取得し、rustc --version で確認してください。

必要なツール一覧

以下のツールがインストールされていれば、Rust → Wasm → Vite のフローをスムーズに進められます。各ツールは 公式サイト から取得することを推奨します。

  • Rustrustup 経由でインストール)
  • wasm-packcargo install wasm-pack --locked 推奨)
  • Node.js(LTS 系、v20 系が目安)と npm/pnpm などのパッケージマネージャ
  • Vite(7.2 系以上、npm create vite@latest でプロジェクト作成)

インストール手順

1️⃣ Rust ツールチェーンの導入

2️⃣ wasm-pack のインストール

3️⃣ Node.js とパッケージマネージャの導入

公式サイト(https://nodejs.org/)から LTS 版をダウンロードし、インストール後にバージョンを確認します。

4️⃣ Vite プロジェクトの雛形作成

以上で開発に必要な基盤は整いました。次は Rust 側のライブラリプロジェクトを作成します。


Rust プロジェクトの作成と WASM エクスポート設定

この章では、Rust で WebAssembly 用のライブラリ を作り、JavaScript から呼び出せる形にエクスポートするまでの手順を解説します。wasm-bindgen 系クレートが提供する型変換と #[wasm_bindgen] アトリビュートだけで、ほぼ自動的にインターフェイスが生成されます。

Cargo プロジェクトの初期化

まずはライブラリプロジェクトを作成し、必要な依存関係とビルドターゲットを設定します。

Cargo.toml の編集ポイント

項目 内容 補足
[dependencies] wasm-bindgen = "0.2"js-sys = "0.3"web-sys = { version = "0.3", features = [...] } web-sys はブラウザ API にアクセスするために必要な機能だけを列挙します。
[lib] crate-type = ["cdylib"] cdylib.wasm バイナリ生成の必須設定です。

#[wasm_bindgen] の基本的な使い方

#[wasm_bindgen] が付いた public 関数は自動で JavaScript 側にエクスポートされます。引数・戻り値は JsValue か、wasm-bindgen が変換できる型(文字列、数値、配列等)に限られます。

ポイント
- pub が必須です。private 関数はバインディングに含まれません。
- &str, String, i32, f64, JsValue などは自動で変換されますが、独自構造体を渡す場合は #[wasm_bindgen] で別途定義が必要です。


非同期関数の実装と Promise への変換

ブラウザ上では非同期処理は Promise として扱われるため、Rust の async fn をそのままエクスポートするだけでは JavaScript 側で利用できません。wasm-bindgen-futures が提供するユーティリティを組み合わせて変換します。

async fn の実装例(fetch API)

以下は外部 API から JSON データを取得し、JsValue に変換して返す非同期関数です。エラーハンドリングも Result<_, JsValue> で行います。

future_to_promise で Promise にラップ

上記の async fn をそのままエクスポートすると JavaScript 側では Promise が返ってきません。そこで、公開用関数を別途作り future_to_promise で包みます。

ポイント
- Result<JsValue, JsValue>OkresolveErrreject に自動マッピングされます。
- 引数は所有権を移すために String とし、内部で &str へ参照変換しています。


コンパイルから Vite + React への統合

この章では MDN が推奨するビルドフロー をベースに、生成された .wasm と JavaScript ラッパーを Vite プロジェクトに組み込む手順を詳述します。wasm-pack のオプションや package.json で必要な設定も合わせて解説します。

MDN 推奨のビルド手順(拡張版)

  1. Wasm ターゲットを追加
    bash
    rustup target add wasm32-unknown-unknown

  2. デバッグビルドでコンパイル(オプション)
    デバッグ時は cargo build が速く、ローカルでの動作確認に便利です。
    bash
    cargo build --target wasm32-unknown-unknown

  3. 本番用ビルドを wasm-pack でパッケージ化

  4. --target web はブラウザ直接実行向け(ESM)。

  5. --out-dir pkg で出力先ディレクトリを明示。
  6. --release フラグで最適化ビルド(デフォルトは debug)にする。
  7. --scope your-npm-scope を付けると npm 公開時のスコープが自動設定されます。

bash
wasm-pack build --target web --out-dir pkg --release

  1. package.json にビルドスクリプトとモジュール種別を追記

json
{
"name": "async-wasm",
"version": "0.1.0",
"type": "module", // ESM でインポートできるように必須
"scripts": {
"build:wasm": "cd async-wasm && wasm-pack build --target web --out-dir ../my-wasm-app/src/wasm-pkg --release"
},
"devDependencies": {
"binaryen": "^116.0.0" // wasm-opt 用にインストール
}
}

  • type: "module" により import 文で拡張子 .js を省略でき、Vite のデフォルト設定と整合します。
  • 上記スクリプトは ルートディレクトリ から実行し、生成物を React アプリの src/wasm-pkg に直接配置します。

  • 最適化(任意)

bash
npx wasm-opt -Oz -o src/wasm-pkg/async_wasm_bg_opt.wasm src/wasm-pkg/async_wasm_bg.wasm

-Oz はサイズ最小化モードです。最適化後のファイル名はコード側でインポートパスを合わせるだけで OK です。

Vite プロジェクトでの WASM バンドルインポート

Vite はデフォルトで .wasmアセット として扱うため、特別なプラグインは不要です。React コンポーネントからは動的 import() でラッパーを取得し、エクスポートされた関数を Promise 経由で呼び出します。

  • import("./wasm-pkg/async_wasm.js")遅延ロード を意味し、最初のページ描画時に WASM 本体はまだダウンロードされません。
  • Vite が生成する manifest.json と組み合わせると、キャッシュ戦略や CDN 配信も容易です。

デバッグ・最適化とサンプル実装

本番環境では バイナリサイズ起動レイテンシ が重要です。この章ではメモリ割り当ての軽量化、wasm-opt による圧縮手順、および Chrome DevTools を用いたプロファイル取得方法を解説します。

最適化手段

手法 設定例 効果(目安)
wee_alloc(小型アロケータ) Cargo.tomlwee_alloc = { version = "0.4", optional = true }features = ["wee_alloc"] を追加し、lib.rs でグローバルアロケータを有効化 バイナリサイズが約 10 % 減少
wasm-opt -Oz(Binaryen) npm install -g binaryenwasm-opt -Oz -o async_wasm_opt.wasm pkg/async_wasm_bg.wasm サイズ最小化、ロード時間短縮
インラインヒント (#[inline]) 重い計算関数に付与 関数呼び出しオーバーヘッド削減(CPU バウンドの場合)

wee_alloc の有効化コード例

Cargo ビルド時は --features wee_alloc を付与するか、デフォルト機能で有効化します。

パフォーマンス測定ポイント

項目 測定手法 推奨閾値
Wasm 初回ロード時間 Chrome DevTools の Network タブ → async_wasm_bg.wasmWaterfall 時間 < 150 ms
メモリ使用量 Performance > Memory プロファイル < 5 MB (SPA 全体)
非同期呼び出しレイテンシ performance.now() 前後で計測 < 30 ms

測定例(React コンポーネント内)
tsx
const t0 = performance.now();
await wasm.fetch_data_promise(url);
console.log(fetch latency: ${performance.now() - t0} ms);

画像処理サンプル:グレースケール変換

以下はブラウザ上の Canvas ピクセルデータを受け取り、Rust 側で高速にグレイスケール化して返す例です。非同期化すれば UI スレッドへの負荷も回避できます。

React 側からの呼び出し例(非同期化版):


まとめと次のアクション

  • 環境構築:Rust (最新安定版)、wasm-pack、Node.js v20 系、Vite7.2+ をインストールし、my-wasm-app の雛形を作成しました。
  • Rust 側実装#[wasm_bindgen]future_to_promise を組み合わせて非同期関数を Promise に変換し、ブラウザから呼び出せるようにしました。
  • ビルドフロー:MDN 推奨の wasm-pack build --target web --release に加えて、package.jsontype: "module" 設定と最適化スクリプトを用意し、Vite へシームレスに組み込みました。
  • 最適化 & デバッグwee_allocwasm-opt -Oz によるサイズ削減、Chrome DevTools を使ったロード時間・メモリ測定手順、画像処理サンプルを提示しました。

今すぐできること

  1. ビルドスクリプト実行
    bash
    npm run build:wasm # Rust → Wasm の一括生成
    npm run dev # Vite 開発サーバ起動
  2. 非同期ロジックを拡張
  3. REST API だけでなく WebSocket、IndexedDB へのアクセスも async fn + future_to_promise パターンで実装できます。
  4. サイズ削減の継続的改善
  5. CI に wasm-opt を組み込み、プルリクエストごとに最適化済みバイナリを生成し、GitHub Actions のキャッシュでビルド時間を短縮しましょう。

これらの手順を踏めば、React/Vite プロジェクトに 高速かつ安全な非同期 Rust+Wasm コンポーネント を本番レベルで組み込むことが可能です。ぜひ自分のアプリケーションに合わせてカスタマイズし、次世代 Web 開発を体感してください。

スポンサードリンク

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


-Rust