scriptc 一个 TypeScript 原生编译器,把普通 TypeScript 代码直接编译成独立可执行文件,不需要 Node.js 或 V8 引擎。
scriptc
一个 TypeScript 原生编译器,把普通 TypeScript 代码直接编译成独立可执行文件,不需要 Node.js 或 V8 引擎。
早期实验性项目,热度挺高,小白鼠感兴趣可以试一下,哈哈😄
Github地址
https://github.com/vercel-labs/scriptc
功能特性
真正的零运行时。编译后的二进制自带所需全部能力,不依赖系统上装没装 Node.js。静态编译出来的文件大概 170-200KB,带动态回退的也就 3MB 左右,内存占用通常 1-4MB,跟 Node 动辄几十 MB 起步完全不是一个量级。
三档处理策略,不偷偷降级。能静态编译的默认走原生码;遇到搞不定的(比如用了
any类型、某些 npm 包),显式加--dynamic才会嵌入一个精简的 QuickJS 引擎(约 620KB),跨边界值自动做运行时校验,类型撒谎会抛TypeError而不是默默崩内存;再不行就直接报错,给具体错误码和改写建议,绝不静默错编。覆盖日常开发用的上的大部分东西。语言层面:类、闭包、泛型、联合类型与类型收窄、
async/await、异常、finally、解构、展开、getter/setter、迭代器、模板字符串、正则(用的是跟 QuickJS 同款的 ECMAScript 字节码解释器,按需链接)。标准库:字符串 UTF-16 精确语义、Array/Map/Set 的 JS 精确顺序和身份、JSON 带运行时校验的转换、Math、TypedArray、Buffer、Error 层级和类型化catch。Node API 支持相当全。
fs(同步和 Promise 版)、path、process、child_process管道流、os、crypto、url/URL、zlib、定时器和信号处理,自带无依赖事件循环。服务器端net、http、https、tls(内嵌 mbedTLS)、dgram、dns、fs.watch、readline都能用,正经代理服务器都能编过去。fetch和 WHATWG 流、Headers、AbortSignal也支持,走原生网络栈,重定向、gzip、超时取消、Node 风格的 error cause 都有,不绑 libcurl。npm 包能用,但得显式开动态模式。按 Node 自己的解析算法找包,用自带的
.d.ts做类型检查,JS 代码构建时直接打进二进制,运行时不再读node_modules。编译流程透明。TypeScript 源码先走 tsc 解析和类型检查,降到中间表示(IR),再生成 C 代码,最后 clang 编译成可执行文件。默认后端用 LLVM,C 后端永远保留,加
--backend c能输出带源码行标注的可读 C 代码。两个机制保正确性。一是差异测试:800 多个测试用例每个都在 Node 和原生二进制两边跑,stdout、stderr、退出码必须字节级一致,数字格式化也跟 JS 最短回退格式对齐,还拿一百万个 double 对 Node 做过模糊验证;服务器用真实客户端驱动两边对比。二是内存安全通道:整套测试在 AddressSanitizer 下再跑一遍,配引用计数审计,泄漏和 use-after-free 直接算构建失败。跟 Node 的已知差异(几十处,多是定时器内部和错误对象属性)全部编号文档,不静默偏差。
几个实用的逃生舱。
comptime(() => ...)在编译期隔离 VM 里跑 TypeScript,结果当字面量 bake 进二进制。--ffi做原生 FFI,TypeScript 声明对 C ABI 直接调用,链接静态库、对象文件、系统库,边界显式且长度限定。JSON.parse(...) as Config这种强制转换会插入运行时校验,路径不对会抛可捕获的错误告诉你具体哪错了,而不是瞎转。
说明一下
项目还在早期,GitHub 上约 2.2k star,文档站点有 Quickstart 和 Introduction 可以跟着走。Windows、macOS、Linux 都支持。


