Loading... # WebAssembly (WASM) 与 JavaScript ## 1. 什么是 WASM * **WebAssembly (WASM)** 是一种二进制格式,可以在浏览器或 Node.js 中运行。 * 主要特点: * **高性能** :接近原生 C/C++/Rust 速度。 * **跨语言** :可以由多种语言编译而来。 * **和 JS 配合** :JS 调用 WASM 导出的函数,WASM 也能调用 JS 提供的函数。 ## 2. 整体流程 ### (1) 编写代码(C、C++、Rust、Go 、JS等) 生成wasm文件 ```js const fs = require("fs"); const wabt = require("wabt")(); // 注意 () 表示初始化 (async () => { const wabtModule = await wabt; const wat = ` (module (func (export "add") (param i32 i32) (result i32) local.get 0 local.get 1 i32.add)) `; // 把 WAT 转换成二进制 WASM const parsed = wabtModule.parseWat("add.wat", wat); const { buffer } = parsed.toBinary({}); fs.writeFileSync("add.wasm", Buffer.from(buffer)); console.log("✅ 已生成 add.wasm"); })(); ``` ## 3. JavaScript 调用 WASM 加载并调用 `<span leaf="">add.wasm</span>` ```js const fs = require("fs"); async function init() { // 1. 读取 .wasm 文件 const bytes = fs.readFileSync("add.wasm"); // 2. 编译并实例化 const { instance } = await WebAssembly.instantiate(bytes); // 3. 调用导出的函数 console.log("2 + 3 =", instance.exports.add(2, 3)); } init(); ``` ## 4. WASM 调用 JS 在实例化时传入 **importObject** ```js const fs = require("fs"); const wabt = require("wabt")(); // npm install wabt (async () => { // 1. 初始化 wabt const wabtModule = await wabt; // 2. 写一个简单的 WAT(文本格式 wasm) const wat = ` (module (import "env" "log" (func $log (param i32))) (func (export "run") i32.const 42 call $log ) ) `; // 3. 转换 WAT -> 二进制 wasm const parsed = wabtModule.parseWat("module.wat", wat); const { buffer } = parsed.toBinary({}); fs.writeFileSync("module.wasm", Buffer.from(buffer)); console.log("✅ module.wasm 已生成"); // 4. 准备 importObject const importObject = { env: { log: (num) => console.log("WASM says:", num) } }; // 5. 读取 wasm 文件并实例化 const bytes = fs.readFileSync("module.wasm"); const { instance } = await WebAssembly.instantiate(bytes, importObject); // 6. 调用 wasm 导出的 run 函数 instance.exports.run(); // 会输出 "WASM says: 42" })(); ``` ## 5. 使用场景 * 图像/视频编解码 * 游戏引擎 (Unity/Unreal Web 导出) * 压缩/加密算法 * AI 推理 (TensorFlow.js WASM backend) 最后修改:2025 年 10 月 27 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏