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 はいいぞ

参考など

なんで更新したの

リポジトリを綺麗にした記念です。 orphan ブランチ作って cherry-pick しまくり、main ブランチを完全に作り直しました。 また、まだ動かないコミットは dev ブランチに移動し、動作するようにさせました!

当時の記事にはmain コミットいじって動かなくなっちゃった!thprって書いてあって腹が立ったので描き直しました。 当時の自分に切れる

自分の敵は自分っちゅーことや