scriptc
SHA-256将 TypeScript 编译为原生可执行文件和 WebAssembly 的实验性编译器,运行时无需安装 Node.js。
把 TypeScript 直接编译成原生程序的编译器
核心功能
- 将 TypeScript/JavaScript 编译为真正的原生可执行文件
- 支持输出 WebAssembly(WASI)模块
- 编译产物无需安装 Node.js 即可运行
- npm 依赖随代码一起编译,运行时不再读取 node_modules
- 内置 coverage 命令,提前检测代码可编译比例并给出改写建议
避坑指南
- •注意避坑:这是实验性项目,只支持 JavaScript、TypeScript 和 Node.js API 的子集,eval 等动态特性无法编译;并非所有 npm 包都能编译,引入前先用 scriptc coverage 检查;构建可执行文件需要系统装有链接器和平台 SDK,Windows 下需生成 hello.exe 并以 .\hello.exe 运行;运行 WASI 模块时仍需 Node.js;不建议直接用于关键生产环境,接口可能随版本变动。
适用场景
- 把命令行工具打包成单个可执行文件,分发给没装 Node.js 的用户
- 构建轻量的原生 HTTP 服务,部署到服务器或精简容器
- 生成可嵌入外部构建系统的 WASI 模块
- 在一台机器上交叉编译 macOS、Linux、Windows 三平台程序
详细介绍
scriptc 是 Vercel Labs 的实验性编译器,可将 TypeScript 和 JavaScript 编译为原生可执行文件及 WebAssembly 模块。它借助 TypeScript 的类型信息直接生成机器码,产物运行时无需安装 Node.js。与 Bun、Deno 的“打包运行时”方案不同,scriptc 是真正的 AOT 编译,二进制更轻、更纯粹;npm 依赖也会随代码一起编译,不再读取 node_modules。目前仅支持 JS/TS 与 Node API 的子集,建议先用 scriptc coverage 检测代码的可编译比例。支持 macOS、Linux、Windows,可交叉编译,并能通过原生 FFI 调用 C 函数。
常见问题与排障 (2)
故障排除为什么泛型类方法在编译后的二进制文件中抛出 'TypeError: x is not a function',但在 Node 中却能正常运行?
已知编译器 bug(v0.3.0,issue #963)。在泛型类实例上的任何位置进行计算键写入,例如使用非字面量键的 (obj as any)[key] = fn,会使方法名普查将该类的方法降级到 prototypeMethodAccesses 中。降级后的代码随后会在没有 dyn.hasKey 保护的情况下读取每个实例的动态属性包,而 classPrototypeData 对泛型/泛型实例类返回 null,因此不存在原型回退:属性包读取得到 undefined,调用随即抛出异常。非泛型类不受影响,因为它们会获得原型数据辅助函数。
在编译器修复落地之前的变通方法:
1. 消除泛型类实例上的动态键写入 —— 将外部元数据存储在单独的 Map/旁表中,或使用字面量属性赋值代替 obj[expr] = value。
2. 如果可行,去掉类型参数(使用具体类型代替 Ctx<T>),使该类通过非泛型路径编译,该路径会构建原型数据辅助函数并正确解析方法。
正在讨论的编译器端修复方向:为泛型实例生成原型数据,使属性包读取拥有回退方案;或者为泛型类的方法保留 dyn.hasKey 保护,使读取回退到静态方法。
故障排除在 scriptc 中通过接口类型的接收者调用泛型方法时,如何修复 SC1090 错误?
SC1090 表示编译器无法静态证明接收者的运行时类,而这是必需的,因为泛型方法采用静态分派。当对象经过 any 再被转换回接口时会出现这种情况(例如 const restored = erased as GenericIdentity; restored.id(42))。此模式目前尚不受支持(功能请求 #905)。解决方法:(1) 在原始类型化对象被擦除为 any 之前,直接对其调用泛型方法——通过原始对象直接调用是受支持的。(2) 对于类实例,将接收者绑定到一个用其 new 表达式初始化的 const,以便类可被证明:const r: GenericIdentity = new C(...)。注意:对于必须经过 any 或类型擦除存储往返的对象字面量上的泛型箭头函数属性,目前没有解决方法。
标签
快速上手
安装软件
双击下载的安装程序,按提示完成安装
先安装 Node.js 24 或更高版本及 npm
在终端运行 npm install -g scriptc 全局安装编译器
新建一个 TypeScript 文件,例如 hello.ts
- 先安装 Node.js 24 或更高版本及 npm
- 在终端运行 npm install -g scriptc 全局安装编译器
- 新建一个 TypeScript 文件,例如 hello.ts
已提供 SHA-256 校验码,下载后可自行核对文件完整性
该校验码提取自 GitHub 官方 Release 页面
SHA256 校验码
e18724e690ed6f64f3de56eb990b5c5a4617638bef683356342f4e1894382741该校验码提取自 GitHub Release 页面,下载后请自行核对文件完整性
本平台所有 SHA-256 校验码均提取自项目在 GitHub 官方 Release 页面发布的文件,未做任何修改。你可以通过 GitHub Releases 页面自行验证。
开源透明
查看 GitHub 源码卸载说明
在终端运行 npm uninstall -g scriptc 即可卸载。如果是从 GitHub Releases 手动下载的独立编译器压缩包,直接删除解压出的文件即可。已编译生成的可执行文件与编译器互不影响,可单独保留或删除。
无额外依赖
下载后即可直接使用,无需安装其他运行环境
遇到问题?查看下方 FAQ
2 FAQs