开发工具#开源#CLI#编译器#TypeScript#WASM
scriptc:把 TypeScript 编译成原生可执行文件的实验编译器
Vercel Labs 实验编译器 scriptc 把 TS/JS 编译成不依赖 Node 的原生二进制与 WASI 模块,适合分发 CLI 与小型服务。
项目资料
GitHub Ecosystem- 许可证
- Apache-2.0
- 主语言
- TypeScript
- 星标
- 5,576
- 核查时间
- 2026-09-28
以上快照资料以核查当日为准,可能随版本或运营策略变化。
给同事发一个 Node 小工具,对方还得先装运行时——分发 JS 程序的这层别扭,Vercel Labs 的实验性编译器 scriptc 想直接消掉:它把 TypeScript/JavaScript 编译成独立的原生可执行文件,产物不再需要 Node 或任何 JS 引擎。编译链路是 TS/JS 到类型化 IR,再到可读的 C,然后走 LLVM 出机器码,也支持编译到 WASI 模块。仓库 7 月创建,截至 2026-09-28 约 5,576 星,当天仍在推送提交。
核心功能
- 静态编译:TS/JS → 类型化 IR → C → LLVM IR → 汇编 → 目标文件 → 原生可执行文件;产物内含一个小型原生运行时,但没有 Node 或 JS 引擎。
- 编译不了就报错:无法静态编译的代码会作为诊断信息报出来,而不是悄悄生成坏产物;对 npm 包和
any类型代码,--dynamic会显式内嵌 quickjs-ng。 - Node API 覆盖:原生支持相当一部分 Node 内置模块(如
node:http),普通服务器脚本多数能直接编过。 - WASM 输出:可编译为 WASI Preview 1 模块,跨平台分发多一条路。
- 分层降级:
--emit=ir|c|llvm只需要 Node;汇编与目标文件层用平台辅助工具完成,普通可执行文件构建也不需要完整 C 工具链。
典型使用场景
- 写了个好用的 CLI,想让没装 Node 的同事一键运行。
- 小型 HTTP 服务要塞进容器或边缘设备,不想带 100 多 MB 的运行时。
- 内部工具要发给非技术同事,又不想起「先装环境」的对话。
快速上手
要求 Node.js 24 及以上(编译器本身用 Node 跑,产物不需要):
npm install -g scriptc
写个 hello.ts,一步编译并运行:
$ scriptc run hello.ts
hello, world
或产出独立可执行文件:
$ scriptc build hello.ts -o hello
$ ./hello ctate
hello, ctate
小结
适合要把 JS/TS 程序做成「单个文件」分发的开发者:CLI 作者、写内部工具的前后端、给边缘设备交付小服务的人。它不是要替代 Node——长驻大型应用、重度依赖动态特性的代码仍然编不了或要退到 --dynamic。项目明确标注实验阶段,Apache-2.0 许可,主要语言 TypeScript;正式使用前先在自己的真实代码上跑一遍 --emit=ir 看覆盖率,再决定要不要进构建流程。