cumin を wasm にビルドして web ページの上で遊べるようにした.
wasm にビルド出来るようにした変更はこれ:
実際の変更はかなり小さくて, Cargo.toml にちょっと設定増やして, wasm-pack build
を叩くようにするだけ. ビルド時にブラウザで読めるような wasm を生成するために --target no-modules
が必要. ある文書によればこれは古い方法で --target web
で生成するらしいけど, それで生成する wasm をブラウザで読む方法が分からなかった. wasm 周りで一番大変だったのが, ブラウザ上でロードする部分. さて wasm-pack
したら ./pkg
以下に出来る wasm ファイルが欲しかった wasm ファイル本体.
非本質的な変更として. wasm にエクスポートするインターフェイスとなる関数は原始的な型しか扱えない. 例えば Result 型なんてもってのほかで, タプルなんかを返り値にする関数をそのままエクスポートできない. (自分で IntoWasmAbi トレイトを実装すればこの限りではないが.) 今はものすごく簡単に, Fn(&str) -> String
な関数一個をエクスポートしている. Cumin コードを受け取ったら JSON をシリアライズした文字列を返す. これは失敗し得る処理なのでエラーも返せないといけないんだけど, JSON 文字列が返ってきたら成功で, JSON 文字列でなかったら失敗時のエラーメッセージになっていることとしている(!). また元の eval
ではファイルシステムを扱う. なぜなら use
文でファイルを参照して読み込むような機構が用意してあるからだ. ブラウザで動く wasm は当然ファイルシステムを持たない. これをビルドしようとしたら静かに失敗してしまった. 応急的な処置として, eval
からファイルシステムを抜いただけの eval_wasm
を新たに生やした.
wasm を読む web ページの例はこれ:
wasm-pack
で生成した pkg フォルダごと丸々コピーして置いちゃってる. これの index.html の wasm_bindgen
云々が本質.
この web ページは次のURLから実際にアクセスできる:
URL の hash 部分 (#...
) に Cumin コードを埋め込むことが出来るようにしておいた. Cumin のドキュメントの端々にコードを埋め込んだリンクを置いておけば, すぐにそれを実行することが出来て便利じゃないかと思っている.
こんな感じ: