在 Rust 中编写 WebAssembly (WASM) 时,你可能希望从一个 WASM 模块中导入另一个 WASM 模块的功能。这可以通过定义一个外部模块并将其连接到你的 Rust 代码中来实现。这同样适用于传递 String
参数。下面是一个基本的指导,如何在 Rust 中编写 WebAssembly 代码,并演示如何导入外部模块和传递 String
参数。
第一步 - 创建一个 Rust 库
首先,创建一个新的 Rust 库来编译成 WebAssembly。
shcargo 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
导出函数和导入外部函数。
rustuse 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。
shwasm-pack build --target web
第五步 - JavaScript
在 JavaScript 中,你需要加载编译好的 WASM 模块,并定义导入的模块和函数。
javascriptimport 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 代码时。