Rust编程语言,使用wasm-pack编译wasm范例
发布于 作者:苏南大叔 来源:程序如此灵动~

.wasm
是webassembly
的文件后缀,它可以由多种高级编程语言生成,并不是某一种编程语言的固定产物。本文中,苏南大叔演示的是:使用rust
编程语言写一个非常简单入门的wasm
文件,并且在www
容器里面运行起来。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10
,rustc 1.84.1
,cargo 1.84.1
,rustup 1.27.1 (54dd3d00f 2024-04-24)
,wasm-pack@0.13.1
。
rust,cargo
rust
和cargo
是必须安装的基础软件。参考文章:
- https://newsn.net/say/rust.html
- https://newsn.net/say/rustup.html
- https://newsn.net/say/cargo-config-toml.html
- https://newsn.net/say/cargo-mirror.html
wasm-pack
rust
并不是专门用于生成webassembly
的,但是rust
想要在web
前端方面做些事情,唯一的媒介就是webassembly
。这个时候就需要wasm-pack
来做这个事情了。
rust
最开始进入苏南大叔的视野,就是安装编译人工智能的transformer
库的时候。所以,rust
能做的事情很多的。
官方文档:
wasm-pack
是一个用于构建和处理Rust
生成的WebAssembly
的工具。它简化了将Rust
代码编译为WebAssembly
并与 JavaScript
集成的过程。在这篇文章中,我们将介绍 wasm-pack
的基本使用方法,并展示如何使用它来构建一个简单的 WebAssembly
项目。
它的优点就是,不但把rust
的代码编译成了.wasm
文件,同时还生成了用于页面调用的js
代码,可以用于导入.wasm
文件里面的函数。
安装 wasm-pack
通过以下命令安装 wasm-pack
:
cargo install wasm-pack
安装完成后,可以通过运行以下命令来验证安装是否成功:
wasm-pack --version
创建新项目
使用 cargo
创建一个新的Rust
项目,名叫sunan-wasm
:
cargo new sunan-wasm --lib
在 sunan-wasm/Cargo.toml
文件中添加 wasm-bindgen
依赖项:
[package]
name = "wasm_example"
version = "0.1.0"
edition = "2024"
[lib]
crate-type = ["cdylib"]
[dependencies]
wasm-bindgen = "0.2"
Rust
项目根目录下面的Cargo.toml
文件,和Node
项目根目录下面的package.json
文件很相似。
编写 Rust 代码
在 sunan-wasm/src/lib.rs
文件中编写以下代码:
use wasm_bindgen::prelude::*;
use wasm_bindgen::JsValue;
#[wasm_bindgen]
extern "C" {
fn alert(s: &str);
}
#[wasm_bindgen]
pub fn greet() {
alert("Hello, wasm-pack!");
}
#[wasm_bindgen]
pub fn add(left: i32, right: i32) -> i32 {
left + right
}
#[wasm_bindgen]
pub fn greet2() -> String {
"Hello, WebAssembly!".to_string()
}
构建项目
使用 wasm-pack
构建项目,在根目录下面执行:
wasm-pack build --target web
注意这里的参数--target web
,这个是重点!!!!否则后面的一切流程都跑不起来。
构建完成后,在项目目录中看到一个 pkg
文件夹,其中包含生成的 WebAssembly
文件和 JavaScript
包装器。
引入执行
在容器里面,建立个测试的html
文件:
<button id="greetButton">Greet</button>
<button id="addButton">Add</button>
<button id="greet2Button">Greet</button>
<script type="module">
import init, { greet, add, greet2 } from './pkg/wasm_example.js';
async function runWasm() {
await init();
document.getElementById('greetButton').addEventListener('click', () => {
greet();
});
document.getElementById('addButton').addEventListener('click', () => {
const result = add(5, 3);
console.log('Result from add:', result);
});
document.getElementById('greet2Button').addEventListener('click', () => {
const result = greet2();
console.log('Result from greet2:', result);
});
}
runWasm();
</script>
参考文章:
结论
通过以上步骤,苏南大叔成功使用 wasm-pack
构建了一个简单的WebAssembly
项目。wasm-pack
极大地简化了将Rust
代码编译为WebAssembly
并与JavaScript
集成的过程,使得开发WebAssembly
应用变得更加容易。
更多苏南大叔的wasm
经验文章,请点击:


