2025年7月14日,知名云平台公司 Vercel 在官方博客中正式发布了名为 Scriptc 的全新编译器项目,瞬间在开发者社区引发热议。Scriptc 的核心突破在于:它能够将 TypeScript 代码直接编译为原生机器码(Native Binary),而生成的二进制文件中完全不包含任何 JavaScript 引擎。这意味着,未来的 TypeScript 应用可以像 C++ 或 Rust 程序一样,以极小的体积和零运行时依赖独立运行。
从“解释执行”到“原生编译”:TypeScript 的性能革命
TypeScript 作为 JavaScript 的超集,凭借类型安全性和现代语法特性,已经成为后端服务、前端工具乃至 CLI 应用的主流选择。然而,无论是 Node.js、Deno 还是 Bun,TypeScript 代码最终仍需通过 JavaScript 引擎(如 V8、JavaScriptCore)解释或 JIT 编译执行。这种运行时依赖带来了两个核心痛点:
- 启动延迟:每次运行都需要初始化引擎、加载依赖、解析代码(即使有 JIT 预热),导致冷启动时间通常在数十毫秒甚至秒级。
- 内存与体积膨胀:一个简单的 CLI 工具打包后往往超过 20 MB,其中大部分是引擎和标准库的二进制代码。
Scriptc 的登场直接挑战了这一范式。它采用 AOT(Ahead-of-Time)编译 策略,将 TypeScript 的类型信息、控制流和数据结构直接映射到低级中间表示(IR),最终通过 LLVM 后端生成本地机器码。Vercel 官方宣称,Scriptc 编译后的二进制文件体积仅为同类 Node.js 应用的 1/5 到 1/10,启动速度则提升了 50 倍以上。
技术揭秘:如何“抛弃” JavaScript 引擎?
Scriptc 并非第一个尝试编译 TypeScript 的项目,早前有 AssemblyScript(将 TypeScript 子集编译为 WebAssembly)、TypeScript Compiler API 的“--emitDeclarationsOnly”等方案,但它们要么限制过多,要么仍依赖宿主运行时。Scriptc 的不同之处在于,它针对的是 全静态 TypeScript 子集。
根据 Vercel 的技术文档,Scriptc 要求开发者遵循以下约束:
- 禁止使用
eval()、Function()等动态代码生成; - 禁止使用
any、object等非具体化的动态类型; - 部分运行时特性如
Reflect、Proxy和动态模块加载需要显式声明。
作为回报,Scriptc 能利用 TypeScript 编译期的类型信息进行深度优化:例如,将接口调用直接内联为函数指针跳转,将泛型容器替换为定长数组或结构体,甚至根据 never 类型消除不可达分支。最终输出的 ELF 或 PE 可执行文件,其运行效率接近同等逻辑的 C++ 实现。
应用场景:边缘计算与工具链的降维打击
Scriptc 的诞生并非偶然。Vercel 作为边缘计算平台的领导者,其 Edge Functions 一直以来受限于 JavaScript 引擎的冷启动问题。据 Vercel 官方数据,即使经过优化,一个简单的 HTTP 处理函数在冷启动时仍需 20~30ms 的引擎预热时间。而 Scriptc 编译的原生二进制,冷启动时间可压缩至 微秒级,内存占用从数十 MB 降至不足 1 MB。
这意味着在以下场景中,Scriptc 将极具竞争力:
- 高并发微服务:无需维护昂贵的运行时线程池,每个请求直接 fork 一个轻量进程执行。
- CLI 工具:发布一个单文件二进制,用户无需安装 Node.js 即可运行,如
npm install -g时代的终结。 - 物联网与嵌入式:TypeScript 代码可直接运行在 ARM Cortex-M 芯片上,无需裁剪 V8。
- 安全敏感环境:无
eval和动态注入风险,符合 SOC 2、FedRAMP 等合规要求。
生态与挑战:TypeScript 的“分叉”开始了?
尽管 Scriptc 前景诱人,但它的局限性同样明显。最大的问题在于 生态兼容性。目前 npm 上超过 90% 的包都依赖动态特性和运行时 API(如 require 的动态循环、process.nextTick、EventEmitter 等)。Scriptc 必须重新实现一个 精简的标准库(涵盖文件系统、网络、定时器等),且只支持同步或 async/await 版本,不支持回调式地狱。
此外,TypeScript 的动态类型特性(如联合类型的运行时判别、装饰器元编程)在编译期无法完全确定,需要引入额外的运行时类型表,这会部分抵消性能优势。Vercel 团队表示,Scriptc 会优先支持 “保守型” TypeScript 子集,并计划逐步开放可选的运行时特性开关。
另一位业内人士则指出,Scriptc 可能迫使 TypeScript 社区出现“两个分支”:一个继续拥抱完整动态能力(对应 Node.js 生态),另一个转向严格静态编译(对应 Scriptc 生态)。类似“TypeScript”与“AssemblyScript”的关系,但 Scriptc 更贴近原生。
未来展望:Vercel 的“野心”不止于此
结合 Vercel 近期收购 Turborepo、推出 Next.js 14 编译器等一系列动作,Scriptc 很可能会被深度整合到其边缘平台中。届时,开发者只需编写常规 TypeScript,部署后自动被 Scriptc 编译为原生二进制,彻底消除冷启动问题。Vercel 还可能将 Scriptc 作为开源项目发布,以吸引社区贡献库的适配。
在 Deno 凭借“现代 JavaScript 运行时”快速崛起、Bun 以“自研 JavaScript 引擎”挑战霸权的今天,Vercel 跳出“运行时竞争”的思维定式,用编译型 TypeScript 开辟了一条全新的赛道。无论最终成功与否,Scriptc 都已向业界证明:TypeScript 的未来,或许并不需要 JavaScript 引擎。
注:本文基于 Vercel 2025年7月14日官方技术公告及行业分析综合撰写,部分技术细节为推测性描述,具体实现以官方文档为准。