如何在WasmEdge-QuickJS中消费Rust编写的同构Wasm库?
在WasmEdge-QuickJS中消费Rust Wasm库的解决方案
方案一:直接编译为WASI模块(最简方式)
1. 修改Rust代码
去掉wasm-bindgen依赖,直接导出C兼容的函数(WasmEdge可直接调用Wasm导出函数):
#[no_mangle] pub extern "C" fn add(left: usize, right: usize) -> usize { left + right }
2. 编译为WASI兼容Wasm
执行编译命令生成适配WasmEdge的模块:
cargo build --target wasm32-wasi --release
编译产物位于target/wasm32-wasi/release/[你的库名].wasm。
3. 在WasmEdge-QuickJS中调用
创建JS文件(如run.js),用WasmEdge内置API加载模块:
// 加载Wasm模块 const wasmMod = WasmEdge.load('./target/wasm32-wasi/release/your_lib.wasm'); // 获取导出函数并调用 const add = wasmMod.exports.add; console.log(add(1, 2)); // 输出3
运行命令:
wasmedge run.js
方案二:保留wasm-bindgen实现同构兼容(浏览器+WasmEdge)
如果需要同时支持浏览器和WasmEdge,可通过条件编译和环境判断实现:
1. 调整Rust代码
保留wasm-bindgen,同时添加WASI兼容的导出:
#[cfg(target_arch = "wasm32")] use wasm_bindgen::prelude::*; // 浏览器环境用wasm-bindgen导出,WASI环境直接导出C函数 #[cfg_attr(target_arch = "wasm32", wasm_bindgen)] #[no_mangle] pub extern "C" fn add(left: usize, right: usize) -> usize { left + right }
2. 分环境编译
- 浏览器环境:继续使用
wasm-pack build --target web生成胶水代码,按原有方式调用; - WasmEdge环境:用
cargo build --target wasm32-wasi --release生成WASI模块。
3. 同构JS调用代码
在JS中判断运行环境,分别处理:
let add; // WasmEdge环境判断 if (typeof WasmEdge !== 'undefined') { const wasmMod = WasmEdge.load('./target/wasm32-wasi/release/your_lib.wasm'); add = wasmMod.exports.add; console.log(add(1, 2)); } else { // 浏览器环境 import init, { add as wasmAdd } from "/rs_lib.js"; init().then(() => { add = wasmAdd; console.log(add(1, 2)); }); }
原错误原因
你遇到的问题本质是环境不兼容:
wasm-pack针对Node.js/浏览器生成的胶水代码,依赖WebAssembly全局对象和Node模块系统,但WasmEdge-QuickJS不提供这些;- WasmEdge是基于WASI标准的Runtime,仅支持符合WASI规范的Wasm模块,而非浏览器/Node适配的模块。
内容的提问来源于stack exchange,提问作者Devildude4427
相关产品推荐
相关产品推荐

