LabHub

博客

浏览器里跑着真引擎:WebAssembly 开发工具集

한국어English日本語中文

引言 — 无需安装、无需服务器、数据不外泄

过去几周里,我在这个网站上一口气加了一批浏览器工具:Python 解释器、PostgreSQL 数据库、视频转换器,甚至还有 x86 PC 模拟器。它们有一个共同点 — 不是仿制品,而是真家伙。Python 练习场跑的是真正的 CPython,SQL 练习场跑的是真正的 SQLite。而这一切都发生在没有后端、只在你浏览器标签页内部的环境里。

让这一切成为可能的技术是 WebAssembly(简称 WASM)。这篇文章不是营销文案,而是聊聊 WASM 到底解决了什么、还有什么做不到,以及在它之上做的这些工具该怎么用。

WebAssembly 为什么改变了游戏规则

WebAssembly 是一种在浏览器里运行的低层字节码格式。它不是要取代 JavaScript,而是接手 JavaScript 不擅长的那部分工作。核心优势有四条。

最后这一条在实务中分量尤其重。转换 iPhone 的 HEIC 照片,或者用 SQL 拆解公司日志时,数据不会被发送到任何服务器 — 这不只是便利,而是一项安全要求。

WASM 模块是如何加载的

浏览器运行一个 WASM 工具,大致流程如下。

  1. 页面加载
        |
        v
  2. 下载 .wasm 二进制文件(CDN 或自托管)
        |
        v
  3. 用 WebAssembly.instantiate() 编译 + 实例化
        |
        v
  4. JavaScript 注入宿主函数(文件、控制台等)
        |
        v
  5. 引擎运行 — 此后的运算全部在本地进行

.wasm 文件从 CDN 获取,或者由网站直接托管。像 Python 这样的大型运行时,下载体积可达数 MB 到数十 MB,因此首次加载需要一点时间。作为交换,浏览器会缓存这个文件,所以第二次开始会快得多。这就是「只有第一次慢,之后立刻响应」的原因。

有一点要注意,是隔离要求。使用线程或共享内存(SharedArrayBuffer)的重型 WASM 工具,可能需要浏览器的跨源隔离(COOP/COEP)响应头。ffmpeg 的多线程构建就是典型例子。只有网站正确设置了这些响应头,该功能才会开启。

语言练习场 — 真正的解释器在运行

最直观的用法,是把整门编程语言塞进浏览器。这些不是只做语法高亮的编辑器,而是真正在运行解释器。

举个简单的例子,在 Python 练习场里输入下面这段代码,不经过服务器往返就能立刻拿到结果。

def fib(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

print([fib(i) for i in range(10)])
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

关键在于,这个结果不是「预先存好的标准答案」。改动代码,真正的解释器会重新执行。

数据库与数据工具 — 在浏览器里跑 SQL

数据类工具尤其能体现 WASM 的价值,因为真正的数据库引擎就在标签页里运转。

比如在 Postgres 练习场里,下面这条递归 CTE 会实际执行。

WITH RECURSIVE counter(n) AS (
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM counter WHERE n < 5
)
SELECT n, n * n AS square FROM counter;

因为数据不会离开浏览器,粘贴敏感 CSV 进去分析也是安全的。这是大多数在线 SQL 工具做不到的一点。

构建与编译工具 — 工具链搬进了浏览器

构建工具恰恰是最需要原生性能的领域,而托 WASM 的福,它们也进了浏览器。

它们的共同点是没有「安装地狱」。不需要 node_modules,不需要本地工具链,打开链接编译器就跑起来了。

媒体与图像 — ffmpeg 与 ImageMagick 整个搬来

媒体处理传统上是重型原生库的地盘。如今它们也在浏览器里运行了。

视频转换是同时展示 WASM 局限与优势的好例子。它比原生 ffmpeg 慢,但把短片段转成 GIF 这种程度完全够用,更重要的是,视频文件不会被上传到服务器。

其他工具 — AI、模拟器、仿真器

WASM 的应用超越了语言和媒体。

这份清单里能看出两条线索。一条是把真正的引擎(AI 模型、x86 CPU、密码库)用 WASM 搬进来,另一条是将概念可视化的仿真器(git 图、eBPF 验证器)。后者并不运行真实系统,但为直观理解原理做了优化。

现实中的局限 — WASM 做不到的事

WASM 强大,但不是万能。在动手用这些工具之前,有几条局限值得了解。

归纳起来,WASM 最适合「在没有服务器、又能保护隐私的前提下,做适度重的工作」。超大规模、超高性能的工作,依然是服务器或原生方案更胜一筹。

结语

WebAssembly 带来的变化,本质上是「在浏览器里使用重型工具,不需要任何安装,也不会有任何数据外泄」。真正的 CPython、真正的 PostgreSQL、真正的 ffmpeg 在你的标签页里运行,过程中代码和数据都不会外流。

局限也很明显。首次加载慢,不适合超高性能的工作。但对于学习、实验、处理敏感数据这类大多数日常工作而言,已经绰绰有余。把上面链接的工具一个个打开看看吧。没有服务器却能做到这个程度,这个事实相当令人惊讶。

参考资料

评论

还没有评论。

登录后即可发表评论