🏆
WASMをWebの第一級言語にする
JS glueなしでWeb APIを直接呼び出すComponent Model
WebAssemblyがWebで2級市民として扱われている現在の問題と、MozillaのComponent Modelがこれをどう解決しようとしているかを取り上げます。
構造ダイアグラム
Before vs After
現在: WASM = 二級市民
📝
Rust / C++
→
📦
.wasm
→
⚡
JS Glue Code
embind / wasm-bindgen
→
🌐
Web API
-45%パフォーマンス
未来: Component Model = 一級市民
📝
Rust / C++
→
🧩
Component (.wasm)
WITインターフェース含む
→
🌐
Web API直接呼び出し
JS glue不要!
WITインターフェース例
WIT宣言:
component {
import std:web/console;
}
Rustでの使用:
use std_web::console;
console::log("hello, world");
標準化タイムライン
2017 WASMリリース
→
現在: Mozilla + Google標準化中
→
実験: Jco、Wasmtime
→
未来: ブラウザネイティブサポート(数年かかる)
動作フロー
1
現在: WASMはWebAssembly.instantiateStreaming()などJS APIで手動ロードが必要
2
現在: DOM、consoleなどWeb APIに直接アクセス不可 — JS glue codeがブリッジ
3
現在: 言語ごとに別のバインディングツールが必要、rustc --target=wasmの出力がブラウザで直接動かない
4
Component Model: WIT(Interface Description Language)で必要なWeb APIを宣言
5
Component Model: ブラウザが<script type="module" src="component.wasm">で直接ロード
6
Component Model: JSからimport { fn } from "lib.wasm"形式でハイブリッド使用可能
7
結果: JS glue code完全除去 → 45%の性能オーバーヘッド解消、ツールチェーン統一
メリット
- ✓ JS glue code完全除去 — 45% DOM性能オーバーヘッド解消
- ✓ WASMをJSのように<script>タグで直接ロード可能
- ✓ 言語別ツールチェーン統一 — 標準コンパイラで直接ブラウザ実行
- ✓ WITで型安全なWeb APIインターフェース宣言
- ✓ JSとのハイブリッド使用可能 — 段階的導入可能
- ✓ ブラウザ外でも実行(Wasmtime) — webとサーバーコード再利用
デメリット
- ✗ まだ標準化進行中 — プロダクション使用は時期尚早
- ✗ 仕様変動が頻繁でツーリングのchurnが発生
- ✗ Polyfill/機能検出が困難 — JSブリッジの柔軟性を失う可能性
- ✗ Component Model自体が新しい複雑性を導入(WIT学習が必要)
- ✗ WebGL2/WebGPUではJS shimのコストは既に微小
- ✗ メモリ管理未解決 — Wasm GC提案がDOM参照維持に必要かどうか不明
ユースケース
DOM集約型WASMアプリ — glueなしで直接DOM操作
Rust/C++ webフレームワークがJSなしで独立動作
多言語コンポーネント組み合わせ — Rust画像処理 + Goネットワーク + JS UI
モバイルOS閉鎖性への代替 — ネイティブアプリレベルのwebアプリ
WASM Registryによるコンポーネント再利用エコシステム