Vercel Labs 发布了 scriptc,这是一个实验性的 Apache 2.0 许可编译器,可将普通 TypeScript 转换为小型本机可执行文件,而二进制文件中无需 Node、V8 和 JavaScript 引擎。
该存储库于 2026 年 7 月 22 日创建,自那时以来,它已收集了约 4900 颗恒星。 scriptc 使用真正的 TypeScript 编译器来解析和类型检查,将程序降级为类型化 IR,然后通过 WASI Preview 1 输出 C、LLVM IR、程序集、对象、本机可执行文件或 WebAssembly。
每个构建都部署在三层之一:默认情况下静态编译,在大约 620KB 的内置 Quickjs-ng 引擎中动态编译 --dynamic 被传递给 npm 包并且 any 输入或编译时代码会被 SC 代码和重写提示拒绝。
针对 Bun 1.3.12 和 Node 24.18.0 对 scriptc 0.0.16 进行基准测试,记录了中间 CLI 启动时间,而 Bun 为 21.29 毫秒,Node 为 61.78 毫秒,空闲帧有 1.9MB 空闲内存 node:http 服务器同样的测试发现Hono需要 --dynamic将 62% 的服务器转移到 QuickJS,并将吞吐量降低至每秒 18.4k 请求,而 Bun 为每秒 70.5k。
在 Hacker News 上,一位开发人员报告说,他们的结果比 Node 24 慢了大约 7.5 倍:
查看字节数组结果(最佳情况):即使 Claude 尝试进行一些脚本优化,scriptc 也比节点 24 慢约 7.5 倍。但可执行文件的启动速度快了 12 倍(1.5 毫秒 vs. 18.6 毫秒),使用的内存少了 72 倍(2.5 MB vs. 181 MB),并且是一个 370 KB 的可执行文件,没有运行时依赖性。
Philip Pizlo 表示,对所有数字使用浮点数并推迟整数推理“消除了 QuickJS 的一半问题”,并且依赖 QuickJS 不太适合性能项目,因为 any 足够受欢迎,以至于实际的节目都落到了岛上。
Simon Willison 指出,编码代理每周完成 918,000 行代码,并补充说,在不编写 C 或 Rust 的情况下构建小型、快速的二进制文件“似乎是一种有价值的能力”。
一位开发人员发现,覆盖范围在每个本地项目中都会产生数百个错误:
尽管它受到了讨厌,但我想我至少应该尝试一下,并在我现场的任何项目上尝试一下。对于它们中的每一个,覆盖都会产生数百个错误,因此它基本上是无用的。我知道我可以从头开始编写一个项目,不使用任何第三方库,并将其编译为二进制文件,但是为什么我不应该使用 Rust、Go、Zig、D、C、V、Ada、C++、Nim、Swift、Kotlin Native、Haskell…基本上任何旨在编译和编译良好的东西?
一个反复出现的担忧是寿命,评论员指出了 Vercell 的指数,该指数在开始工作几周后就停止接受承诺。 Remo Jansen 尝试自己编译 TypeScript 6 编译器,但因内部编译器错误而失败,尽管他测得冷启动时间为 3.6 毫秒,而 Node 的冷启动时间为 48.9 毫秒,计算时则慢得多,为 2.33 秒。
编译器需要 Node.js 24 或更高版本,并且 npm install -g scriptc应首先阅读限制页面文档故意差异:字符串存储为 UTF-8,内存被视为引用而不是垃圾收集, Object.keys 报告程序声明,以及 process.argv[0] 是 "scriptc"。 npm 依赖项手册中介绍了依赖项行为,包括实验性的依赖项行为 --npm-static 编译来自岛上的命名数据包的标志。
scriptc 面向 macOS、Linux、Windows 和 WASI Preview 1,由将 stdout、stderr 和输出字节与 Node 进行逐字节比较的差异测试驱动,并且仍然处于实验阶段。文档可在 scriptc.dev 中找到。