使用wasm-bindgen在Node.js WebAssembly中如何从Rust函数返回字符串?
问题根因
你直接加载裸WASM文件调用带字符串参数/返回值的函数的方式是错误的:
- WASM本身原生仅支持数字类型的入参和返回值,字符串这种复杂类型需要
wasm-bindgen生成的JS胶水层做JS运行时和WASM线性内存之间的读写转换,你跳过胶水层直接调用原生导出的greet,传入的JS字符串无法被WASM识别,自然拿不到正确的返回值。 - 你参考的教程是针对无依赖、仅用基础数字类型的最简WASM用例,不适用引入了
wasm-bindgen的Rust WASM项目。
正确解决方法
第一步:确认编译命令正确
用wasm-pack编译时指定target为nodejs:
wasm-pack build --target nodejs
编译完成后pkg目录下会自动生成对应JS胶水文件,无需你手动读取WASM文件做实例化。
第二步:修改Node.js代码
直接导入胶水文件暴露的接口即可:
const { greet } = require("../pkg/hello_world"); const greeting = greet("Simon"); console.log("x", greeting);
运行后即可正常输出x Hello Simon。
补充说明(可选)
如果你一定要手动实例化WASM,需要额外处理内存逻辑:
原生导出的greet实际入参是2个i32类型数字,分别为字符串在WASM线性内存中的指针、字符串长度,返回值也是指向WASM堆上字符串的i32指针。你需要手动把JS字符串编码为Uint8Array,调用WASM的内存分配接口写入对应内存地址,调用函数后再从返回的指针位置读取内存解码为JS字符串,最后还要手动释放对应内存,流程非常繁琐,日常开发直接用wasm-bindgen生成的胶水层即可。
内容的提问来源于stack exchange,提问作者Simon H
相关产品推荐
相关产品推荐

