Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Vite + Rust で Wasm を ES Modulesとして使う
Search
hacusk
October 18, 2026
Programming
20
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Vite + Rust で Wasm を ES Modulesとして使う
千歳ゆるい勉強会vol.8にて発表した内容です
hacusk
October 18, 2026
More Decks by hacusk
See All by hacusk
解剖"React Native"
hacusk
0
210
DuckDB-Wasmを使って ブラウザ上でRDBMSを動かす
hacusk
1
620
バックエンドの技術をブラウザで動かす技術
hacusk
0
130
形なしからの脱却
hacusk
0
40
Other Decks in Programming
See All in Programming
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
260
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
150
Jetpack Compose Mechanisms
skydoves
3
810
contenteditable と日本語入力に向き合う
colorful12
0
200
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.2k
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
180
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
1
410
R8 の設定見直しでアプリサイズ削減
andpad
0
220
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
350
ChromeでローカルLLM
ryu1013
0
140
Featured
See All Featured
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.2k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Heart Work Chapter 1 - Part 1
lfama
PRO
10
37k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
260
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
410
Being A Developer After 40
akosma
92
590k
Thoughts on Productivity
jonyablonski
76
5.4k
RailsConf 2023
tenderlove
30
1.6k
Building an army of robots
kneath
307
47k
Faster Mobile Websites
deanohume
310
32k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
520
Transcript
Vite + Rust で Wasm を ES Modulesとして 使う import
{ add } from './main.wasm' HakataYusuke(@hacusk) 千歳ゆるい勉強会 vol.8 2026.10.18(Sun.) @公立千歳科学技術大学 1
$ whoami Name: はくすけ(@hacusk) / HakataYusuke Job: 株式会社モニクル SWE Language:TypeScript,
Go, PHP… FavoriteTech: MultiPlatformなもの, OSS, ネ ットワーク Love: 声優, 旅行, ライブ, アイドル, 車, モータ ースポーツ, ガジェット, 飛行機, 麻雀 Community: 函館本線沿線勉強会, フロントエ ンドカンファレンス北海道実行委員会, OSC北 海道実行委員会, 一般社団法人LOCAL Website: https://hacusk.net/ 2
WebAssembly(Wasm)ってなに? 普通のコンパイル C / Rust / Go → その CPU
向けの機械語 x86 用バイナリは ARM では動かない OS・アーキテクチャに依存する Wasm → 仮想マシン向けのバイナリ ブラウザ(や WASI)が実行してくれる 一度作れば、環境が違っても同じファイル が動く JVM(Java のバイトコード)に近い発想。 違いは、最初から Web ブラウザで速く・安全に動かすことを狙って設計されている点(W3C 標準)。 3
なにがうれしいの? JavaScript 以外の言語(Rust, Go, C/C++ …)のコードをブラウザで動かせる ネイティブに近い速さで計算できる(画像処理・圧縮・数値計算など) 主要ブラウザすべてで動く 4
Wasm をブラウザで使う従来の方法 const res = await fetch('./add.wasm') const { instance
} = await WebAssembly.instantiateStreaming(res) const add = instance.exports.add 手動でフェッチ・インスタンス化が必要 普通の JS インポートとまったく異なる体験 5
Vite の Wasm サポート — 2 段階 アプローチ 構文 特徴
?init import init from './add.wasm?init' init 関数を呼び、exports を取り出す ESM 統合 import { add } from './add.wasm' 通常の named import と同じ ESM 統合は WebAssembly/ES Module Integration 提案 に準拠 Vite 8.1〜 コアでサポート(追加プラグイン不要) 6
言語の選択 — TinyGo vs Rust TinyGo Rust ( wasm32-unknown-unknown )
500 B 不要 ゼロ Wasm サイズ 21 KB JS ランタイム wasm_exec.js 必須 Wasm imports go.* 多数 ?init 呼び出し await init(go.importObject) await init() Rust はランタイムを含まない 純粋な Wasm を出力 → ESM 統合と相性が良い 7
Rust 側のコード // wasm/src/lib.rs #[unsafe(no_mangle)] // edition 2024 では unsafe
が必要 pub fn add(a: i32, b: i32) -> i32 { a + b } #[unsafe(no_mangle)] pub fn fibonacci(n: u32) -> u64 { /* ... */ } // → JS では BigInt # Cargo.toml [lib] crate-type = ["cdylib"] # C 互換の動的ライブラリとして出力 8
Vue コンポーネントでの使用 <script setup lang="ts"> import { add, fibonacci }
from '../assets/main.wasm' // 非同期モジュール — 親で <Suspense> が必要 </script> <template> <output>{{ add(3, 4) }}</output> </template> 普通の JS モジュールと 完全に同じ感覚 でインポートできる 9
デモ 10
ハマりどころ(Vite 8.1+) 型は手書き .d.wasm.ts + allowArbitraryExtensions // main.d.wasm.ts export declare
function add(a: number, b: number): number 出典: Vite — ESM 統合 / TSConfig — allowArbitraryExtensions 非同期モジュール は TLA 相当の async module → Vue では親に <Suspense> .wasm <Suspense> <WasmDemo /> </Suspense> 出典: Vite — ESM 統合 11
まとめ Rust (edition 2024) └─ cargo wasm └─ main.wasm (500B、imports
ゼロ) └─ Vite 8.1+(コアの ESM 統合) └─ import { add } from './main.wasm' └─ Vue コンポーネントで直接呼び出し Rust × wasm32-unknown-unknown が ESM 統合に最も相性が良い Vite 8.1〜 は import { add } from './x.wasm' が標準サポート 型は .d.wasm.ts + allowArbitraryExtensions で解決 コード: https://github.com/hacusk/vite-wasm-esm-integration-example 12
告知 13
Sapporo.sre #1 2026.11.19(Thu.) @北海道ガス株式会社 本社ビル(札幌市) https://sapporo-sre.connpass.com/event/401691/ 14
TechRAMEN 2026 Conference 2026.11.20(Fri.)〜21(Sat.) @コンシェルジュ フラノ https://techramenconf.net/2026/ 15
LOCAL Developer Day '26 in EBETSU 2026.12.19(Sat.) @北海道情報大学 eDCタワー 10F(江別市)
https://www.local.or.jp/2026/09/10111.html 16