这是#[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 中运行的包。
