TypeScript 已成为前端和 Node.js 生态的事实标准,全球超过 500 万开发者在使用。然而,TypeScript 的运行始终依赖外部运行时——Node.js、Bun 或浏览器引擎。这意味着即使是最简单的脚本,也需要部署整个运行时环境,带来数百 MB 的体积开销和不可忽视的启动延迟。
随着边缘计算、桌面应用和嵌入式场景的兴起,开发者迫切需要一种能直接产出原生二进制的方式。Deno 和 Bun 在运行时层面做了创新,但真正将 TypeScript 编译为原生可执行文件的工具仍然稀缺。
Perry 正是填补这一空白的答案。

什么是 Perry?
Perry(PerryTS/perry)是一个用 Rust 编写的原生 TypeScript 编译器。它直接将 TypeScript 源码编译为原生可执行文件——不需要 Node.js、Electron 或任何浏览器引擎,产出的是快速、小巧、可在任何平台独立运行的二进制文件。
一句话概括:Write TypeScript, ship native binaries.
当前版本:v0.5.152 | 语言:Rust | 许可证:开源

谁需要 Perry?
- 全栈/后端 TypeScript 开发者:希望部署独立二进制,无需打包 Node.js 运行时
- 桌面应用开发者:替代 Electron,用 TypeScript 写出 MB 级别的原生应用
- 游戏/图形开发者:使用 Bloom Engine(基于 Perry)用 TypeScript 编写跨平台游戏
- 边缘计算/IoT 场景:资源受限环境需要极小体积、极低内存占用的运行时
- CLI 工具开发者:希望分发单个可执行文件,用户无需安装任何依赖
Perry 的定位是 TypeScript 的原生编译基础设施。它不是另一个运行时(如 Deno/Bun),而是编译器——将 TypeScript 静态编译为机器码,彻底消除运行时依赖。

技术架构
- 前端编译器:基于 SWC 进行 TypeScript 解析和转译
- 代码生成后端:LLVM(v0.5.0 从 Cranelift 切换),负责原生机器码生成
- 语言实现:Rust,保证编译器本身的性能和安全性
- 核心优化:标量替换(不逃逸对象分解为寄存器字段)、内联 bump 分配器、fast-math 自动向量化、i32/i64 特化
核心功能
- 原生编译:
perry compile src/main.ts -o myapp→ 单个独立二进制 - 多平台支持:macOS(arm64/x64)、Linux(x64/arm64, glibc/musl)、Windows(x64)
- ES 模块 + npm 包支持:支持标准 ESM 导入和 npm 生态(fastify、express、mysql2 等)
- 极小体积:Hello World 仅 ~330KB,完整 stdlib 应用 ~48MB
- 按需链接:自动检测程序使用的运行时部分,只链接需要的代码
- 可选 V8 嵌入:--enable-js-runtime 可嵌入 V8 引擎(+15MB),用于需要动态 eval 的场景
独特优势
- 性能碾压:闭包调用 31 倍快于 Node.js,方法分发 11 倍,阶乘 19 倍
- 与编译型语言竞争:8 项跨语言基准中领先 5 项,与 Rust/C++/Go/Swift 同台竞技
- 编译时间友好:LLVM 仅增加 20-50ms,主要耗时在 SWC 解析和链接
- 真实项目验证:Bloom Engine(游戏引擎)、Mango(MongoDB GUI,~7MB)、Hone(AI 代码编辑器)
- 零运行时依赖:编译产物是独立二进制,无需目标机器安装任何环境

安装与使用
安装
# 项目内安装(推荐)
npm install @perryts/perry
# 全局安装
npm install -g @perryts/perry
# macOS Homebrew
brew install perryts/perry/perry
# 零安装直接运行
npx -y @perryts/perry compile src/main.ts -o myapp
快速开始
# 初始化项目
perry init my-project
cd my-project
# 编译为原生二进制
perry compile src/main.ts -o myapp
./myapp
# 编译并一步运行
perry run .
真实示例:API 服务器
import fastify from 'fastify';
import { getUsers, getUserById } from './routes/users';
const app = fastify();
app.get('/api/users', async () => {
return getUsers();
});
app.get('/api/users/:id', async (request) => {
const { id } = request.params as { id: string };
return getUserById(parseInt(id));
});
app.listen({ port: 3000 }, () => {
console.log('Server running on port 3000');
});
编译命令:perry compile src/main.ts -o my-api && ./my-api,产出独立二进制,运行时无需 node_modules。
应用场景
- 桌面应用:替代 Electron,Mango(MongoDB GUI)仅 ~7MB
- 游戏开发:Bloom Engine 支持 Metal/DirectX 12/Vulkan
- 后端 API:Fastify/Express/NestJS 等框架均可编译为原生二进制部署
- CLI 工具分发:单个可执行文件,用户无需安装 Node.js
- 边缘计算/IoT:极小体积和低内存占用
- AI 工具:Hone 是基于 Perry 的 AI 原生代码编辑器
总结
Perry 代表了一种全新的思路:TypeScript 不应该被绑定在运行时上。通过 Rust + SWC + LLVM 的技术栈,它实现了将 TypeScript 编译为原生可执行文件的目标,在性能、体积和启动速度上全面超越传统运行时方案。
虽然项目仍处于早期阶段(v0.5.x),但已有多个真实应用验证了其可行性。如果你正在寻找一种用 TypeScript 编写原生程序的方式,Perry 值得重点关注。
项目地址:https://github.com/PerryTS/perry