WebAssembly (Wasm) 与 JavaScript


您是否曾经想过,是否可以在不牺牲 JavaScript 提供的可移植性和安全性的情况下,在 Web 上运行高性能应用程序?不用再疑惑了!随着 WebAssembly (Wasm) 的引入,现在可以在仍然利用 JavaScript 强大功能的同时,为 Web 应用程序带来类似原生的性能。在本文中,我们将探讨 WebAssembly 的基础知识,以及如何将其与 JavaScript 结合使用以开启新的可能性。

什么是 WebAssembly (Wasm)?

WebAssembly,通常称为 Wasm,是一种专为 Web 浏览器设计的二进制指令格式。它是一个低级虚拟机,能够以接近原生的速度执行代码。Wasm 是 Mozilla、Google、Microsoft 和 Apple 等主要浏览器厂商合作开发的,其目标是将高性能应用程序引入 Web。

WebAssembly 的主要优点之一是它与多种编程语言兼容,使其成为 Web 开发的通用解决方案。您可以使用 C++、Rust 甚至 TypeScript 等语言编写代码,然后将其编译为 Wasm 二进制格式,该格式可以直接在浏览器中执行。

WebAssembly 与 JavaScript 的集成

WebAssembly 为 Web 开发带来了诸多好处。它允许开发者以接近原生的速度执行计算密集型任务,使其适合需要高性能执行的应用程序。通过利用 WebAssembly,开发者可以将用 C++、Rust 或 TypeScript 等语言编写的现有代码库移植到 Web,而不会牺牲性能。

WebAssembly 与 JavaScript 的集成实现了两种语言之间的无缝交互。JavaScript 充当桥梁,提供了一个方便的接口来处理 WebAssembly 模块。这允许开发者将 WebAssembly 的强大功能与丰富的 JavaScript 库和框架的生态系统和灵活性相结合。

虽然 WebAssembly 是一种独立技术,但它可以与 JavaScript 无缝集成,允许开发者在一个应用程序中结合两种语言的优势。JavaScript 充当 Web 平台和 WebAssembly 模块之间的粘合剂,提供了一个方便的接口来与编译后的代码进行交互。

JavaScript 提供了加载 WebAssembly 模块的必要 API。fetch API 用于检索二进制文件,生成的 ArrayBuffer 传递给 WebAssembly.instantiate 函数。此函数异步编译模块并返回一个实例,其中包含模块的导出函数和内存。通过访问这些导出函数,JavaScript 可以调用 WebAssembly 模块提供的功能。

为了演示这种集成,让我们考虑一个简单的例子。我们将编写一个计算斐波那契数列的 Wasm 模块,然后从 JavaScript 调用此模块。

步骤 1:编写 WebAssembly 模块

让我们首先用 C++ 编写斐波那契计算逻辑。将以下代码保存到名为 fibonacci.cpp 的文件中:

#include <emscripten.h>

extern "C" {
   int EMSCRIPTEN_KEEPALIVE fibonacci(int n) {
      if (n <= 1) {
         return n;
      } else {
         return fibonacci(n - 1) + fibonacci(n - 2);
      }
   }
}

说明

在此代码中,我们有一个 C++ 函数 fibonacci,它递归地计算斐波那契数列。EMSCRIPTEN_KEEPALIVE 宏用于确保导出该函数,并可以从 JavaScript 访问。

步骤 2:编译 WebAssembly 模块

要将 C++ 代码编译为 WebAssembly,我们将使用 Emscripten 工具链。在终端中运行以下命令:

emcc fibonacci.cpp -s WASM=1 -o fibonacci.wasm

此命令将生成 fibonacci.wasm 文件,其中包含编译后的 WebAssembly 模块。

步骤 3:从 JavaScript 调用 WebAssembly

现在我们有了 WebAssembly 模块,让我们从 JavaScript 调用它。将以下代码保存到 HTML 文件 index.html 中:

示例

<!DOCTYPE html>
<html>
<head>
   <script>
      const fetchAndInstantiate = async () => {
         const response = await fetch('fibonacci.wasm');
         const buffer = await response.arrayBuffer();
         const module = await WebAssembly.instantiate(buffer);
         const instance = module.instance;

         const fibonacci = instance.exports.fibonacci;
         const result = fibonacci(10);

         console.log('Fibonacci(10):', result);
      };

      fetchAndInstantiate();
   </script>
</head>
<body>
</body>
</html>

说明

在此代码中,我们使用 fetch API 检索 fibonacci.wasm 文件并将其转换为 ArrayBuffer。然后,我们使用 WebAssembly.instantiate 实例化 WebAssembly 模块,并从模块的实例中获取导出的 fibonacci 函数。最后,我们使用参数 10 调用 fibonacci 函数并将结果记录到控制台中。

步骤 4:运行示例

要运行示例,请在 Web 浏览器中打开 HTML 文件。打开浏览器的开发者控制台,您应该看到输出 Fibonacci(10): 55。这证实了 WebAssembly 模块已成功从 JavaScript 加载并执行。

结论

WebAssembly 是一项强大的技术,它为高性能 Web 应用程序开辟了新的可能性。通过结合 WebAssembly 和 JavaScript 的优势,开发者可以利用现有代码库,使用较低级别的语言编写性能关键部分,并将它们无缝集成到 Web 项目中。凭借 WebAssembly 的灵活性和可移植性,Web 平台有望成为运行复杂应用程序的更强大的环境。

更新于:2023年7月25日

278 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告