ByteNoteByteNote
把 TS 编译成原生二进制,xbintsc 绕开了 WebView
字

字节笔记本

2026年11月3日 · 约 5 分钟读完

把 TS 编译成原生二进制,xbintsc 绕开了 WebView

API中转
¥120

把 JS 变成桌面应用的主流做法,是「把运行时塞进包里」:Electron 带上一个 Chromium,pkg 和 nexe 把 Node 打进二进制。xbintsc 走的是另一条路:把 TypeScript 的一个实用子集真正编译成机器码。这个 npm 包 9 月 19 日首次发布,直读时最新版已迭代到 0.6.9,V2EX 创造节点作者 zy445566(也是作者本人)11 月 3 日发帖介绍:JS 加 HTML 编译为 10MB 原生二进制,无需 WebView。

pelican-canvas 示例:可玩的 2D 鹈鹕骑车游戏

一、编译器是怎么工作的

自研前端:用 TypeScript 写的词法、语法、绑定和代码生成,把 TS 编译成 LLVM IR 文本,再交给 clang 编译链接成独立可执行文件,运行时只链接一个很小的 C 运行库。值的表示用 NaN-boxing:一个 64-bit 字装下所有 xt_value;GC 是非移动的 mark-sweep,阈值自适应。最有底气的一点是自举:编译器用自己编译自己,多代之间生成的 LLVM IR 已是 fixpoint。产物跨 macOS、Linux、Windows 的 x64 和 arm64,但注意它不自带编译器,每台构建机都得装 clang 兼容工具链。

二、没有 WebView 的 GUI

gui 扩展是关键卖点:自研的 GPU 加速 HTML/CSS 渲染器:自己的 HTML 解析器、CSS cascade、layout 和 SDL_GPU 合成器,没有系统 WebView,也没有打包浏览器。文档里的 script 标签在编译期被 AOT 编译进二进制,运行时不存在 JavaScript 引擎。上图就是官方示例 pelican-canvas 的实际画面:一个可玩的 2D 鹈鹕骑车小游戏。这里要按官方口径纠一个偏:V2EX 帖子标题写「可跑 WebGL2 应用」,README 对 pelican-bike 的定义是「a playable 2D game whose document also opens unchanged in a browser」,即可玩的 2D 游戏,同一份 HTML 文档在浏览器里也能原样打开;仓库里另有 pelican-3d 示例,WebGL2 的说法大抵源于此,引用时注意区分。

pelican-3d 示例预览

三、扩展机制与同类对照

gui、media、node(fs、path、os、process)是可插拔的编译模块,还支持 --ext-native 链接 C++ 或 Rust 写的扩展。一句话对比:pkg 和 nexe 们是「把运行时塞进包里」,xbintsc 是「把代码编译成机器码」,代价是只支持 TypeScript 的一个严格子集。产物小于 10MB(含自研 GUI 渲染器),对照 Electron 的 100MB 以上。同赛道上还有 Vercel Labs 的 scriptc,方向相同(本站此前写过)。

四、冷水:五条都得泼

一,语言子集是真约束:默认语义检查器很严格,也没有完整类型推断,README 的警告值得原样引用:「An agent that assumes 'TypeScript' means 'what Node accepts' will write code that does not compile」,连 agent 都会写出编译不过的代码。二,不自带工具链,构建机的 clang 是硬前提。三,项目很新(9 月 19 日首发),长期维护未知。四,「10MB 对 100MB」的对比要打折听:自研渲染器的 CSS 和 DOM 完整度与 Chromium 不在一个量级,复杂 Web 应用能不能跑是未知数。五,GUI 扩展有平台缺口,Windows arm64 暂不支持。

五、判断

两条路线的取舍很清楚:要生态和兼容性,Electron 和 pkg 们仍然安全;要小体积和真二进制、且愿意接受语言子集,xbintsc 给出了完整工具链。对读者还有一层提醒:这篇的演示口径是按仓库 README 核对的,二手摘要里的「3D」「WebGL2」和官方定义有出入。写技术文章前核对官方口径,这个动作比工具本身更值得学。

来源:npm.io/package/xbintsc(README 全文,第一手);V2EX 创造节点帖(2026-11-03,作者 zy445566)。

相关文章

分享: