为什么需要
独立开发者用 TypeScript 写 CLI 工具或者小工具时,分发是个麻烦事:要么让用户装 Node.js(90% 的人嫌麻烦会放弃),要么用 pkg、nexe 这些老方案打包(动辄几十 MB,还要带 V8 引擎,启动 100ms+)。scriptc 走了另一条路——把 TypeScript 真正编译成原生机器码,输出 178 KB 大小、2ms 启动的自包含二进制。
这意味着:你写 TypeScript,用 Node 一致的方式运行,然后 scriptc build 一下,得到的就是用户在 macOS arm64 上双击就能跑的可执行文件——没有运行时依赖、没有 V8 引擎、没有 ~40 MB 的 bundle。
怎么用
bash
# 安装(需要 clang,Xcode Command Line Tools 自带)
npm install -g scriptc
# 直接运行 TypeScript(无需先编译)
scriptc run app.ts
# 编译成原生二进制
scriptc build app.ts && ls -la app
# -rwxr-xr-x 178K app
# 查看静态覆盖率(哪些代码被原生编译,哪些需要运行时 fallback)
scriptc coverage app.ts
主平台是 macOS arm64,Linux 和 Windows 通过交叉编译支持,每个平台都有独立的 differential test lane。
使用案例
独立开发者用 TypeScript 写了一个图片压缩 CLI 工具,原本分发方式是让用户 npx img-min——很多海外用户看到 npx 警告就走了。换成 scriptc 编译:单文件 178 KB,下载即用,不需要 Node.js,用户群转化率立刻提升。
另一个场景:内部团队的运维小工具。脚本几十个 KB,过去要么靠服务器跑、要么分发 Node 项目,现在直接编译成二进制扔到 GitHub Releases。
注意事项
- 免费开源,npm 一行安装
- macOS arm64 是一等公民;Linux/Windows 通过交叉编译
- 99% 静态覆盖率(剩下的 1% 会回退到 JS,需要
scriptc coverage看 blockers) - TypeScript 用的是官方 tsc 做类型检查,编译后行为和 Node 完全一致
- 当前还在早期,复杂依赖(动态 require、某些 Promise 行为)可能需要额外标注