001 Rust和WebAssembly初体验

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
令狐一冲
讨论数量: 3

不错,很简洁清晰地教程

1个月前 评论

"import init, {greet} from "./pkg/hello_wasm.js";" 这行应该改为 “import init, {greet} from "./pkg/mywasm.js";” 吧 创建 lib 的名字就叫 mywasm

1周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!