必须用 fetch() 获取 WASM 字节流再通过 WebAssembly.instantiateStreaming()(推荐,需 MIME 为 application/wasm)或 instantiate() 编译执行;导出函数需从 instance.exports 显式调用,注意内存配置、调试符号与跨域限制。
HTML 中怎么用 fetch() 加载 WASM 模块
不能直接用 <script type="module"></script> 引入 wasm 文件,浏览器不认二进制模块。必须用 fetch() 拿到字节流,再用 webassembly.instantiate() 或 webassembly.instantiatestreaming() 编译执行。
推荐优先用 WebAssembly.instantiateStreaming(),它支持流式编译,边下载边解析,启动更快;但要求服务器返回的 MIME 类型是 application/wasm(不是 application/octet-stream)。
- 如果服务器没配对 MIME,
instantiateStreaming()会静默失败,降级用fetch().then(r => r.arrayBuffer()).then(bytes => WebAssembly.instantiate(bytes, imports)) -
instantiateStreaming()只接受Response对象,不能传ArrayBuffer或文件路径字符串 - 注意跨域:WASM 文件和 JS 必须同源,或服务器开了
Access-Control-Allow-Origin
WASM 模块导出的函数怎么在 JS 里调用
WASM 模块本身没有自动挂载到全局,所有导出(export)都得手动取出来用。常见错误是以为导出函数能像普通 JS 函数一样直接调用,其实它只在 instance.exports 下。
比如 Rust 编译出的 add 函数,在 JS 里得这样用:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
const wasm = await WebAssembly.instantiateStreaming(fetch('math.wasm'));
wasm.instance.exports.add(2, 3); // ✅ 正确
// add(2, 3); // ❌ 报错:add is not defined
- 导出名严格区分大小写,Rust 默认加下划线前缀(如
_add),可加#[no_mangle]和pub extern "C"控制 - WASM 只支持整数(
i32/i64)和浮点数(f32/f64)参数,字符串需通过线性内存传指针+长度 - 多次调用同一导出函数没问题,但别反复
instantiate—— 编译开销大,应复用instance
为什么加了 WASM 还是卡?内存没配好
WASM 没有自动垃圾回收,所有内存操作都在一块线性内存(WebAssembly.Memory)里。JS 和 WASM 共享这块内存,但 JS 不知道 WASM 里哪段内存正被使用——配小了运行时报 RangeError: memory access out of bounds,配大了又浪费、触发 GC 延迟。
- 默认
initial=65536(即 1 页 = 64KB),多数小工具够用;图像/音频处理类至少设initial=256(16MB) - 加
maximum限制上限(如maximum=1024),防 OOM;不设的话 V8 会动态增长,但可能触发频繁重分配 - 用
WebAssembly.Memory({ initial: 256, maximum: 1024 })创建后,传给imports的env.memory,否则 WASM 代码读不到
Chrome 调试 WASM 时看不到源码?需要 .dwarf 或 .map
WASM 本身是二进制,调试靠外部符号表。没生成调试信息的话,DevTools 里只能看到 wasm-function[123],没法断点到原生函数名或行号。
- Rust 加
rustflags = ["-C", "debuginfo=2"](cargo.toml)生成 DWARF;编译后用wabt工具提取成.wasm.map - Emscripten 默认带
-g,输出.wasm+.wasm.map,确保 HTML 里加载的 WASM URL 和 map 文件同路径 - Chrome 需开启
Settings → Preferences → Advanced → Enable WebAssembly Debugging才识别 map
线性内存布局、符号表缺失、MIME 错误——这三个地方一错,WASM 就从“提升性能”变成“增加加载失败率”。真要压测,别只看首屏时间,抓 network 面板里 math.wasm 的 size 和 finish 时间更实在。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










