引言:跨平台开发的“ navigator ”困境

如果你是一名全栈或桌面端开发者,过去几年你可能一直在做一道看似无解的选择题:既要Web生态的高效,又要原生应用的性能

我们尝试过Electron,它让我们把Web页面塞进浏览器壳子,换来了巨大的包体积和数百毫秒的启动延迟。我们也尝试过React Native,它在JS与原生之间架起了Bridge,但在复杂交互下总有那么一点“卡顿感”。Flutter虽然性能出色,但它自研RenderObject,与系统原生UI之间仿佛隔着一层“翻译官”。

这些方案的底层逻辑,都是在用脚本语言去适配原生环境。那么,我们有没有想过换一个问题来回答?

图片

为什么一定要“运行” TypeScript?能不能直接“编译”它?

这就是 Perry 给出的答案。

Perry 是一个用 Rust 编写的原生 TypeScript 编译器。它不依赖 Node.js,不嵌入 V8 引擎,也不需要用户安装任何运行时。它的目标很直接:把你写好的 TypeScript 代码,直接变成可执行文件。

图片

一、 Perry 的破局:从“解释运行”到“机器码”

1. 核心理念

Perry 改变了 TypeScript 的执行范式。

  • 传统 Node.js 流程TS源码 → 编译为JS → Node.js(V8引擎) → 操作系统
  • Perry 流程TS源码 → SWC解析 → LLVM/Cranelift → 原生二进制

在 Perry 中,TypeScript 第一次不再是“参与”跨平台开发,而是试图成为 “原生应用的生产语言”

2. 技术架构:站在巨人的肩膀上

Perry 没有选择从零开始造轮子,而是巧妙地组合了 Rust 生态中最优秀的工具:

  1. SWC 解析:利用 Speedy Web Compiler 进行极快的 TypeScript 代码解析和词法分析。这是 Next.js 和 Deno 都在使用的同款核心。
  2. HIR 中间表示:将 AST 转换为高级中间表示,在此阶段执行类型分析和优化(如循环不变量代码移动 LICM)。
  3. Cranelift 生成:利用 Cranelift 作为后端,生成高效的机器码。Cranelift 以其较快的编译速度和适中的优化水平著称,非常适合这种场景。

3. 难点攻克:NaN-Boxing 与 GC

TypeScript 是一门带垃圾回收的语言,直接编译成二进制并不容易。Perry 并没有简单地嫁接 V8 或 JVM 的 GC,而是实现了轻量级方案:

  • NaN-Boxing 技术:针对 string | number 这类联合类型,Perry 利用 64 位浮点数中未使用的“NaN 空间”来存储类型信息,极大地优化了动态类型的存取效率。
  • 保守式垃圾回收:对于长时间运行的后台服务,Perry 实现了 Mark-Sweep GC,确保了内存不会无限增长。

直观的数据对比: 同样一个 CLI 工具,Node.js 版本需要附带 80MB 的运行时,冷启动耗时约 300ms;而 Perry 编译出的产物仅有 2-5MB,启动时间缩短至 1ms 以内,执行速度甚至比 Node.js 快了 2.2 倍


图片

二、 UI 跨平台的“真正原生”:编译时转换

很多人会问:“TypeScript 能写后端我信,但它怎么写 UI?”

Perry 给出了一个非常大胆且激进的方案:直接调用各平台的原生 API

  • macOS / iOS:编译为 AppKit / UIKit 调用。
  • Windows:编译为 Win32 API 调用。
  • Linux:编译为 GTK4 绑定。
  • Android:通过 JNI/NDK 调用原生框架。

它和 React Native / Flutter 有什么区别?

这是一个关键问题。RN 和 Flutter 更像是“UI 框架”,运行在特定引擎上;而 Perry 更像 “Rust 或 Go 的替代品”

图片

你用 TypeScript 写 new Window(),Perry 编译器在 Mac 上会生成 Objective-C/Swift 的 NSWindow 调用,在 Windows 上会生成 CreateWindowExW 调用。这一切发生在编译阶段,而非运行时。 因此,最终产物的内存占用极低,且彻底告别了 Bridge 通信带来的性能损耗。

图片

三、 真实世界:Perry 的四大应用场景

理论说得通,实战能打吗?结合最新的社区动态,目前 Perry 在四个场景中表现非常亮眼。

场景一:命令行工具 —— 降维打击

如果你发布过一个 npm 全局包,你一定经历过用户全局安装时的卡顿,以及“请先安装 Node.js”的入门门槛。

  • 案例:使用 Perry 编写 CLI 工具。
  • 效果:用户下载的是一个 .exe 或 Unix 二进制文件,双击就能运行。“即下即用,即点即开”。对于 --version 或 --help 这种高频操作,响应是瞬时的,完美解决了 Node.js CLI 一直以来的启动延迟痛点。

场景二:高性能后端与 Serverless

在 Serverless 环境中,“冷启动”就是金钱。Node.js 函数的冷启动往往需要几百毫秒甚至秒级,而 Perry 编译的二进制通常在毫秒级内就能响应。

  • 案例:Skelpo 团队将自家的 MyAIRank 后台任务处理器(涉及调用 OpenAI、Anthropic API 以及 MySQL 查询)直接用 Perry 编译运行。
  • 效果:不仅没有遇到兼容性问题,还极大地降低了服务器的内存占用。Perry 还提供了 perry-postgres 等原生驱动包,性能远超传统的 Node.js 驱动。

场景三:边缘计算与嵌入式设备

在树莓派、路由器或边缘节点上,存储空间常常以 MB 计算。你不可能在这些设备上塞进一个 Node.js。

  • 价值:TypeScript 开发者现在可以为 IoT 设备编写代码了。Perry 产出的微小二进制文件,让 TS 进入了原本只有 C/C++ 和 Rust 才能涉足的领域。

场景四:桌面端 IDE 与复杂应用 —— 最新的杀手级案例

这是最令人兴奋的部分。就在 2026 年 3 月,开发团队用 Perry 写了一个名为 Hone 的 IDE

  • 背景:他们只用了 6 天时间。
  • 功能:这是一个功能完整的、类似 VS Code 的 IDE。它拥有文件树、标签页编辑器、PTY 真实终端、AI 聊天面板(集成 Claude)、Git Diff 视图和 LSP(语言服务器协议)支持。
  • 惊人结果:整个 IDE 的打包体积仅有 ~5 MB(相比之下,VS Code 基于 Electron 约为 200MB+),且它跑在 Windows、Linux、macOS 甚至 iPadOS 上,都调用的是原生系统控件,毫无网页感。

这意味着什么?这意味着 TypeScript 现在具备了开发 3A 级复杂桌面应用的能力,而且是纯原生的。

图片

四、 前方的路:生态与未来

当然,作为一个不到半年的年轻项目,Perry 并非完美。

  • 生态兼容性:目前 Perry 原生重写了约 27+ 个常用 npm 包(如 fspathbcryptcryptofetch),但这还远不及 npm 的百万宝库。虽然你可以直接 compilePackages,但部分依赖 Node.js 底层特性的包可能会编译失败。
  • React 兼容层:好消息是,官方正在推进 perry-react 包,这意味着未来你甚至可以用 React 的语法,写出原生 Perry 应用。
图片

结语

Perry 的出现,打破了脚本语言与编译语言之间的高墙。它让我们看到,TypeScript 不需要永远依托于浏览器或 V8 引擎。

它是一个“反内卷”的方案:当大家都在拼命优化 Bridge、绞尽脑汁让 JS 跑得更快时,Perry 选择了一条更艰难但更回归本质的路——既然原生最快,那我们就变成原生。

也许不久的将来,我们招聘后端或桌面端工程师的要求里,除了 “Rust” 和 “Go”,还会多一个 “TypeScript (Native)”。


参考资源:

  • Skelpo 官方博客关于 Perry 的技术解析(2026.01)
  • 60 Days of Building: Perry 开发日志(2026.02)
  • Week 10 Recap: Hone IDE 与 Perry 生态(2026.03)
扫码领红包

微信赞赏支付宝扫码领红包

发表回复

后才能评论