勉強を兼ねて hyperapp の関数を Rust + wasm-bindgen で実装して、 hyperapp の動作高速化を狙ったが、 WebAssembly の制約があり詰まってしまった。
寝る前に思いついて 4 時間だけやっただけなので回避策を見落としただけかもしれないし、 WebAssembly の進化で問題無くなるかもしれない。
yew (Rust) や asm-dom (C++) のように、すべてを wasm 内で実装するのは抵抗があった。
§react の高速化ができれば既存の資産を使いつつ高速化できるし、他にも超重量級コンポーネントだけを wasm 化する戦略を採れると思った。
高速化が目的でなければ、作ってみるのは面白いと思う。
- エンコード・デコード時間
prop や state が更新される度に頻繁に大量のデータが JS と wasm 間でやり取りされる。 Rust 内で使うためには逐次 struct に詰め替えるかバイナリデータのまま走査する。
diff 処理の高速化を台無しにする? - DOM コードの呼び出し
多くないといえ、 DOM 操作には余計な時間がかかりそう。
JS 側に受信機能を持たせてコマンドベースでやるという手段もありうる。 - 関数渡し
まだ思案中の模様 https://github.com/rustwasm/wasm-bindgen/issues/103
インチキすればできたけど、ボトルネックになった。
asm-dom の JS インターフェースを hyperapp や §react へ組み込んで比較したほうが気楽で良いかも。
読み取り専用で JavaScript オブジェクトが利用できるようになってほしい。
https://github.com/WebAssembly/host-bindings/blob/master/proposals/host-bindings/Overview.md