一行 console.log(“hello world”) 只有几十字节,但跑起来要拖上整个运行时。Node.js 打包几十 MB 起步,上百 MB 不稀奇。Serverless 冷启动慢、边缘计算资源紧、IoT 设备扛不住、CLI 工具下载开销高,这些问题都指向同一个根因:JS 甩不掉 Runtime。
Porffor 想做的事很直接:让 JavaScript 不经过运行时,直接编译成轻量原生二进制。
Porffor 不是新 Runtime,是 AOT 编译器
别把它和 Bun、Deno 放在一起比谁快。Porffor 的定位是 JavaScript AOT 提前编译器,不抢运行时性能的赛道。
传统链路:JavaScript → Runtime → 执行。Porffor 链路:JavaScript → AOT 编译 → WebAssembly / 原生二进制 → 直接运行。
运行 node app.js 时,代码先进 Node,再交给 V8。V8 解释、JIT 即时编译、动态调优,最后产出机器码。动态调优让 JS 跑得够快,代价是必须携带完整运行环境。一个小 JS 命令行工具,发布包通常要把业务代码、Node 运行时、依赖整体打包,体积自然涨。
Go、Rust 做 CLI 工具受欢迎,核心原因就是编译完是单个可执行文件,不需要额外虚拟机。JS 始终背着 Runtime 这个包袱。
它到底怎么把 90MB 压到 100KB
官方定义:Porffor 是一个实验性编译器,能把 JavaScript、TypeScript 编译为 WebAssembly 与基础原生二进制文件。
这里有个关键区别。市面上不少 JS 转 Wasm 工具,实质是把完整 JS 解释器打包进 Wasm 产物,输出文件依旧巨大。Porffor 不走打包引擎这条路,它尝试对 JS 源码做静态编译,不塞入整套运行时,文件体积才能断崖式下降。
官方放出的数据:老牌 JS 打包后的原生程序约 90MB,经 Porffor 编译后产物能小于 100KB,压缩接近千倍。
编译体验贴近系统语言。Rust 执行 cargo build,Go 执行 go build,Porffor 一行就够:
直接输出 exe 或对应平台的原生可执行程序。它原生支持 TypeScript 输入,不需要额外配 tsconfig,也不用引入打包工具做预处理。
输出 Wasm 也是同样一条命令的形式,把目标换成 wasm 即可。这套能力打开了不少场景:边缘运行时启动更快、内存占用更低;Serverless 不再需要初始化完整 JS 运行环境,直接执行机器码;CLI 工具能产出单文件,拥有和 Go 一致的分发体验。
和 Bun、Deno 根本不在一条路上
很多人第一反应:这是不是 Node 的替代品?三者路径完全不一样。
Node.js 是成熟 JS 运行时。Bun 是高表现 JS 运行时,目标是替代 Node。Deno 是重新构建 Runtime,解决 Node 遗留的历史问题。Porffor 根本不做运行时,目的是让 JS 不再依赖 Runtime,直接编译输出二进制。
现在别上生产,原因不只是”实验性”
Porffor 当前依旧属于实验工程,还没到生产可用阶段,官方也在持续补齐 JavaScript 基准兼容性。
原因不难理解:JS 语言本身太弹性。动态类型、eval、原型链、运行时反射,这些特性对静态 AOT 编译来说每一项都是硬骨头。现阶段它更偏前沿技术研究,不能拿来直接替换 Node。
这里有个坑要提醒:即使某个 JS 文件能被 Porffor 成功编译,也不代表语义和 V8 下一致。动态类型推导在边界情况下容易出偏差,涉及 eval、Proxy、Reflect 的代码基本可以放弃。
那怎么验证一个脚本是否适合 Porffor?实操上可以这样判断:先用 node 跑一遍拿到预期输出,再用 Porffor 编译后的产物跑同一份输入,逐字节 diff 输出。判定标准很简单——只要有一处输出不一致,就说明这段代码踩到了静态编译无法覆盖的语义,不要抱侥幸心理上生产。
另外,Porffor 目前对 Node 内置模块的支持非常有限,fs、path、http 这类模块在原生二进制目标下基本不可用。也就是说,它适合的是纯计算型的独立脚本,不是需要文件系统或网络能力的服务端程序。这个边界不搞清楚,很容易在选型时误判。
值得关注的产业信号
JS 最大的长处是开发效率高、生态庞大、上手门槛低,短板是依赖运行环境、包体积臃肿、启动慢。Rust、Go 的长处恰恰是编译输出独立程序,上线简便轻便。
Porffor 代表一种动向:JavaScript 将来或许能兼顾优秀开发体验与接近系统语言的上线形态。
过去几年产业争论大多围绕 Runtime 性能:Node 对比 Bun,Node 对比 Deno。Porffor 抛出另一个命题:将来的竞争未必是谁的 Runtime 跑得更快,而是能不能尽可能摆脱 Runtime 本身。
编程语言的进化路线很清楚:解释执行 → JIT 即时编译 → AOT 提前编译。JavaScript 正在尝试跨入下一个阶段。
Porffor 暂时不会颠覆当下前端、后端的开发方式,但它完成了一次极具意义的校验:以往大家觉得几乎不可能的事,JavaScript 也能编译成轻量原生二进制文件。90MB 压缩至 100KB、JS/TS 直接输出 Wasm、输出单文件可执行程序,这些研究近期内不会彻底改变现有开发习惯,但打开了全新想象空间。
将来 JavaScript 的舞台,或许不再局限于浏览器与服务器,还能跑在边缘设备、嵌入式芯片,跑在一切能运行 C 程序的硬件之上。