初识WASM

WebAssembly(WASM)是一门非常令人兴奋的技术,由W3C主导制定,主流浏览器均支持。它最核心的优势是高性能,是对javaScript的重要补充。很多种语言都可以编写WASM,并将其编译成二进制文件,在浏览器上的执行速度接近原生C/C++。

本文简要介绍如何使用Rust和AssemblyScript这两种技术栈开发WASM应用。

Rust开发WASM

开发环境

1
2
3
4
# 构建工具
cargo install wasm-pack
# 为wasm模块生成js胶水代码
cargo install wasm-bindgen-cli

创建项目

1
cargo new --lib hello-wasm

以下是Cargo.toml文件,需要添加wasm-bindgen库:

1
2
3
4
5
6
7
8
9
10
[package]
name = "hello-wasm"
version = "0.1.0"
edition = "2024"

[lib]
crate-type = ["cdylib"]

[dependencies]
wasm-bindgen = "*"

编写wasm逻辑

在lib.rs中添加wasm逻辑代码,可以声明Javascript中的函数,也可以定义自定义函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
extern {
pub fn alert(s: &str);
#[wasm_bindgen(js_namespace=console)]
fn log(s:&str);
}

#[wasm_bindgen]
pub fn greet(name: &str) {
alert(&format!("Hello, {}!", name));
log(&format!("Hello, {}!", name));
}

#[wasm_bindgen]
pub fn fibonacci(n: i32) -> i32 {
if n <= 1 {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}

编译

执行以下命令,可以生成一个pkg文件夹,里面包含了wasm的生成文件,已经是Release版本。

1
wasm-pack build --target web

核心文件如下:

  • hello_wasm_bg.wasm:wasm二进制文件。
  • hello_wasm.js:Javascript胶水语言。

测试

以下是html文件,通过模块方式引入main.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>Rust WASM Test</title>
</head>
<body>
<h1>Rust WASM 测试页面</h1>
<button id="greetBtn">打招呼 (Greet)</button>
<button id="fibBtn">计算 Fibonacci(10)</button>
<p>结果: <span id="result">-</span></p>

<script type="module" src="./main.js"></script>
</body>
</html>

以下是main.js的核心逻辑,直接从胶水代码中引入核心函数,注意:需要先异步执行init函数才能正常加载!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import init, { greet, fibonacci } from './pkg/hello_wasm.js';

(async () => {
await init();
console.log("WASM 模块加载成功!");
document.getElementById('greetBtn').addEventListener('click', () => {
greet("Web 浏览器");
});

document.getElementById('fibBtn').addEventListener('click', () => {
const n = 10;
const result = fibonacci(n);
document.getElementById('result').textContent = `fibonacci(${n}) = ${result}`;
});
})();

AssemblyScript开发WASM

可以说AssemblyScript是直接在前端项目中集成WASM最便捷的方式,AssemblyScript使用TypeScript语言开发,可以和Vue3项目无缝集成。

创建项目

1
2
3
4
5
6
7
8
9
# 创建Vue3项目,TypeScript
npm create vue@latest test-as
cd test-as
npm install

# 安装assemblyscript开发依赖
npm install -D assemblyscript
# 自动生成相关文件
npx asinit .

执行npx asinit .后会生成并更新以下文件:

编写并编译WASM代码

先编译wasm,在编译运行Vue3前端项目:

1
2
npm run asbuild
npm run dev

测试

与Rust编写WASM存在差异,这里直接引入WASM模块中的函数即可,不需要手动初始化。

1
2
3
4
5
6
7
8
9
10
11
12
13
<script setup lang="ts">
import { ref } from "vue";
import { add } from "../build/release";
const res = ref(0);
const clickHandler = () => res.value = add(100, 300);
</script>

<template>
<h1>{{ res }}</h1>
<button @click="clickHandler">计算</button>
</template>

<style scoped></style>

(转载本站文章请注明作者和出处lihaohello.top,请勿用于任何商业用途)

评论