WebAssembly.Module() 构造函数

Baseline 广泛可用 *

此功能已非常成熟,可在多种设备和浏览器版本上使用。自 2017 年 10 月以来,它已在各大浏览器中可用。

* 此特性的某些部分可能存在不同级别的支持。

WebAssembly.Module() 构造函数会创建一个新的 Module 对象,该对象包含已由浏览器编译的无状态 WebAssembly 代码,可以高效地与 Workers 共享,并可以实例化多次。

WebAssembly.Module() 构造函数可以同步编译给定的 WebAssembly 二进制代码。但是,获取 Module 的主要方式是通过异步编译函数,例如WebAssembly.compile()

警告: 由于编译大型模块的开销可能很大,开发者只应在绝对需要同步编译时才使用 Module() 构造函数;其他所有情况都应使用异步的WebAssembly.compileStreaming() 方法。

注意: 具有严格 Content Security Policy (CSP) 的网页可能会阻止 WebAssembly 编译和执行模块。有关允许 WebAssembly 编译和执行的更多信息,请参阅 script-src CSP

语法

js
new WebAssembly.Module(bufferSource)
new WebAssembly.Module(bufferSource, compileOptions)

参数

bufferSource

一个包含您想编译的 Wasm 模块二进制代码的类型化数组ArrayBuffer

compileOptions 可选

一个包含编译选项的对象。属性可以包括:

builtins 可选

一个字符串数组,用于启用在已编译的 Wasm 模块中使用 JavaScript 内置函数。这些字符串定义了您要启用的内置函数。目前唯一可用的值是 "js-string",它启用 JavaScript 字符串内置函数。

importedStringConstants 可选

一个字符串,指定 导入的全局字符串常量 的命名空间。如果您希望在 Wasm 模块中使用导入的全局字符串常量,则需要指定此属性。

异常

  • 如果参数类型或结构不正确,将抛出TypeError
  • 如果编译失败,构造函数将以WebAssembly.CompileError 拒绝。
  • 某些浏览器可能会抛出RangeError,因为它们禁止在 UI 线程上编译和实例化带有大缓冲区的 Wasm。

示例

同步编译 WebAssembly 模块

js
const importObject = {
  my_namespace: {
    imported_func(arg) {
      console.log(arg);
    },
  },
};

function createWasmModule(bytes) {
  return new WebAssembly.Module(bytes);
}

fetch("simple.wasm")
  .then((response) => response.arrayBuffer())
  .then((bytes) => {
    const mod = createWasmModule(bytes);
    WebAssembly.instantiate(mod, importObject).then((result) =>
      result.exports.exported_func(),
    );
  });

启用 JavaScript 内置函数和全局字符串导入

此示例通过 Module() 构造函数编译 Wasm 模块时启用了 JavaScript 字符串内建和导入的全局字符串常量,然后使用instantiate() 进行实例化。然后调用导出的 main() 函数,该函数将 "hello world!" 记录到控制台。在线查看运行效果

js
const importObject = {
  // Regular import
  m: {
    log: console.log,
  },
};

const compileOptions = {
  builtins: ["js-string"], // Enable JavaScript string builtins
  importedStringConstants: "string_constants", // Enable imported global string constants
};

fetch("log-concat.wasm")
  .then((response) => response.arrayBuffer())
  .then((bytes) => {
    const module = new WebAssembly.Module(bytes, compileOptions);
    WebAssembly.instantiate(module, importObject).then((instance) =>
      instance.exports.main(),
    );
  });

规范

规范
WebAssembly JavaScript 接口
# dom-module-module

浏览器兼容性

另见