这是#[wasm_bindgen]
的"Hello, world!"示例,展示如何设置项目,
将函数导出到JS,从JS调用并在Rust中调用警报功能。
1. 创建项目
cargo new hello-world --lib
cd hello-world
2. 添加依赖
cargo add wasm-bindgen
3. Cargo.toml
Cargo.toml
列出了 wasm-bindgen
crate 作为一个依赖项。
值得注意的是,crate-type = ["cdylib"]
,这在当今主要用于 wasm 最终工件。
[package]
name = "hello-world"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[dependencies]
wasm-bindgen = "0.2.92"
备注
[lib]
部分指定了库的类型为 cdylib
,这意味着它将被编译为共享库,
适合与其他语言(如 JavaScript)进行交互,特别是在 WebAssembly 的上下文中。
在 Rust 的 Cargo.toml
文件中,crate-type
可以指定以下几种类型:
lib
: 默认类型,生成一个库文件(.rlib
),用于其他 Rust 代码的依赖。cdylib
: 生成一个动态库,适合与其他语言(如 C、JavaScript)进行交互,通常用于 WebAssembly 项目。rlib
: 生成一个 Rust 静态库,供其他 Rust crate 使用。dylib
: 生成一个动态库,主要用于 Rust 生态内部的共享。staticlib
: 生成一个静态库,通常用于与 C/C++ 代码的交互。
你可以根据项目的需求选择合适的 crate-type
4. 编写src/lib.rs
src/lib.rs
文件包含了一个简单的函数,该函数使用 #[wasm_bindgen]
属性导出到 JavaScript。
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern "C" {
fn alert(s: &str);
}
#[wasm_bindgen]
pub fn greet(name: &str) {
alert(&format!("Hello, {}!", name));
}
上述代码中,greet
函数使用 #[wasm_bindgen]
属性导出到 JavaScript。
alert
函数是一个外部函数,它在 JavaScript 中实现。使用 extern "C"
来声明它,
然后可以在Rust代码中调用从JavaScript导入的函数。
5. 编译为WebAssembly
wasm-pack build --target web
上述命令将生成一个 pkg
目录,其中包含了编译好的 WebAssembly 模块和 TypeScript(JavaScript) 包装器。
使用 wasm-pack build --target web
来生成一个可以在浏览器中运行的包,
是一个完整的 npm 包,直接按照包的方式直接导入到 JavaScript 项目中。
如果是wasm-pack build
,则可以构建一个可以在 Node.js 中运行的包。