1.生成wasm文件
javascript
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");
})();
2.JavaScript 调用wasm文件
javascript
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();
3.wasm调用JavaScript
在实例化传入importObject
javascript
const fs = require("fs");
const wabt = require("wabt"); // 确保已安装:npm install wabt
// 完整的异步执行函数
async function runWasm() {
// 1. 初始化 wabt(关键:2.x+ 版本返回的是对象,需解构出 parseWat)
const { parseWat } = await wabt();
// 2. 定义 WAT 文本(WebAssembly 文本格式)
const wat = `
(module
;; 导入 env.log 函数(接收 i32 参数)
(import "env" "log" (func $log (param i32)))
;; 导出 run 函数(供 JS 调用)
(func (export "run")
i32.const 42 ;; 压入常量 42 到栈
call $log ;; 调用导入的 log 函数
)
)
`;
// 3. 转换 WAT -> 二进制 WASM(修复核心:用解构出的 parseWat 函数)
const parsed = parseWat("module.wat", wat, {
// 可选配置:启用 WebAssembly 标准特性
exceptions: false,
mutable_globals: true,
sat_float_to_int: true,
sign_extension: true,
});
// 4. 生成 WASM 二进制文件
const { buffer } = parsed.toBinary({});
fs.writeFileSync("module.wasm", Buffer.from(buffer));
console.log("✅ module.wasm 已生成");
// 5. 定义导入对象(给 WASM 提供 JS 环境的函数)
const importObject = {
env: {
log: (num) => console.log("WASM 调用 log 函数:", num),
},
};
// 6. 读取 WASM 二进制并实例化
const wasmBytes = fs.readFileSync("module.wasm");
const { instance } = await WebAssembly.instantiate(wasmBytes, importObject);
// 7. 调用 WASM 导出的 run 函数
instance.exports.run(); // 输出:WASM 调用 log 函数: 42
}
// 执行函数并捕获错误
runWasm().catch((err) => {
console.error("执行失败:", err);
});