Perry 使用 SWC 和 LLVM 直接将 TypeScript 编译为可执行文件
摘要
Perry 使用 SWC 和 LLVM 将 TypeScript 直接编译为原生可执行文件,生成无运行时依赖的小型二进制文件,支持所有主流平台和原生 UI 组件。
暂无内容
查看缓存全文
缓存时间: 2026/05/30 04:23
# Perry — TypeScript 到原生
来源:https://www.perryts.com/
v0.5.306 — 分代垃圾回收 + 默认惰性 JSON 磁带,在大多数基准测试中比 Node 和 Bun 更快
## 一套代码库。所有平台。原生性能。
Perry 将 TypeScript 编译为 macOS、iPadOS、iOS、Android、Linux、Windows、watchOS、tvOS、WebAssembly 和 Web 上的原生 GUI 和 CLI 应用。无需运行时。无需 Electron。只有原生二进制文件。
开始使用 (https://www.perryts.com/#installation)查看 GitHub (https://github.com/PerryTS/perry)
$perry compile main.ts
正在编译 main.ts...
✓ 编译成功:可执行文件 main (2.3 MB)
$./main
Hello, World!
## 为什么选择 Perry?
将 TypeScript 编译为原生应用所需的一切
### 无需运行时
生成独立的原生可执行文件。无需 Node.js、无需 V8、无需运行时依赖。只需一个可在任何地方运行的二进制文件。
### 快速编译
直接 TypeScript 到原生代码编译,使用 SWC 进行解析,LLVM 进行优化代码生成。无需中间 JavaScript。
### 小巧的二进制文件
输出的二进制文件通常为 2-5 MB。如果为 JS npm 包使用可选的 V8 运行时,则为 15-20 MB。更少的交付,更快的部署。
### 确定性构建
相同的输入,相同的二进制文件。跨机器、跨 CI 运行、跨团队可重现。没有神秘的重新构建。
### 全面的标准库
内置的 fs、path、crypto、os、Buffer、child_process 等原生实现。使用熟悉的 Node.js API。
### 可选的 V8 运行时
需要使用纯 JavaScript npm 包?启用 V8 运行时标志即可获得完整的 npm 生态系统兼容性。
### 25+ 原生 UI 组件
按钮、文本字段、文本区域、表格、画布、滚动视图、二维码、安全字段、启动画面等——全部编译为通过 AppKit、GTK4、Win32、UIKit 和 JNI 实现的真实平台组件。
### 编译时插件系统
模块在构建时组合——没有运行时插件开销,没有 IPC 边界。你的依赖在最终二进制文件中成为直接的原生函数调用。
### 真正的多线程
真正的 OS 线程,支持 parallelMap、parallelFilter 和 spawn。编译时安全性拒绝可变捕获——没有 SharedArrayBuffer、没有 workers,只有线程。
### 编译时国际化
自动字符串提取,30+ 语言环境的 CLDR 复数规则,编译时验证。翻译内容内置于二进制文件中,运行时查找几乎为零。
## 在每个平台上都是原生
Perry 将你的 TypeScript 编译为原生 UI 框架、WebAssembly 和 JavaScript——不是 Web 视图,不是 Electron。在每个平台以及 Web 上都是真正的原生组件。
## 从代码到应用商店
Perry 不仅编译你的应用——还将其送到用户手中。
### 构建与签名
从一条命令进行跨平台构建。自动处理 macOS、iOS、Android 和 Windows 的代码签名。无需与 Xcode 配置描述文件或 Android 密钥库纠缠。
### 分发
推送到 App Store、Play Store,或直接提供下载链接。Perry Publish 负责打包、公证和提交。
### 验证
由 Geisterhand 驱动。在所有 6 个平台上进行自动化 UI 测试。在用户告诉你应用出问题之前,就知道它在各处都能正常工作。
对开源项目免费。团队计划 (https://www.perryts.com/en/publish/)→ /publish
框架对比
## 唯一一个满足所有条件的框架
TypeScript 编译为原生代码。真正的平台组件。无运行时开销。
框架|语言|原生代码|原生组件|运行时开销
---|---|---|---|---
Perry★|AOT 编译为原生二进制文件|TypeScript|是|是|无
React Native|JIT / 运行时解释|JS / TypeScript|否|Hermes / V8 + 桥接|有
Flutter|AOT 编译,自定义渲染器|Dart|Dart VM + Skia 引擎|
KMP + Compose|Android 上 JVM,iOS 上原生|Kotlin|部分|Kotlin 运行时 + Skia|
Swift for Android|原生二进制,无共享 UI|Swift|无共享 UI|Android 上 Swift 运行时|
.NET MAUI|通过 Mono 部分 AOT|C#|部分|.NET / Mono 运行时|
NativeScript|JS 运行时,原生组件访问|JS / TypeScript|V8 / JavaScriptCore|
Ionic|原生包装中的 Web 应用|JS / TypeScript|WebView + Capacitor|
## 编写 TypeScript,交付原生
使用熟悉的 TypeScript 语法和 API。Perry 处理其余部分。
``
// hello.tsconst greeting = "Hello, World!";console.log(greeting);// 编译为 ~2MB 原生可执行文件// 无需运行时!
``
## 性能对比
原生编译带来无与伦比的效率
指标|Perry|Node.js|Bun
---|---|---|---
二进制大小|2-5 MB|~80 MB|~90 MB
启动时间|~1 ms|~30 ms|~10 ms
运行时依赖|无|Node.js|Bun
内存开销|极小|V8 + GC|JSC + GC
### 基准测试结果:最高快 18 倍
Perry v0.5.279 vs Node.js v25 — RUNS=11 中位数,Apple M1 Max(越小越好)
二进制大小越小越好
## 开始使用
安装 Perry 并开始将 TypeScript 编译为原生可执行文件
### 1 安装
`$ brew tap PerryTS/perry`
`$ brew install perry`
需要 Homebrew。支持 macOS arm64 和 x86_64。
### 2 使用
编译一个文件
`perry compile main.ts`
将 main.ts 编译为原生可执行文件
自定义输出
`perry compile main.ts -o myapp`
指定输出可执行文件名
带 V8 运行时
`perry compile main.ts --enable-js-runtime`
启用 V8 以兼容 JavaScript npm 包
检查兼容性
`perry check ./src`
验证 TypeScript 代码是否可用于原生编译
## 特性支持
全面的 TypeScript 和 Node.js API 覆盖
### 核心语言
- 数字:64 位浮点数 (f64)
- 字符串:UTF-8,所有常用方法
- 布尔值:true/false,逻辑运算符
- 数组:类型化数组和混合类型数组
- 对象:对象字面量和字段访问
- BigInt:256 位整数支持
- 枚举:数字枚举和字符串枚举
### 函数
- 函数声明:命名函数
- 箭头函数:() => {} 语法
- 默认参数:带默认值的参数
- 剩余参数:...args 语法
- 闭包:包括可变捕获
- 高阶函数:函数作为参数/返回值
- 异步/等待:异步函数支持
### 类
- 类声明:基本类语法
- 构造函数:带参数
- 私有字段 (#):ES2022 #privateField 语法
- 静态方法/字段:类级成员
- 存取器:get/set
- 继承:extends 关键字
- 父构造函数调用:super() 构造函数调用
### 类型系统
- 类型注解:显式类型声明
- 类型推断:自动类型检测
- 泛型:单态化(类似 Rust)
- 接口:接口声明
- 联合类型:string | number 支持
- 类型守卫:typeof 运算符
- 类型别名:type X = ... 声明
### 标准库
- fs:readFileSync、writeFileSync、existsSync 等
- path:join、dirname、basename、extname、resolve
- crypto:randomBytes、randomUUID、sha256、md5
- os:platform、arch、hostname、内存信息
- Buffer:from、alloc、toString、slice、copy
- child_process:execSync、spawnSync
- JSON/Math/Date:完整实现
## 30+ 原生 npm 包
受欢迎的 npm 包以原生 Rust 重新实现。无需 npm install、无需 node_modules,只有快速的原生代码。
### 数据库
mysql2pgmongodbbetter-sqlite3ioredis
### 安全
bcryptargon2jsonwebtokencrypto
### HTTP
httphttpsaxiosnode-fetchwsnodemailer
### 数据处理
cheeriosharpzliblodash
### 日期与时间
dayjsmomentdate-fnsnode-cron
### 工具
uuidnanoidslugifyvalidatordotenvrate-limiter-flexible
只需导入并使用——Perry 自动使用原生实现
## 工作原理
从 TypeScript 源码到原生可执行文件,只需几秒钟
HIR
变换单态化
想了解编译器底层如何工作?编译器内部原理 (https://www.perryts.com/en/internals/)
相似文章
Vercel 发布 Scriptc:TypeScript 到原生代码编译器,二进制文件不包含 JavaScript 引擎
Vercel Labs 发布了 Scriptc,这是一款编译器,能将普通 TypeScript 代码转换为小巧、快速的原生可执行文件,无需在二进制文件中包含 Node、V8 或任何 JavaScript 引擎。它支持 TypeScript 的大部分静态特性及 Node 的 API 接口。
@rauchg: 我使用 scriptc 将 𝚟𝚎𝚛𝚌𝚎𝚕 CLI TypeScript 编译为本机代码。难以置信。✓ 生成的二进制大小:1.28MB ✓ Sta…
Guillermo Rauch 使用 scriptc 将 Vercel CLI TypeScript 编译为本机代码,实现了 1.28MB 的二进制文件、1.5ms 的启动开销和 2.94s 的编译时间。scriptc 是一个用 TypeScript 编写的 TypeScript 到本机代码的编译器,完全兼容 Node.js。
Show HN: Clx – 通过C++20将Lua编译为本地可执行文件
Clx是一个跨平台的提前编译Lua编译器,通过C++20工具链生成独立的本地可执行文件,提供有竞争力的性能、小巧的二进制文件,并支持Lua 5.5。
microsoft/TypeScript
TypeScript 是一种用于大规模 JavaScript 应用的语言,它增加了可选类型。该仓库托管了 TypeScript 编译器及相关工具。
tw93/Pake
Pake 是一个命令行工具,使用Rust和Tauri将任意网页转换为原生桌面应用,提供轻量级(约5MB)的macOS、Windows和Linux版本。