+8613426109659
webmaster@21cto.com

JS 开发者啥时能用上 WebAssembly 的强大功能?

前端 0 19 11小时前
图片

导读:了解 WebAssembly (Wasm) 如何提升 JavaScript 应用的性能。探索现代工具,并学习面向 JS 开发人员的入门教程。

JavaScript 诞生于三十年前,最初是为了实现简单的网页交互。虽然它至今仍是网页运行的基础,但如今的应用程序远比那时复杂得多。

这表示着浏览器中需要很多 JavaScript 可以处理的功能,但这些功能往往会牺牲性能。对于像我这样,在等待缓慢加载的应用程序时每隔几秒就刷新一次页面的人来说是常有的事。我也知道这样做无济于事,但我还是会这么做,网站速度至关重要。

为了解决这个问题,WebAssembly(Wasm)于 2017 年问世。

了解 Wasm 及其与 JavaScript 的协同工作方式

WebAssembly 的优势之一在于,它能帮助开发者将计算密集型或复杂的逻辑从 JavaScript 中迁移出来,同时又不放弃 JavaScript 生态系统。

通过使用 WebAssembly,你可以使用 Rust、C++ 或 AssemblyScript 等语言编写高性能代码,这些代码仍然可以在浏览器或服务器端高效运行。由于 WebAssembly 的编译方式更接近机器代码,因此它可以显著提升应用程序的速度和效率。

当然,Wasm 的设计初衷并非取代 JavaScript。它无法操作 DOM、处理事件或与现有框架协同工作。相反,它的设计目标是与 JavaScript协同工作。你可以把 Wasm 看作是处理繁重任务的工具,而 JavaScript 则提供了一个生态系统和便利性。

在 WebAssembly 的早期阶段,构建和集成 Wasm 组件非常棘手——尤其是对于有 JavaScript 背景的开发者而言。它通常需要复杂的设置和不清晰的调试流程,因此对初学者来说并不是那么友好。

AssemblyScript 降低了入门门槛,让 JavaScript 开发人员能够使用熟悉的、类似 TypeScript 的语法编写 Wasm。

经过多年的更新,WebAssembly 现在更容易被各个级别的开发人员使用,这导致了其应用范围的扩大。

如今,WebAssembly 工具已经非常成熟。现代化的工作流程使得编译 Wasm 模块、组织项目以及在 Node.js 和浏览器中加载 WebAssembly 变得更加容易。AssemblyScript 降低了入门门槛,它允许 JavaScript 开发人员使用类似 TypeScript 的熟悉语法编写 Wasm 代码;而像 这样的工具asinit以及asc 官方加载器则处理了大量的样板代码。

WebAssembly 在 JS 应用中的理想用例

以下,我来讲一些受益于将 WebAssembly 与 JavaScript 结合使用的应用示例。

CPU密集型计算

繁重的计算任务,比如数据处理、模拟、图像处理或复杂的数学运算。这在小规模使用 JavaScript 时通常运行良好,但随着工作负载的增长,可能会成为性能瓶颈。在这种情况下,将 WebAssembly 与 JavaScript 结合使用,可以显著提升性能,使其更接近原生代码的运行速度,从而超越同等功能的 JavaScript 实现。

使用现有的非 JavaScript 代码

借助 WebAssembly,开发者可以将用 C++、Rust 或 AssemblyScript 等语言编写的库引入浏览器。这样,你无需用 JavaScript 重写代码,即可集成经过实战检验的高性能代码,这在 JavaScript 生态系统之外已有解决方案的情况下尤为有用。

关键性能特性

该类别包括需要高速执行且开销低的工作负载,例如实时数据转换、图像处理或视频处理。

WebAssembly 不适合 DOM 操作、简单的应用程序逻辑或 I/O 密集型工作流程等任务。请将 WebAssembly 留给这些繁重的工作。

使用 AssemblyScript 的 WebAssembly 分步教程

以下的小教程展示了如何将用 AssemblyScript 编写的基于 WebAssembly 的数学功能引入浏览器。虽然示例很简单,但复杂的数学运算正是 WebAssembly 的绝佳应用场景。

让我们开始。

先决条件

你要对 JavaScript 有基本的了解

  • npm

  • Homebrew(仅限 macOS)

  • 集成开发环境(本教程中使用的是 VS Code)

  • Node.js版本 22 或更高版本


第一步是安装wash。这是一个命令行工具,虽然不需要全局安装,但这样做可以简化操作。以下是在 macOS 上全局性安装的示例。

brew install wasmcloud/wasmcloud/wash@0.42.0

在 IDE 中新建一个项目,并确保所有必备组件都已安装。

node -vnpm -vwash --help

现在,创建项目文件夹:

mkdir wasm-addercd wasm-adder

初始化 AssemblyScript

运行npm install --save-dev assemblyscript,以便在本地安装 AssemblyScript。然后运行npx asinit . 以使用推荐的结构初始化项目,包括assembly/、build/、asconfig.json和示例文件。

npm install --save-dev assemblyscriptnpx asinit .

这将创建推荐的 AssemblyScript 项目结构:

wasm-adder/├─ assembly/       # AssemblyScript sources├─ build/          # Compiled WASM artifacts├─ package.json├─ asconfig.json├─ tsconfig.json├─ index.js└─ tests/

编写 AssemblyScript 函数

该add函数包含将在 WebAssembly 中运行的应用程序逻辑。编译后,这段 AssemblyScript 代码会成为一个.wasm模块。

这里,i32是 AssemblyScript 提供的一种数值类型。

编译为 WebAssembly

代码被编译到build/文件夹中,生成release.wasm和release.wat。.wasm文件是由 Node.js 或浏览器执行的二进制文件,而.wat文件是便于调试的人类可读格式。

npx asc assembly/adder.ts -b build/release.wasm -t build/release.wat --optimize

结语

好的,讲完了一个可运行的 WebAssembly 示例。

有了这个基础,我们就可以将复杂或对性能要求极高的计算任务卸载到 WebAssembly,同时让 JavaScript 专注于编排与用户体验。

写到这里扣个题,JS开发者用上WebAssembly真实环境已经近在眼前了。

作者:大雄

评论

我要赞赏作者

请扫描二维码,使用微信支付哦。