Vue × WASM × Rust—試行錯誤とこれからの展望
最近、VueやNuxt、Nuxt UIを触れていて、「色々作れそうだな」と思うことが増えてきました。
一方で、JSの型システムがガバガバすぎて、Rustが恋しくなってきました。
そこで、WASMの存在を思い出し、Rustの強みを活かせる仕組みを急遽作ることにしました。
experiments-wasm-vue について
warning
本リポジトリは現在修復作業中です... なぜmainに手を加えたしとか、絶対に言っちゃダメですからね?
このリポジトリでは、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
いつも通りめっちゃわかりやすい