Mozilla近日宣布Firefox 148将开始默认禁用SpiderMonkey的asm.js优化,并计划在未来版本中完全移除该代码。这意味着一项Web性能史上最具开创性的技术实验即将落幕。

SpiderMonkey是Mozilla的JavaScript和WebAssembly引擎,被广泛应用于Firefox、Servo以及其他众多项目中。它采用C++、Rust和JavaScript编写。您可以将其嵌入到C++和Rust项目中,也可作为独立shell运行。此外,它还可以编译为WASI。
asm.js诞生于2013年Firefox 22发布之时,它是一个JavaScript的严格静态类型子集,可以在运行时预先编译为原生代码。其核心思路简单却激进:用JavaScript的语法表达静态类型承诺,让浏览器可以进行高度优化的Ahead-of-Time编译,而不必依赖运行时的推测优化。
这项技术一经推出便震动了整个行业。Unity和Unreal Engine先后宣布通过asm.js将C/C++游戏移植到Web平台,这是人类首次在不借助插件的情况下,通过标准Web技术实现接近原生的3D游戏体验。Epic Games的演示让许多开发者第一次意识到,浏览器可以不只是文档展示工具,而是一个真正的应用平台。
历史的发展往往出人意料。2017年WebAssembly发布时,许多人认为它只是asm.js的正式标准化版本,两者将长期共存。然而实际上,WebAssembly带来了更高效的二进制格式、更快的解析速度,以及更广泛的工具链支持。开发者社区迅速转向WebAssembly,asm.js的使用量逐年萎缩。
Mozilla的工程师在博客中写道:"WebAssembly已经成功了,asm.js的使用已基本完成迁移。"这句话既是对WebAssembly生态成熟的庆祝,也是对asm.js历史的盖棺定论。
在SpiderMonkey的技术架构中,两个编译器的命名颇具深意:asm.js优化编译器名为OdinMonkey,源自北欧神话中的智慧之神;WebAssembly优化编译器名为BaldrMonkey,源自北欧神话中的光明之神;而负责生成WebAssembly字节码的基础编译器则名为RabaldrMonkey。这种命名方式既反映了SpiderMonkey团队的技术浪漫主义,也暗喻了WebAssembly最终将取代asm.js的历史命运。

对于仍在使用asm.js的开发者,Mozilla的建议非常明确:重新编译为WebAssembly。WebAssembly不仅能提供更快的执行速度,还能生成更小的二进制文件,并且获得了所有主流浏览器的原生支持。这是一个不需要犹豫的技术决策——WebAssembly已经在所有维度超越了asm.js曾经的承诺。
asm.js的落幕标志着Web平台走向成熟的一个里程碑。从NaCl到asm.js再到WebAssembly,浏览器经历了漫长的技术探索,最终找到了一条清晰的道路。当一项技术完成其历史使命,最好的结局就是体面地退场,让位给继任者继续前行。
参考来源:
- SpiderMonkey Blog: https://spidermonkey.dev/blog/2026/05/20/saying-goodbye-to-asmjs.html