You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:27:37