乐闻世界logo
搜索文章和话题

如何在 WASM ( Rust )中导入 WASM 模块并传递 String 参数

4 个月前提问
3 个月前修改
浏览次数34

1个答案

1

在 Rust 中编写 WebAssembly (WASM) 时,你可能希望从一个 WASM 模块中导入另一个 WASM 模块的功能。这可以通过定义一个外部模块并将其连接到你的 Rust 代码中来实现。这同样适用于传递 String 参数。下面是一个基本的指导,如何在 Rust 中编写 WebAssembly 代码,并演示如何导入外部模块和传递 String 参数。

第一步 - 创建一个 Rust 库

首先,创建一个新的 Rust 库来编译成 WebAssembly。

sh
cargo new --lib wasm_module cd wasm_module

第二步 - 添加 wasm-bindgen 依赖

在你的 Cargo.toml 文件中,添加 wasm-bindgen 依赖项,它是一个库,可以让你和 JavaScript 交互。

toml
[lib] crate-type = ["cdylib"] [dependencies] wasm-bindgen = "0.2" [features] default = ["console_error_panic_hook"]

第三步 - 编写 Rust 代码

在你的 lib.rs 文件中,使用 wasm-bindgen 导出函数和导入外部函数。

rust
use wasm_bindgen::prelude::*; // 导入外部模块,这里的 "external_module" 是模块名,"greet" 是函数名 #[wasm_bindgen(module = "/path/to/external_module.js")] extern "C" { fn greet(name: &str); } // 导出用于 WebAssembly 的函数,接受一个 String 参数 #[wasm_bindgen] pub fn say_hello(name: String) { // 调用外部模块的函数 greet(&name); }

第四步 - 编译到 WebAssembly

使用 wasm-pack 来编译你的 Rust 库到 WebAssembly。

sh
wasm-pack build --target web

第五步 - JavaScript

在 JavaScript 中,你需要加载编译好的 WASM 模块,并定义导入的模块和函数。

javascript
import init, { say_hello } from './pkg/wasm_module.js'; async function loadWasm() { // 初始化 WASM 模块 await init(); // 调用 WASM 中的函数 say_hello("World"); } // 定义外部模块的函数 function greet(name) { console.log(`Hello, ${name}!`); } loadWasm();

在这个例子中,/path/to/external_module.js 应该被替换成你外部模块 JS 文件的实际路径。请确保在 greet 函数中使用的字符串参数与 Rust 函数中的类型相匹配。

确保你已经安装了 wasm-pack 工具和 wasm-bindgen 库,并且你的 Rust 项目结构正确无误。一旦你编译并运行了你的 WASM 代码,say_hello 函数就会被 JavaScript 调用,并将字符串参数传递给内部的 Rust 函数。然后 Rust 函数会将这个字符串参数传递给导入的 greet 函数。

请注意,这些代码片段是一个简化的例子,你可能需要根据你的项目需求对其进行调整。特别是当涉及到在不同环境下(如 Node.js 或不同的 Web 浏览器)加载和运行你的 WebAssembly 代码时。

2024年6月29日 12:07 回复

你的答案