Firefox 148 关掉的,不是 asm.js 兼容性。

Mozilla 做的是另一件事:SpiderMonkey 里那条专门给 asm.js 准备的优化路径,默认禁用了。asm.js 内容还会跑,因为它本来就是 JavaScript 子集。只是以后不再走专门编译通道,而是回到普通 JIT 路径。

这件事最容易被误读成“Firefox 不支持 asm.js 了”。不是。

真正的信号在后半句:Mozilla 计划未来移除相关代码,并建议还在发布 asm.js 内容的维护者迁到 WebAssembly。旧通道还没塌,但路牌已经拆了。

Firefox 148 关了什么,谁该动手

问题现在的变化直接影响
asm.js 专用优化Firefox 148 默认禁用不再走 SpiderMonkey 的专门快路径
JavaScript 兼容性没有删除现有 asm.js 内容仍按普通 JS 执行
后续计划Mozilla 计划移除相关代码浏览器内核少维护一条旧路径
迁移建议转向 WebAssemblyMozilla 明确提到执行更快、二进制体积更小

普通用户大概率无感。网页不会因为这件事突然白屏。

真正该看代码仓库的人,是还在维护 asm.js / 老 Emscripten 输出的开发者。动作很简单,但不一定轻松:确认当前构建产物是不是还在发 asm.js;如果是,评估能不能重新编译到 WebAssembly;迁移后再测启动、执行和包体,不要只凭“Wasm 更好”四个字上线。

这里有个现实约束:老项目最难的往往不是改目标格式,而是构建链已经锈住。依赖锁死、脚本没人敢碰、发布流程没人记得,这些都比技术路线本身更烦。

所以这不是一张“立刻重构”的罚单。更像一封到期提醒:如果项目还有人维护,就别再把 asm.js 当长期方案。

asm.js 当年赢在一件事:没有绕开 Web

asm.js 是 2013 年随 Firefox 22 推出的。

那时浏览器面对一个硬问题:Web 能不能跑接近原生性能的 C/C++ 代码?Google 曾推 NaCl、PNaCl 这类路线,更像给浏览器旁边再开一条原生通道。Mozilla 选了另一条路:仍然站在标准 JavaScript 里,挑出一个更容易被引擎识别和优化的子集。

这就是 asm.js 的历史位置。

它不是今天这种“遗留格式”的开端,而是高性能 Web 的前史。Unity、Unreal 等大型 C/C++ 代码库上 Web,asm.js 起过实打实的支撑作用。当年的演示不是炫技,它在证明浏览器不只会跑文档、表单和脚本小玩具。

后来 WebAssembly 接棒。Firefox 52 开始支持 Wasm。到今天,性能路径、工具链、生态投入、安全维护的重心,都已经转到 WebAssembly。

asm.js 和 WebAssembly 的关系,不像两个并列竞品。更像临时栈桥和正式桥梁。

栈桥的价值是让车先过河。正式桥修好后,栈桥继续占着人力、检查表和风险清单,就变成成本。

功臣也会变成维护负债

我更在意 Mozilla 给出的关闭理由:使用已经迁移,继续维护成本高,虚拟机里多一条路径就多一块攻击面。

这句话不漂亮,但很真实。

浏览器内核不是纪念馆。每留一条专用路径,都要有人读、有人测、有人修。还要在安全边界里继续承担风险。对平台来说,兼容不是免费美德,是长期税单。

《道德经》里讲“功成身退”。放在 asm.js 上,不玄。

它的功,是用标准 Web 技术打开了近原生性能的大门;它的退,是因为 WebAssembly 已经接走了门框、门锁和维护预算。

这件事也提醒开发者,不要把过渡方案当祖产。很多技术最危险的时刻,不是没人用,而是还有少量项目在用,却没人愿意为它继续付维护成本。平台方迟早会算账。

接下来最该看两件事。

一是 Mozilla 什么时候真正删除相关代码。默认禁用还留回旋余地,移除代码才是账本清零。

二是老项目迁移时暴露出多少构建债。asm.js 内容还能跑,所以短期不会逼出大面积故障;但还在依赖这条路径的项目,会越来越像站在旧码头等船。

这不是 Firefox 放弃高性能 Web。恰恰相反,是高性能 Web 不再需要 asm.js 证明自己。

旧通道关门,舞台没塌。只是主角已经换成 WebAssembly。