如何使用wasm-bindgen从Nodejs WebAssembly中的Rust函数返回字符串



我是Rust和WASM的新手,正在努力运行第一个程序。

[dependencies]
wasm-bindgen = { version = "0.2.63" }

我有下面的Rust,它编译成WASM

use wasm_bindgen::prelude::*;
// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global
// allocator.
#[cfg(feature = "wee_alloc")]
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
#[wasm_bindgen]
pub fn greet(name: &str) -> String {
// let val = ["Hello", name].join(" ");
let val = format!("Hello {}", name);
return val;
}

我的节点代码(灵感来自https://nodejs.dev/learn/nodejs-with-webassembly),

const fs = require("fs");
const wasmBuffer = fs.readFileSync("../pkg/hello_world_bg.wasm");
WebAssembly.instantiate(wasmBuffer)
.then((wasmModule) => {
// Exported function live under instance.exports
const greet = wasmModule.instance.exports.greet;
console.log(typeof greet);
const greeting = greet("Simon");
console.log("x", greeting);
})
.catch((err) => console.log(err));

此日志记录

function
x undefined

我尝试了两种连接字符串的方法,或者我可能对返回值做了错误的处理?

当在没有更多样板的节点中使用WebInstantiate时,就像您所做的那样,我得到了相同的结果(undefined(。在浏览器中无缝工作的东西在节点中却不能很好地工作。

但当我专门用构建节点模块时,字符串交换工作正常

wasm-pack build --target nodejs

对于节点模块,使用也简单得多:

const wasmModule = require("./pkg/hello_world.js");
const greet = wasmModule.greet;
const greeting = greet("Simon");
console.log('greeting:', greeting);

相关内容

  • 没有找到相关文章

最新更新