WebAssembly.Instance() 构造函数
>WebAssembly.Instance() 构造函数创建一个新的 Instance 对象,该对象是 WebAssembly.Module 的有状态、可执行的实例。
警告:因为实例化大模块的开销很大,当一定要使用同步实例化时,开发者才应该使用 Instance;在所有其他情况下使用异步的 WebAssembly.instantiateStreaming() 方法。
语法
js
new WebAssembly.Instance(module, importObject)
参数
module-
要实例化的
WebAssembly.Module对象。 importObject可选-
一个对象,包含的是被导入到新创建的
Instance的值,例如:函数或WebAssembly.Memory对象。module中每一个申明的导入必须有一个匹配的属性,否则会抛出WebAssembly.LinkError。
异常
- 如果参数的类型或者结构不正确,则抛出
TypeError。 - 如果操作失败,则抛出
WebAssembly.CompileError、WebAssembly.LinkError、WebAssembly.RuntimeError其中的一个,具体取决于失败的原因。 - 一些浏览器可能会抛出
RangeError,因为它们禁止在 UI 线程上的大缓冲区上进行 Wasm 的编译和初始化。
示例
>同步实例化 WebAssembly 模块
可以调用 WebAssembly.Instance() 构造函数同步地实例化一个指定的 WebAssembly.Module 对象,例如:
js
const importObject = {
my_namespace: {
imported_func(arg) {
console.log(arg);
},
},
};
fetch("simple.wasm")
.then((response) => response.arrayBuffer())
.then((bytes) => {
const mod = new WebAssembly.Module(bytes);
const instance = new WebAssembly.Instance(mod, importObject);
instance.exports.exported_func();
});
然而,获得一个 Instance 的首选方式是使用异步的 WebAssembly.instantiateStreaming() 函数,例如像这样:
js
const importObject = {
my_namespace: {
imported_func(arg) {
console.log(arg);
},
},
};
WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then(
(obj) => obj.instance.exports.exported_func(),
);
规范
| 规范 |
|---|
| WebAssembly JavaScript Interface> # dom-instance-instance> |