Vue × WASM × Rust—試行錯誤とこれからの展望
初版投稿日: 2025/06/10 (コミット履歴より) 更新日: 2025/09/05
元々 AI 一緒に書いた記事ですが、少し改めます。
本日のふたこと
(2025/09/05 のひとことになります)
すでに別記事をあげてるので二言目になります。
最近ずっと聴いてる
とりあえず
このサイトは、rust(nom)で書かれた四則演算パーサーを wasm で載せ、それを実際に動かしているものです。 nom などについては当サイトのパーサー記事が参考になるかと。
wasm の注目度
私が思っていたより、wasm はすごいものでした。 Linux コンテナの「次」としての WebAssembly、の解説
なんとコンテナの「次」なんですね!
これは驚いた。あんま深く考えてなかったから、共存ぐらいにしか思ってなかった。
wasm と java の違い
kotlin という rust の次に好きな言語のおかげで、java の抵抗も減ってます。
しかし、GC に抵抗ある人にとっては結構いい選択肢になると思います。
(あと java のバージョンかんりめんどくさい)
まとめ
詳しいことかつ当時の背景については、AI と一緒に書いた旧記事の項目を開いてみてみてください。
AIと一緒に描いた旧記事
最近、Vue や Nuxt、Nuxt UI を触れていて、「色々作れそうだな」と思うことが増えてきました。
一方で、JS の型システムがガバガバすぎて、Rust が恋しくなってきました。
そこで、WASM の存在を思い出し、Rust の強みを活かせる仕組みを急遽作ることにしました。
experiments-wasm-vue について
このリポジトリでは、Rust を WASM としてコンパイルし、Vue と連携する試みを行いました。
内容としてはシンプルで、BMP パーサーを作る際にお世話になった nom を活用し、四則演算パーサーを作ったものです。
当初、外部ライブラリを使うと WASM のコンパイルが難しいかと思っていましたが、入出力が絡まない処理なら問題なく通ることが分かりました。
LLVM が適切に変換してくれるらしく、「まじか…?」と驚きつつも、その柔軟さに感動しました。
リポジトリのリンク:
Vue の環境構築と WASM の連携
Vue の開発環境は Vite を使ってセットアップしました。 そのため、通常の Vue 開発とは少し異なり、Vite の設定にも気を配る必要がある点がポイントになります。
また、今後は Nuxt への連携も視野に入れているのですが、ここで引っ掛かったのが WASM を Node.js のモジュールではなく、Web サイトとして使える形式にビルドすることでした。
どーやら通常の HTML 同様の紐付け方をすれば OK らしい?ということが分かったので、今回はそうしました。
Nuxt のディレクトリ構造と WASM の管理方法
Nuxt4 から、主要なコンポーネントのディレクトリが/app に集約されるようになるそう。 なので、同じプロジェクト内で/wasm ディレクトリを作り、WASM のコードを管理するのが良さそうだと考えています。
まだ検証の余地はありますが、この方法なら Vue/Nuxt のコンポーネントと適切に連携できそうなので、今後試していきたいと思います。
今後の展望—ランタイムの構想
WASM の可能性を探る中で、「Web ブラウザ上で動く独自ランタイムを作ってみたい」とも考え始めました。
カーネルレベルの設計とまではいきませんが、例えば:
- ブラウザ内で動く軽量な仮想環境
- WASM の能力をフル活用できる処理オフロード
- Rust の型安全性を生かしたスクリプト実行システム
こういうの作ってみたいなって願望を持ってます。願望です。はい。
まとめ
wasm はいいぞ
参考など
- Vue ベースな Web ツールのロジック部分を Rust 製 Wasm で実装する: pirosuke 様
ディレクトリの構造等を参考にしました。 - Rust から WebAssembly にコンパイル/mdn
いつも通りめっちゃわかりやすい
なんで更新したの
リポジトリを綺麗にした記念です。 orphan ブランチ作って cherry-pick しまくり、main ブランチを完全に作り直しました。 また、まだ動かないコミットは dev ブランチに移動し、動作するようにさせました!
当時の記事にはmain コミットいじって動かなくなっちゃった!thprって書いてあって腹が立ったので描き直しました。
当時の自分に切れる
自分の敵は自分っちゅーことや