大家好,我是何三,独立开发者
说到 TypeScript,你脑子里蹦出来的第一件事是啥?
大概率是 Node.js、npm run dev、还有那个比黑洞还沉的 node_modules。
今天聊的这个项目,直接把这些全扔了。
Perry——一个用 Rust 写的 TypeScript 原生编译器。它把你的 TS 代码直接编译成原生二进制文件,不用 Node.js,不用 Electron,不用任何运行时。
就一个单文件,跑哪都行。
重点是——性能炸得很离谱。

根据官方 benchmark,Perry 比 Node.js 快 1.1x 到 31x。闭包调用快 31 倍,阶乘运算快 19 倍,数学运算快 3.7 倍。
更离谱的是,在某些场景下它跟 Rust、C++ 打得有来有回。
一个 TypeScript 编译器,性能逼近 C++?
这听着不太对劲,但它就是真的。

原理其实没那么玄乎
Perry 的技术栈就两样东西:SWC 解析 TypeScript, LLVM 生成机器码。
SWC 是 Vercel 家出的 Rust 版 JS/TS 解析器,跑得飞快。Perry 用它把你的 TS 代码解析成中间表示。
然后 LLVM 上场——就是 Clang 用的那个 LLVM,它把中间表示转成机器码。
说白了,你的 TypeScript 代码走了一条完全不同的路:不是交给 Node.js 去解释执行,而是像 C++ 一样被编译成本地机器码。
这就带来了 C++ 级别的优化:标量替换(对象字段变寄存器)、自动向量化(SIMD 指令)、循环展开、内联分配器……
哦对,它还做了个骚操作叫 NaN-boxing——所有值都塞进 64 位字里,数字不用装箱拆箱。
说到这个我想起来一个事。之前有个段子说,JS 开发者最怕听到的词就是"装箱",因为一听就觉得慢。Perry 直接把这个烦恼给抹掉了——你的数字在底层就是原生数字,根本不存在"箱"这回事。
原理大概是这样,细节我可能说得不精确——有懂 LLVM 的大佬欢迎评论区指正。
装一个试试,20 秒出活
安装方式多得离谱:
# npm 全局装
npm install -g @perryts/perry
# macOS 用户
brew install perryts/perry/perry
# Windows 用户
winget install PerryTS.Perry
装完写个 hello:
// main.ts
console.log("Hello, world!");
编译:
perry compile src/main.ts -o myapp
./myapp
输出一个 330KB 的单文件。没有 node_modules,没有运行时依赖。
330KB 是什么概念?一个空 Node.js 项目光 package.json + node_modules 就不止这个数。
一个装了 fastify 的全栈 API 项目,编译出来也就 48MB 左右。对比一下 Node.js 项目——同样的依赖,node_modules 随随便便 200MB+。
——等等,这个压缩率是不是算错了?应该没有,Perry 只链接你用到的代码。
不只是能跑 Hello World
Perry 能干的事儿比你想的多得多:
完整的 TypeScript 语法:类、泛型、async/await、generator —— 除了装饰器,基本都支持。
npm 包原生编译:fastify、mysql2、pg、ioredis、bcrypt、jsonwebtoken 这些热门包,都在 Rust 层面原生实现了,不走 V8 解释器。
原生 UI 系统:perry/ui 模块,写一套代码编译出 macOS(AppKit)、Windows(Win32)、Linux(GTK4)、iOS、Android 的原生界面。没有 Electron,没有 WebView。
给你们看个例子——用 Perry 写原生 UI:
import { App, VStack, HStack, Text, Button, Spacer } from 'perry/ui';
const content = VStack(16, [
Text("Welcome back!"),
Spacer(),
Button("Save", () => {})
]);
App({ title: 'My App', width: 800, height: 500, body: content });
然后 perry compile —— 出来一个原生 macOS 应用。没 Electron 那几百 MB 的屎山包袱。
跨平台编译:一套代码,macOS、Windows、Linux、iOS、Android、Web(通过 JS/WASM 代码生成),全平台覆盖。
多线程:perry/thread 模块,真正的 OS 线程,编译时保证安全。
说实话,Perry 不只是个编译器。它是一个完整的"TypeScript 原生应用开发平台"。
跟 Bun 比,有什么区别?
Bun 我也写过——也是 Rust 写的,也很快。
但路线完全不一样:
- Bun 是一个 JavaScript 运行时,解释执行 + JIT 编译
- Perry 是一个原生编译器,AOT(提前编译),输出二进制
Bun 再快,你还是要装 runtime,还是要跑 bun run。Perry 编译出来的东西,直接 ./app 就能跑,不需要任何外部依赖。
打个不恰当的比方:
Bun 是"比 Node.js 快的 Node.js 替代品"。 Perry 是"让 TypeScript 像 C++ 一样编译执行"。
哪个更颠覆?你自己品。
Perry 目前还是 v0.5.x,Star 数 2,197(约 2200+),生态还在建设中。有些冷门 npm 包还不能原生编译,得走 V8 运行时兜底。文档怎么说呢……作者是 Rust 老哥写的那种,很硬核,但对新手不太友好。
但方向完全对。
让 TypeScript 拥有原生性能——这件事本身就足够让人兴奋。想想看:以后前端同学写个后端服务,不用碰 C++/Rust,就能拿到接近 C++ 的性能。
这比语言本身的速度重要得多。
以前你要写高性能服务,你得学 Rust、学 C++、跟 borrow checker 搏斗。现在你写 TypeScript 就能搞定——用你熟悉的语法,拿到你不敢想的性能。
至少我决定在自己的下一个项目上试试 Perry。
GitHub 地址:https://github.com/PerryTS/perry
本文使用 MGO 编辑并发布
关注"何三笔记",回复"mgo" 免费下载使用