S

scriptc

SHA-256
6.2k stars·开发工具·已提供 SHA-256 校验码,下载后可自行核对文件完整性

将 TypeScript 编译为原生可执行文件和 WebAssembly 的实验性编译器,运行时无需安装 Node.js。

智能下载

下载 Download 版本

v0.3.6 · 77.6 MB

把 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 保护,使读取回退到静态方法。

来源 Issue #963
故障排除
在 scriptc 中通过接口类型的接收者调用泛型方法时,如何修复 SC1090 错误?

SC1090 表示编译器无法静态证明接收者的运行时类,而这是必需的,因为泛型方法采用静态分派。当对象经过 any 再被转换回接口时会出现这种情况(例如 const restored = erased as GenericIdentity; restored.id(42))。此模式目前尚不受支持(功能请求 #905)。解决方法:(1) 在原始类型化对象被擦除为 any 之前,直接对其调用泛型方法——通过原始对象直接调用是受支持的。(2) 对于类实例,将接收者绑定到一个用其 new 表达式初始化的 const,以便类可被证明:const r: GenericIdentity = new C(...)。注意:对于必须经过 any 或类型擦除存储往返的对象字面量上的泛型箭头函数属性,目前没有解决方法。

来源 Issue #905

标签

typescriptcompilernativewebassemblyjavascriptaot

快速上手

1

下载安装包

点击上方按钮下载对应系统的安装包

2

安装软件

双击下载的安装程序,按提示完成安装

3

先安装 Node.js 24 或更高版本及 npm

4

在终端运行 npm install -g scriptc 全局安装编译器

5

新建一个 TypeScript 文件,例如 hello.ts

安装指引
  1. 先安装 Node.js 24 或更高版本及 npm
  2. 在终端运行 npm install -g scriptc 全局安装编译器
  3. 新建一个 TypeScript 文件,例如 hello.ts
文件完整性

已提供 SHA-256 校验码,下载后可自行核对文件完整性

该校验码提取自 GitHub 官方 Release 页面

SHA256 校验码

e18724e690ed6f64f3de56eb990b5c5a4617638bef683356342f4e1894382741

该校验码提取自 GitHub Release 页面,下载后请自行核对文件完整性

本平台所有 SHA-256 校验码均提取自项目在 GitHub 官方 Release 页面发布的文件,未做任何修改。你可以通过 GitHub Releases 页面自行验证。

运维指引

卸载说明

在终端运行 npm uninstall -g scriptc 即可卸载。如果是从 GitHub Releases 手动下载的独立编译器压缩包,直接删除解压出的文件即可。已编译生成的可执行文件与编译器互不影响,可单独保留或删除。

无额外依赖

下载后即可直接使用,无需安装其他运行环境

项目信息
开源协议Apache-2.0
最后更新2026-10-21 00:36:34
GitHub 仓库官方网站

遇到问题?查看下方 FAQ

2 FAQs

相似推荐