Node.js 与 WebAssembly
WebAssembly 是一种高性能的类汇编语言,可以由多种语言编译而成,包括 C/C++、Rust 和 AssemblyScript。目前,它已被 Chrome、Firefox、Safari、Edge 和 Node.js 支持!
WebAssembly 规范详细说明了两种文件格式:一种是扩展名为 .wasm 的二进制格式,称为 WebAssembly 模块;另一种是相应的文本表示形式,称为 WebAssembly 文本格式,扩展名为 .wat。
核心概念
- 模块(Module)- 一个已编译的 WebAssembly 二进制文件,即
.wasm文件。 - 内存(Memory)- 一个可调整大小的 ArrayBuffer。
- 表(Table)- 一个可调整大小的类型化数组,其中包含未存储在内存中的引用。
- 实例(Instance)- 模块的实例化,包含其内存、表和变量。
为了使用 WebAssembly,你需要一个 .wasm 二进制文件和一组用于与 WebAssembly 通信的 API。Node.js 通过全局 WebAssembly 对象提供了必要的 API。
.(WebAssembly);
/*
Object [WebAssembly] {
compile: [Function: compile],
validate: [Function: validate],
instantiate: [Function: instantiate]
}
*/
生成 WebAssembly 模块
有多种方法可用于生成 WebAssembly 二进制文件,包括:
- 手写 WebAssembly (
.wat) 并使用 wabt 等工具将其转换为二进制格式 - 将 emscripten 用于 C/C++ 应用程序
- 将 wasm-pack 用于 Rust 应用程序
- 如果你更喜欢类似 TypeScript 的体验,可以使用 AssemblyScript
其中一些工具不仅生成二进制文件,还生成用于在浏览器中运行的 JavaScript “粘合”代码和相应的 HTML 文件。
如何使用
一旦有了 WebAssembly 模块,就可以使用 Node.js 的 WebAssembly 对象来实例化它。
// Assume add.wasm file exists that contains a single function adding 2 provided arguments
const = ('node:fs');
// Use the readFileSync function to read the contents of the "add.wasm" file
const = .('/path/to/add.wasm');
// Use the WebAssembly.instantiate method to instantiate the WebAssembly module
WebAssembly.().( => {
// Exported function lives under instance.exports object
const { } = ..;
const = (5, 6);
.(); // Outputs: 11
});
与操作系统交互
WebAssembly 模块本身无法直接访问操作系统的功能。可以使用第三方工具 Wasmtime 来访问此功能。Wasmtime 利用 WASI API 来访问操作系统功能。