[wasm] WebAssembly.instantiate

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

你可能感兴趣的:([wasm] WebAssembly.instantiate)