Skip to content

WebAssembly

概述

WebAssembly (Wasm) 是浏览器中的低级字节码格式,提供接近原生的性能。

一、使用场景

场景例子
计算密集图像/视频处理、加密
游戏Unity WebGL、Unreal
移植现有代码C/C++/Rust 库
代码保护核心算法加密

二、加载与调用

javascript
// 方式一:fetch + instantiate
const response = await fetch('module.wasm');
const buffer = await response.arrayBuffer();
const { instance } = await WebAssembly.instantiate(buffer, {
  env: {
    log: (n) => console.log(n)
  }
});

instance.exports.add(1, 2);

// 方式二:streaming (推荐)
const { instance } = await WebAssembly.instantiateStreaming(
  fetch('module.wasm'),
  importObject
);

三、与 JavaScript 交互

javascript
// 导出函数
const add = instance.exports.add;
add(1, 2); // 调用 Wasm 函数

// 共享内存
const memory = new WebAssembly.Memory({ initial: 1, maximum: 10 });
const view = new Uint8Array(memory.buffer);

// 传递字符串 (需要编码)
const encoder = new TextEncoder();
const bytes = encoder.encode('hello');
view.set(bytes, 0);

四、工具链

语言工具
C/C++Emscripten
Rustwasm-pack
GoTinyGo
AssemblyScript直接 TypeScript

Rust 示例

rust
// lib.rs
#[no_mangle]
pub extern "C" fn fibonacci(n: u32) -> u32 {
    if n <= 1 { n } else { fibonacci(n - 1) + fibonacci(n - 2) }
}
bash
wasm-pack build --target web

五、性能对比

javascript
// JavaScript
function fib(n) {
  if (n <= 1) return n;
  return fib(n - 1) + fib(n - 2);
}

// Wasm 通常快 2-10 倍 (计算密集场景)

面试高频题

Q1: Wasm 比 JS 快多少?

计算密集场景快 2-10 倍,DOM 操作反而更慢。

Q2: Wasm 可以操作 DOM 吗?

不能直接操作,需要通过 JS 中转。

Q3: Wasm 适合什么场景?

图像处理、加密、游戏引擎、移植原生库。

前端面试知识库