WebAssembly模块通过instantiateStreaming(推荐)或instantiate加载,导出函数经instance.exports调用,字符串需借内存手动编解码;共享memory实现高效数据交换,导入对象须严格匹配签名。

WebAssembly(Wasm)模块可以在 JavaScript 中高效加载和调用,核心是通过 WebAssembly.instantiate() 或 WebAssembly.instantiateStreaming() 获取编译后的模块实例,再通过其导出的函数、内存或全局变量与 JS 交互。
加载 Wasm 模块的两种常用方式
推荐优先使用流式加载,性能更好且支持浏览器原生缓存:
-
流式加载(推荐):适用于从
.wasm文件直接加载,浏览器可边下载边编译const { instance } = await WebAssembly.instantiateStreaming(fetch('module.wasm')); -
字节数组加载:适合动态生成或从 ArrayBuffer、Uint8Array 构建的 Wasm
const bytes = await fetch('module.wasm').then(r => r.arrayBuffer());<br>const { instance } = await WebAssembly.instantiate(bytes);
调用导出的函数
Wasm 模块通过 instance.exports 暴露函数、内存等资源。导出函数默认接收和返回基本类型(i32/i64/f32/f64),不能直接传字符串或对象:
- 直接调用:
instance.exports.add(10, 20)→ 返回数值结果 - 若需处理字符串,通常需配合导出的内存(
instance.exports.memory)手动读写线性内存,例如将 JS 字符串编码为 UTF-8 写入内存,再传入内存偏移量给 Wasm 函数 - 导出函数中若含回调,需通过 JS 提供的函数引用(使用
WebAssembly.Table或 indirect call)并确保正确签名匹配
共享内存与数据传递
Wasm 与 JS 共享同一块线性内存(由 WebAssembly.Memory 实例管理),这是高效交换大量数据的关键:
立即学习“Java免费学习笔记(深入)”;
- 获取内存视图:
const memory = instance.exports.memory;<br>const view = new Uint8Array(memory.buffer);
- 向内存写入数据(如图像像素、数组)后,将起始地址(offset)传给 Wasm 函数处理
- 注意内存增长:若 Wasm 模块声明了可增长内存(如
memory: { initial: 10, maximum: 100 }),JS 可调用memory.grow(n)扩容,失败时返回 -1
处理导入对象(Import Object)
当 Wasm 模块依赖外部 JS 函数(如日志、随机数、I/O)时,需在实例化时提供导入对象:
- 结构需严格匹配模块的 import section,包括模块名、字段名和函数签名
- 示例导入:
{ env: { abort: () => { throw new Error('Wasm abort'); } } } - 导入的 JS 函数中若需访问闭包或 this,应提前绑定或用箭头函数包裹,避免运行时上下文丢失


















