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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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 / 森建
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
170
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
270
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
670
ふかぼれ!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
Other Decks in Programming
See All in Programming
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
自作OSでスライド発表する
uyuki234
1
3.9k
共通化で考えるべきは、実装より公開する型だった
codeegg
0
280
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
110
AIエージェントで 変わるAndroid開発環境
takahirom
2
720
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
360
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
240
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
380
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.8k
FDEが実現するAI駆動経営の現在地
gonta
2
220
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
190
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.2k
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
96
14k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
470
Music & Morning Musume
bryan
47
7.3k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
350
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
770
The agentic SEO stack - context over prompts
schlessera
0
850
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
320
The SEO Collaboration Effect
kristinabergwall1
1
510
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
180
How to build a perfect <img>
jonoalderson
1
5.8k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
45k
The Spectacular Lies of Maps
axbom
PRO
1
870
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 文字列でインライン化するのがよさそう ◦ 将来的に解決される予定 まとめ