← レッスン一覧に戻る レッスン 16 / 28
上級 getting-started
本番環境へのデプロイ
本番用ビルド
# サイズ最適化付きリリースビルド
wasm-pack build --release --target webCargo.tomlにリリース最適化設定を追加します:
[profile.release]
opt-level = "s" # "s" = 小さい、"z" = 最小
lto = true # リンク時最適化
codegen-units = 1 # より良い最適化
strip = true # デバッグシンボルを除去
panic = "abort" # パニック処理をコンパクトにバイナリサイズの最適化
ステップ1:wasm-opt
# binaryenのインストール
npm install -g binaryen
# 最適化(サイズを10〜30%削減可能)
wasm-opt -Oz -o optimized.wasm pkg/my_app_bg.wasmステップ2:サイズの内訳を確認
# twiggyのインストール
cargo install twiggy
# サイズの大きい関数を表示
twiggy top pkg/my_app_bg.wasm
# コールグラフを表示
twiggy paths pkg/my_app_bg.wasmステップ3:不要なコードを削除
// #[cfg]を使ってWasmビルドからコードを除外
#[cfg(not(target_arch = "wasm32"))]
fn native_only() { /* ... */ }
// 小さな機能のために大きなクレートを取り込まない
// フィーチャーフラグを使って依存関係を最小化Wasmの正しい配信
サーバーは正しいMIMEタイプを送信する必要があります:
| ファイル | Content-Type |
|---|---|
.wasm |
application/wasm |
.js |
application/javascript |
最近のホスティングサービスはほとんどが自動的に処理します。処理されない場合は、ヘッダーを追加します:
# _headersファイル(Cloudflare Pages、Netlify)
/*.wasm
Content-Type: application/wasm
Cache-Control: public, max-age=31536000, immutableCloudflare Pagesへのデプロイ
# ビルド
wasm-pack build --release --target web
# HTML + pkg/を含むdist/フォルダを作成
mkdir -p dist
cp index.html dist/
cp -r pkg dist/
# デプロイ
npx wrangler pages deploy dist/ --project-name my-wasm-appまたは、GitHubリポジトリを接続して、プッシュごとに自動デプロイすることもできます。
Vercelへのデプロイ
// vercel.json
{
"headers": [
{
"source": "/(.*).wasm",
"headers": [
{ "key": "Content-Type", "value": "application/wasm" },
{ "key": "Cache-Control", "value": "public, max-age=31536000, immutable" }
]
}
]
}Netlifyへのデプロイ
# netlify.toml
[[headers]]
for = "/*.wasm"
[headers.values]
Content-Type = "application/wasm"
Cache-Control = "public, max-age=31536000, immutable"キャッシュ戦略
Wasmバイナリはビルド後は不変です — 積極的なキャッシュを使用しましょう:
# .wasmを1年間キャッシュ(コンテンツハッシュ付きファイル名)
Cache-Control: public, max-age=31536000, immutable
# JSローダーはキャッシュしない(新しい.wasmを参照する可能性)
Cache-Control: public, max-age=3600読み込み戦略
ストリーミングコンパイル(最速)
// ブラウザがダウンロード中にWasmをコンパイル — 最速の方法
const response = await fetch('app_bg.wasm');
const module = await WebAssembly.compileStreaming(response);遅延読み込み
// 必要な時だけWasmを読み込む
let wasmModule = null;
async function getWasm() {
if (!wasmModule) {
wasmModule = await import('./pkg/my_app.js');
await wasmModule.default();
}
return wasmModule;
}
// 初回使用時に読み込み
button.onclick = async () => {
const wasm = await getWasm();
wasm.process(data);
};本番デプロイチェックリスト
| ステップ | コマンド | 理由 |
|---|---|---|
| リリースビルド | wasm-pack build --release |
デバッグ情報を除去 |
| wasm-opt | wasm-opt -Oz |
バイナリを10〜30%縮小 |
| サイズ確認 | ls -lh pkg/*.wasm |
100KB未満を目標 |
| MIMEタイプ確認 | Networkタブを確認 | application/wasmであること |
| HTTPS確認 | Wasmに必須 | HTTPでは読み込まれない |
| キャッシュ追加 | Cache-Controlヘッダーを設定 | .wasmファイルに1年間 |
| エラーレポート | console_error_panic_hookを追加 |
本番でのクラッシュをデバッグ |
| フォールバック | WebAssemblyの存在を確認 |
非対応の場合メッセージを表示 |
試してみよう
Runをクリックして、デプロイチェックリストを確認しましょう。Rust/Wasmプロジェクトを公開する準備ができたら、これらのステップに従ってください。
試してみる
チャプタークイズ
すべての問題に正解してレッスンを完了しましょう