第 5 章:与 JavaScript 的双向交互
5.1 导出函数与调用方式
WebAssembly 模块可以通过 export 将函数暴露给 JavaScript,从而在 JS 中直接调用这些函数。以 AssemblyScript 或 Rust 为例,都可以通过特定语法将函数导出。
例如,在 AssemblyScript 中:
// AssemblyScript
export function add(a: i32, b: i32): i32 {
return a + b;
}
然后在 JavaScript 中加载并调用该函数:
const wasm = await WebAssembly.instantiateStreaming(fetch('example.wasm'));
console.log(wasm.instance.exports.add(2, 3)); // 输出 5
Rust 中使用 #[wasm_bindgen]:
#[wasm_bindgen]
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
导出的函数会出现在 JavaScript 的 wasm_bindgen 包装器中。
5.2 从 WASM 调用 JS 函数
WebAssembly 模块也可以调用 JavaScript 中定义的函数。这需要在导入对象中显式声明 JS 函数供 WebAssembly 使用。
JavaScript 侧定义函数并传入:
const importObject = {
env: {
log: (value) => console.log("WASM Log:", value)
}
};
const wasm = await WebAssembly.instantiateStreaming(fetch('example.wasm'), importObject);
AssemblyScript 中声明外部导入函数:
@external("env", "log")
declare function log(value: i32): void;
export function testLog(): void {
log(42);
}
这样就可以在 WASM 中调用外部 JS 函数,实现双向通信。
5.3 数据传递与内存管理
WASM 模块与 JavaScript 之间的数据传递需要注意数据类型的兼容性和内存分配方式。基本类型如整数、浮点数可以直接传递,但复杂类型(如字符串、对象)则需要通过共享内存或传递指针的方式。
传递字符串的常见方式:
- 在 WASM 中申请一段内存用于字符串;
- 将字符串编码为 UTF-8 写入该内存;
- 将指针和长度传给 JS;
- JS 使用
TextDecoder解码内存内容。
例如在 JavaScript 中读取 WASM 传来的字符串:
function getStringFromMemory(ptr, len, memory) {
const bytes = new Uint8Array(memory.buffer, ptr, len);
return new TextDecoder('utf8').decode(bytes);
}
内存管理建议:
- 避免频繁分配和释放内存,可考虑使用对象池;
- 使用
wasm-bindgen时,它会自动处理一些复杂的内存操作; - 注意使用
__alloc,__free(AssemblyScript)或手动管理内存(裸 WASM)防止内存泄漏。
通过以上方式,WebAssembly 与 JavaScript 实现了高效且安全的双向交互,为构建高性能 Web 应用提供强大支持。
相关内容
- WebAssembly 入门培训概述 WebAssembly(WASM)是一种能够在浏览器中高效运行的二进制格式,为 Web 开发带来了更高的性能和更丰富的应用场景。本培训大纲将帮助你从基础到进阶,...
- 第 6 章:性能优化与对比 本章探讨 WebAssembly 在性能方面的优势,包括与 JavaScript 的性能对比、编译优化技巧以及如何结合 Web Workers 实现多线程处理。
- 第 7 章:调试和工具链 本章介绍 WebAssembly 的调试方式以及常用的开发工具,帮助开发者更高效地构建和排查 WASM 应用。
- 第 8 章:集成到真实项目中 本章介绍如何将 WebAssembly 集成进现代前端框架项目中,并通过实战示例探索其实际应用。
- 第 1 章:WebAssembly 概述 WebAssembly 是一种高效的二进制指令格式,旨在使 Web 应用能够以接近原生速度执行代码。它与 JavaScript 紧密协作,为计算密集型任务提供更...
- 第 2 章:技术架构与运行机制 本章介绍了 WebAssembly 的技术架构和运行机制,包括 WASM 模块结构、执行模型与沙箱机制,以及 WebAssembly 与 JavaScript...