1. JS 与 WASM 互操作(WebAssembly.instantiate/instantiateStreaming、导入导出)
JS 与 WASM 之间如何实现互操作?WebAssembly.instantiate 与 instantiateStreaming 有何区别,导入导出机制是怎样的?
- instantiate 与 instantiateStreaming 的差异及流式编译原理
- 模块导入(imports)与导出(exports)的 JS 侧映射
- 内存、函数、全局变量等导出对象的调用方式
JS 与 WASM 的互操作通过 WebAssembly 命名空间下的 API 完成。WebAssembly.instantiate 接收 ArrayBuffer 字节码与 imports 对象,返回包含 module 与 instance 的结果;而 instantiateStreaming 直接接收 fetch 的 Response,在流式下载的同时进行模块解析与编译,显著减少从网络获取大型模块时的等待时间(需服务端提供 application/wasm MIME 类型)。实例化时通过 imports 把 JS 函数、内存、表等注入 WASM 模块(对应模块的 import 段),实例化后通过 instance.exports 调用 WASM 导出的函数、访问导出的内存(WebAssembly.Memory)与全局变量(WebAssembly.Global)。函数调用本质上走 C ABI 约定,JS 数值会转换为 WASM 的 i32/f32/f64 等标量类型,i64 需借助 BigInt 传递。
本题考察 WASM 互操作的基础闭环:编译(instantiate/instantiateStreaming)→ 实例化(imports 注入)→ 调用(exports 调用)。重点在于区分两种实例化 API 的编译时机差异(流式 vs 一次性)以及导入导出方向的对应关系,理解内存与函数的传递边界。