0 介绍
视频地址:www.bilibili.com/video/BV1eg411g7c...
相关源码:github.com/anonymousGiga/Rust-and-...
1 为何是Rust和WebAssembly?
- 低水平控制与高水平的人体工程学
- JavaScript Web应用程序很难获得和保持可靠的性能。
- Rust为程序员提供了低级别的控制和可靠的性能。
- 较小的.wasm
- 代码大小非常重要,因为 .wasm必须通过网络下载。Rust没有运行时,因此支持较小的.Wasm。
- 不用全部重写
- 使用Rust并不是将现有的代码扔掉,我们可以将部分js函数转换成Rust代码。
- 和其它的和善相处
- Rust和WebAssembly与现有JavaScript工具集成,支持ECMAScript模块,你可以继续使用之前的工具,如npm、Webpack。
- 便利的基础设施
- Rust中拥有开发者所期望的便利的工具,如:
- Cargo、零成本抽象、开放热情的社区。
2 WebAssembly是什么?
WebAssembly(wasm)是一种简单的机器模型和具有广泛规范的可执行格式。它被设计成可移植的、紧凑的,并且以或接近本机速度执行。
WebAssembly有两种表示相同结构的格式:
- .wat 文本格式(WebAssembly Text)使用S表达式,和Lisp家族的语言有些类似;
- .wasm二进制格式,级别较低,直接供wasm虚拟机使用,它在概念上类似于ELF和Mach-O。
2.1 线性存储器
WebAssembly有一个非常简单的内存模型。wasm模块可以访问单个的线性内存(本质就是数组),此内存可以按照页大小(64K)的倍数增长,但是不能缩小。
2.2 WebAssembly是不是只为Web使用
wasm并没有对其宿主环境做出任何假设,但是到目前为止,主要还是与js相关。
3 初体验
- 安装Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
- 安装wasm-pack
cargo install wasm-pack
- 创建工程
cargo new --lib mywasm
- 编写代码
在src/lib.rs中添加如下代码:
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern {
pub fn alert(s: &str);
}
#[wasm_bindgen]
pub fn greet(name: &str) {alert(&format!("Hello, {}!", name));
}
修改Cargo.toml配置文件,添加如下:
[lib]
crate-type = ["cdylib"]
[dependencies]
wasm-bindgen = "0.2"
- 编译package
wasm-pack build --target web
- 使用package
在mywasm根目录下创建index.html,代码如下:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>hello-wasm example</title></head><body><script type="module">import init, {greet} from "./pkg/hello_wasm.js";init().then(() => {greet("WebAssembly")});</script></body>
</html>
- 运行server
python3 -m http.server
- 测试
在浏览器中输入: localhost:8000