跳到主要内容
CNode

兄弟们 typescript可以编译成原生二进制了

分享
Zzy445566发布于 12 小时前最后回复 8 小时前
1590
目录 · 4 个章节

缘由

2019年的时候研究过一段时间编译器,当时写了一个迷你的JS编译器,只支持function和number类型,但别小看就这两个类型,差不多花费了两周时间去实现,所以编译器是需要大量的时间和精力去做这个事情,当时就感叹可能我这辈子都不太可能能撸出一个相对完整的编译器了。

2026年9月的某个下午,群里有人聊到了前端/js/ts永远都只能在鄙视链的最底端,因为它不能像C++和rust一样生成二进制文件。

触发

这件事就像触发了我的底层代码一样,脑子里疯狂出现了一个念头,然后回过头去翻了翻当年写的编辑器文章,不!不对!现在可能真的有可能可以实现,然后我开始列出了我的思路,写了第一个文档 DESIGN.md,接下来打开pi,开撸!

很快不到一个小时,就出现第一个原型,我看完何其丑陋和简单,甚至不如我当年写的demo,于是我觉得自己重写把整个框架重新写一遍,若干天,总算是达到了我想要的水平,然后我开启了第二次尝试,这次我继续启动pi,这次发现虽然AI在架构上表现一般,但是架构完善后,它完成功能的速度不是一般的快,于是我开始了急速的迭代过程。

核心进展

  • 绝大部分的js/ts语法以及node.js的主流方法(可选包)
  • 支持了C++和rust扩展,用户可以自由扩展
  • 实现了自举,即自己编译了自己
  • 实现无GNU依赖运行

当然未实现的在这里: unimplemented.md node-unimplemented.md

当然对于实现二进制编译最大的优势主要是两点:

  • 包体积巨小,编译后的二进制文件低至200KB (--ext node 300KB),且可以直接运行,不再需要再捆绑几十MB的node.js运行时了
  • 冷启动速度巨快,本机实测比node.js原生大概快了120-200倍左右

使用方法

releases页面 下载zst压缩包解压后,运行即可,下面以windows作为案例

# 编译
.\xbintsc-win32-x64\bin\xbintsc.exe build .\hello.ts --out .\build
# 运行
.\build\hello.exe

附录

Github 地址: https://github.com/zy445566/xbintsc 兄弟们 有兴趣可以一起研究 ;)

查看回复

回复 (1)

L
libredb#18 小时前

有意思,先点个赞。

问一个实际会卡住的地方:原生插件(node-gyp / N-API 那一类)怎么处理?

我们自己在跑一个 Node/TS 的开源数据库 IDE,实际连过 42 种数据库。驱动层里 mysql2pg 这些纯 JS 的好说,但一旦牵扯到需要编译的绑定,打包/编译这条路 就开始变麻烦——不是语法层面的问题,是运行时要去 dlopen 一个平台相关的 .node

看你写了支持 C++ 和 rust 扩展,所以想具体问:

  1. 现有的 npm 上带 binding.gyp 的包能直接用吗,还是需要按你的扩展机制重写一遍?
  2. require静态解析的吗?如果是,那种按运行时条件动态 require 驱动的写法 (我们这种按用户选的数据库类型去加载对应驱动)会不会直接失效?
  3. 编出来的二进制是单平台的吧?跨平台得分别编?

问这些不是抬杠——对我们这类应用,能不能脱离 node_modules 发一个二进制, 卡点基本就全在这三条上。如果这三个都有解,那价值就不只是"炫技"了。

参与回复

登录后即可参与回复。登录