Rust

Rust と WebAssembly 入門:wasm-bindgen と wasm-pack の全手順

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

スポンサードリンク

概要と必要なツール

ツール役割推奨バージョン
Rust (stable)言語本体・コンパイラ (rustc) と Cargo パッケージマネージャー最新の安定版
wasm-bindgenRust の型や関数を JavaScript にエクスポートするためのバインディングコード生成cargo add wasm-bindgen で自動取得
wasm-packビルド、パッケージ化、npm 公開までを一括管理最新の安定版(インストール時に自動取得)

ポイント
- wasm-bindgen が生成する JS ラッパーは ES モジュール形式で提供されるため、Node.js なしでもブラウザ単体で動作します。
- wasm-pack はビルド・型定義生成・npm パブリッシュを自動化し、CI/CD と相性が良い点が特徴です。

参考情報:
- MDN の公式チュートリアル「Rust to Wasm ガイド」(MDN contributors, 2024‑02‑15)。
- Zenn 記事「WebAssembly 入門」by summer_fb (2024‑07‑20)【リンク】。


開発環境のセットアップ

1. Rust のインストールとツールチェーン管理

2. wasm-pack と補助ツールの導入

ポイント
rustup が提供するツールチェーンはシステム全体で一元管理でき、ターゲット追加やアップデートがコマンド一つです。wasm-pack はインストール時に自動的に最新版を取得しますので、バージョン番号を書き込む必要はありません。

3. プロジェクトの雛形作成

方法 A: cargo generate

方法 B: wasm-pack init(シンプルな構成向け)

どちらの方法でも、src/lib.rs が自動生成され、最小限の Cargo 設定が整います。


プロジェクト作成とコード実装

1. #[wasm_bindgen] アトリビュートで関数をエクスポート

以下は文字列を逆順に返す純粋関数と、ページロード時に自動実行される初期化ロジックの例です。

重要ポイント

項目説明
#[wasm_bindgen]関数や構造体を JavaScript から呼び出せるようにする属性。
#[wasm_bindgen(start)]モジュール読み込み時に自動実行され、初期化処理を書ける。
web-sys クレートブラウザ API(DOM、Console など)への安全なアクセスを提供。
Closure::wrapRust のクロージャを JavaScript 側の関数オブジェクトに変換するユーティリティ。

ビルド・ブラウザ組み込み手順

1. wasm-pack によるビルド

  • --target web を指定すると Node.js 用バンドラは不要 な形で出力され、生成物は以下のように pkg/ ディレクトリに配置されます。
ファイル内容
wasm_demo_bg.wasm実際の WebAssembly バイナリ
wasm_demo.jsES モジュール形式の JavaScript ラッパー
wasm_demo_bg.d.tsTypeScript 用型定義ファイル
wasm_demo_bg.wasm.mapデバッグ用 source map

ポイント
生成された .jsimport 文で直接読み込めるため、Webpack や Rollup といったバンドラは必須ではありません。

2. HTML 側からのロード例

補足

  • init() は自動的に WebAssembly.instantiateStreaming を呼び出し、ネットワーク経由で .wasm バイナリを取得します。
  • ブラウザが モジュールスクリプト に対応していれば、追加のビルドステップは不要です。

デバッグ・テスト手法

1. Source Map を活用したブラウザデバッグ

wasm-pack が生成する *.wasm.map ファイルを有効化すると、Chrome/Firefox の DevTools で Rust ソースレベル のブレークポイントが設定可能です。

手順:

  1. DevTools → Settings → Enable WebAssembly debugging をオンにする。
  2. Sources タブで wasm_demo_bg.wasm.map が自動的にロードされ、src/lib.rs が表示されることを確認。
  3. 任意の行(例: reverse 関数内部)にブレークポイントを置き、ページ上で操作すると実行が停止します。

ポイント
ソースマップはデバッグ時だけ有効化し、本番ビルドでは除外してサイズを削減できます。

2. wasm-objdump によるバイナリ確認

出力例(抜粋):

この情報は 最適化の過程で意図しないコードが生成されていないか を目視で確認したいときに有用です。

3. JavaScript コンソールからの即時呼び出し

テストスクリプトを npm test などに組み込めば、CI 上でも簡易的な動作確認が行えます。


静的ホスティングと CI 設定

1. GitHub Pages / Cloudflare Pages へのデプロイ

生成された pkg/ ディレクトリ(または static/ にコピーしたもの)をそのまま静的サイトとして公開できます。

  • GitHub Pages
  • gh-pages ブランチを作成し、pkg/ の内容をルートに配置。
  • リポジトリ設定 → Pages → 「Source: gh‑pages」へ切り替える。

  • Cloudflare Pages

  • プロジェクトのビルドコマンドは wasm-pack build --target web、出力ディレクトリは pkg を指定。
  • デプロイ完了後に自動的に CDN が有効化され、低遅延で Wasm が配信されます。

参考: Qiita 記事「Node なしフロントエンド」by osanshouo (2023‑11‑05)【リンク】。

2. GitHub Actions による自動ビルド & デプロイ

  • ステップ解説
  • rustupwasm-pack のインストールは毎回最新安定版が取得されます。
  • wasm-pack build --target web により、Node.js 不要の静的アセットだけが pkg/ に出力されます。
  • 最後に peaceiris/actions-gh-pages アクションで gh-pages ブランチへ自動プッシュし、GitHub Pages が即座に更新されます。

ポイント
CI の構成はシンプルながらも、ローカルと同一のビルドフローを保証できるため「ローカルで動く → 本番でも動かない」問題がほぼ解消します。


まとめと次のステップ

項目内容
エコシステムwasm-bindgen がバインディング、wasm-pack がビルド・配布を担当。どちらも最新安定版を利用すればバージョン管理の煩雑さが減ります。
環境構築rustupwasm32-unknown-unknown ターゲット追加 → cargo-generatewasm-pack init でプロジェクト雛形作成。
コード実装#[wasm_bindgen] アトリビュートで関数やエントリポイントを公開し、web-sys でブラウザ API に安全にアクセス。
ビルドと組み込みwasm-pack build --target webpkg/ の ES モジュールを HTML の <script type="module"> からインポートすれば、Node.js 不要で動作。
デバッグ.wasm.map と DevTools によるソースレベルブレークポイント、wasm-objdump でバイナリ確認が可能。
デプロイpkg/ をそのまま GitHub Pages / Cloudflare Pages に配置し、GitHub Actions で自動ビルド・公開を実装。

この流れに沿えば、最新の安定版 Rust と Wasm の組み合わせで、余計な依存なしに高速かつ安全なフロントエンド機能をすぐにプロトタイプ化できます。

次に挑戦したいこと
- trunkwasm-bindgen-cli を使った SPA(シングルページアプリ)構築。
- 大規模クレート群でのコード分割と遅延ロード実装。
- CI に cargo auditwasm-opt(Binaryen)を組み込み、セキュリティとパフォーマンス最適化を自動化。

ぜひ本稿の手順をベースに、独自の WebAssembly アプリケーション開発に挑戦してみてください。

スポンサードリンク

-Rust
-, , , , , ,