WebAssembly.instantiate()
是编译和实例化 WebAssembly 代码的主要方法,
这个方法有两个重载方式:
(1)第一种重载使用WebAssembly二进制代码的 typed array 或 ArrayBuffer 形式进行编译和实例化。
返回的 Promise 会携带已编译的 WebAssembly.Module 和它的第一个实例化对象 WebAssembly.Instance。
(2)第二种重载使用已编译的 WebAssembly.Module , 返回的 Promise 携带一个 Module的实例化对象 Instance. 如果这个 Module 已经被编译了或者是从缓存中获取的,那么这种重载方式是非常有用的。
1. 使用二进制bufferSource实例化
用法,
Promise WebAssembly.instantiate(bufferSource [,importObject]);
参数解释,
(1)bufferSource
一个包含你想编译的wasm模块二进制代码的 typed array(类型数组)或 ArrayBuffer(数组缓冲区)。
(2)importObject 可选
一个将被导入到新创建实例中的对象,它包含的值有,函数、WebAssembly.Memory 对象等等。
返回值解释,
ResultObject包含两个属性,Promise
是一个Promise,
(1)module
,一个被编译好的 WebAssembly.Module 对象
(2)instance
,一个包含所有 Exported WebAssembly functions 的 WebAssembly.Instance 对象。
异常,
(1)如果参数的类型或结构不正确,将会抛出异常 TypeError。
(2)如果操作失败,promise 将会被 reject 掉,根据失败的原因不同,会抛出3种异常,
WebAssembly.CompileError,WebAssembly.LinkError, 或WebAssembly.RuntimeError。
2. 使用已编译的module实例化
用法,
Promise WebAssembly.instantiate(module [,importObject]);
参数解释,
(1)module,
将被实例化的 WebAssembly.Module 对象。
(2)importObject 可选,同bufferSource用法
返回值解释,
一个解析为 WebAssembly.Instance 的Promise 对象。
异常,
同bufferSource用法
3. 例子
const importObject = {
imports: {
imported_func(arg) {
console.log(arg);
}
}
};
async function f(){
const response = await fetch('simple.wasm');
const bufferSource = await response.arrayBuffer();
const result = await WebAssembly.instantiate(bufferSource, importObject);
const {instance:{exports:exported_func}} = result;
exported_func();
}
f();
注:
(1)fetch会返回一个Promise,其中包含了Response对象,
而Response继承了Body,可以调用Body.arrayBuffer()方法,
会将Response转换为一个包含ArrayBuffer的Promise。
(2)WebAssembly.Instance
对象的exports
属性是只读的,它是属性值是一个对象,
包含了所有WebAssembly模块中导出的方法(Exported WebAssembly functions),这些方法被JavaScript包装好了,自动做了一个参数转换,例如把JavaScript中的number
转换为Int32
。
除了Instance.exports之外,还可以使用Table.prototype.get()来获取这些方法。
参考
MDN: WebAssembly.instantiate()
MDN: Fetch API
MDN: Response
MDN: Body
MDN: Body.arrayBuffer()
MDN: WebAssembly.Instance.prototype.exports
MDN: Exported WebAssembly functions