Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
WebAssembly を読み込むベストプラクティス 2026年春版 / Best Pract...
Search
petamoriken / 森建
May 07, 2026
Programming
1.2k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
WebAssembly を読み込むベストプラクティス 2026年春版 / Best Practices for Loading WebAssembly (Spring 2026)
fukuoka.ts #4
https://fukuoka-ts.connpass.com/event/387858/
petamoriken / 森建
May 07, 2026
More Decks by petamoriken / 森建
See All by petamoriken / 森建
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
260
Module Harmony
petamoriken
3
1.1k
Denoでフロントエンド開発 2025年春版 / Frontend Development with Deno (Spring 2025)
petamoriken
1
1.6k
非ブラウザランタイムとWeb標準 / Non-Browser Runtimes and Web Standards
petamoriken
0
660
ふかぼれ!CSSセレクターモジュール / Fukabore! CSS Selectors Module
petamoriken
0
340
フロントエンドの標準仕様をどう追っているか / How I follow the frontend standards specs
petamoriken
4
2.8k
ECMAScript、Web標準の型はどう管理されているか / How ECMAScript and Web standards types are maintained
petamoriken
3
670
DOM Observable
petamoriken
1
380
Deno に Web 標準 API を実装する / Implementing Web standards API to Deno
petamoriken
0
840
Other Decks in Programming
See All in Programming
関数型プログラミングのメリットって何だろう?
wanko_it
0
120
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
200
dRuby over BLE
makicamel
2
400
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
350
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
830
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
210
スマートグラスで並列バイブコーディング
hyshu
0
280
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
470
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
320
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.7k
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
190
Featured
See All Featured
A designer walks into a library…
pauljervisheath
211
24k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
410
The Cult of Friendly URLs
andyhume
79
6.9k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
250
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.6k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
880
HDC tutorial
michielstock
2
730
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
2
290
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.6k
Transcript
WebAssembly を読み込む ベストプラクティス 2026 年春版 fukuoka.ts #4 pixiv Inc. 森内建太 @petamoriken 2026.5.7
2 自己紹介 • Web エンジニア • Deno / ECMAScript コントリビューター • フロントエンドカンファレンス福岡スピーカー • Web 標準 を追うのが好き
petamoriken WebDev in Fukuoka
3 https://scrapbox.io/petamoriken/
背景 4
5 • W3C ワーキンググループが策定しているバイトコード • C/C++, Rust, AssemblyScript などからコンパイル ◦ C/C++ は Emscripten を使ってコンパイルする •
ほとんどの JS エンジン上で実行できる ◦ Chrome, Firefox, Safari, Ladybird ◦ Deno, Node.js, Bun, Cloudflare Workers WebAssembly
6 • 洞窟物語 Pixel さんが作った独自音楽形式 “pxtone” を ブラウザでデコード、再生するライブラリ • 10年前に Pixel さんにメールで頼み込んで C++ ソース コードをもらい、Emscripten をつかってコンパイル PxtoneJS
7 • Emscripten の出力サイズがとにかくでかい ◦ Emscripten に依存せずに Wasm 化する方法を模索 👉 Wasm 化できる標準 C++ ライブラリがなさそう • いっそのこと C++ を Rust にポートしよう 👉
挫折 PxtoneJS v3 (2017-02)
8 • 2026-02 Ladybird が LibJS を C++ から Rust へポート ◦ AI Agent を使えば Rust 化できるのでは?
9 • GW に Claude Code を使って Rust にポートできた! ◦ コンパイル後約 60% の容量削減 • ついでにストリーム再生 API を追加 ◦ Web 標準仕様にストリーム再生用の API がなかった ◦
今は WebCodecs の AudioData がいい感じ PxtoneJS v4 (2026-05)
WebAssembly の読み込み 10
11 WebAssembly の読み込み ArrayBuffer WebAssembly.Module WebAssembly.Instance const url = import.meta.resolve("./foo.wasm"); const
response = await fetch(url); const buffer = await response.arrayBuffer(); const module = new WebAssembly.Module(buffer); const instance = new WebAssembly.Instance(module); const { foo } = instance.exports;
12 WebAssembly の読み込み ArrayBuffer WebAssembly.Module WebAssembly.Instance const url = import.meta.resolve("./foo.wasm"); const
response = await fetch(url); const buffer = await response.arrayBuffer(); const module = new WebAssembly.Module(buffer); const instance = new WebAssembly.Instance(module); const { foo } = instance.exports; モジュールの依存に入らない(要バンドラー設定)
13 WebAssembly の読み込み ArrayBuffer WebAssembly.Module WebAssembly.Instance const url = import.meta.resolve("./foo.wasm"); const
response = await fetch(url); const buffer = await response.arrayBuffer(); const module = new WebAssembly.Module(buffer); const instance = new WebAssembly.Instance(module); const { foo } = instance.exports; Top-level await で非同期モジュールが強制される
14 WebAssembly の読み込み ArrayBuffer WebAssembly.Module WebAssembly.Instance const base64 = "AGFzbQEAAAABkAEVYAJ/fwF/YAJ..."; const
{ buffer } = Uint8Array.fromBase64(base64); const module = new WebAssembly.Module(buffer); const instance = new WebAssembly.Instance(module); const { foo } = instance.exports;
15 WebAssembly の読み込み ArrayBuffer WebAssembly.Module WebAssembly.Instance const base64 = "AGFzbQEAAAABkAEVYAJ/fwF/YAJ..."; const
{ buffer } = Uint8Array.fromBase64(base64); const module = new WebAssembly.Module(buffer); const instance = new WebAssembly.Instance(module); const { foo } = instance.exports; Base64 文字列で無理矢理インライン化して解決
16 WebAssembly の読み込み Stage 2.7 Import Bytes (Deno, Node.js, Bun サポート) ArrayBuffer
WebAssembly.Module WebAssembly.Instance import buffer from "./foo.wasm" with { type: "bytes", }; const module = new WebAssembly.Module(buffer); const instance = new WebAssembly.Instance(module); const { foo } = instance.exports;
17 WebAssembly の読み込み Stage 3 Source Phase Imports (Deno, Node.js, Cloudflare
Workers サポート) ArrayBuffer WebAssembly.Module WebAssembly.Instance import source module from "./foo.wasm"; const instance = new WebAssembly.Instance(module); const { foo } = instance.exports;
18 WebAssembly の読み込み Phase 3 ES Module Integration for WebAssembly (Deno,
Node.js サポート) ArrayBuffer WebAssembly.Module WebAssembly.Instance import { foo } from "./foo.wasm";
19 • AI Agent で C/C++ を Rust にポートするのが容易に ◦ ライセンスに注意 • ストリーム再生は WebCodecs の AudioData が便利 • WebAssembly を使ったライブラリを配布する場合、
現状 Base64 文字列でインライン化するのがよさそう ◦ 将来的に解決される予定 まとめ