使用 golang 重写 nodejs cli
本文最后更新于:2022年11月17日 凌晨
场景
由于吾辈使用 monorepo 管理所有项目,lib 模块初始化的构建时间已经不能接受,所以最近两天吾辈在尝试使用 golang 重写 lib/cli 构建工具 @liuli-util/cli,验证 golang 到底可以做到多快。
@liuli-util/cli 是吾辈创建一个针对于库和 CLI 应用程序打包的零配置构建工具,但也支持一些额外的常用功能,包括生成模板项目、同步配置、部署等。
实现
saki npm,所有测试均在 liuli-tools 完成,它是一个有 44 个模块组成的 monorepo,其中有 28 个需要构建。
整体基于 esbuild 来重写 liuli-cli 的 build 命令,支持 build lib/cli 以及自定义目标。下面是一些吾辈在重写之后做的测试,证明使用 golang 可以大幅度提高 lib 构建性能,它是如此快速以至于有可能将它放在 postinstall 中。
命令均使用 time seq 10 | xargs -i <cmd>
重复执行 10 次
saki build
基于 esbuild 构建 lib 或 cli 程序,它非常快。
1 |
|
性能测试
下面两个 cli 都基于 esbuild 实现的构建,但后者真实运行时间很长,因为 nodejs 本身加载代码也需要时间(而且很慢)。
下载二进制文件安装
1 |
|
npm 全局安装
1 |
|
liuli-cli
1 |
|
saki run
一个 pnpm --filter . run
的替代命令,尝试提高多线程运行命令的效率。
1 |
|
性能测试
pnpm + liuli-cli + dts
1 |
|
pnpm + liuli-cli
1 |
|
saki + liuli-cli
1 |
|
pnpm + saki(几乎是使用 js 工具链难以想象的)
1 |
|
npm saki
1 |
|
下载二进制文件安装 saki
1 |
|
Windows 下使用 git bash –filter 参数请用
""
包裹
结论
目前来看,builder 提高的比较明显,而 run 则几乎和 node 相差无几(有时候甚至更慢了)。
吾辈可能会继续尝试使用 golang 重写更多的前端基础工具,nodejs 的性能目前而言看起来并不能用。