把公司项目从 npm 迁到 pnpm,构建时间直接砍半
技术笔记 2 次阅读

把公司项目从 npm 迁到 pnpm,构建时间直接砍半

起因:20 个 G 的 node_modules

上个月公司前端仓库出了点状况。四十多个包的项目,node_modules 愣是占了 20 多个 G。CI 上每次装依赖要六分钟,加上构建,一次提交跑完八分钟起步。新同事第一天拉代码,光等依赖安装就去接了杯水,回来还没装完。

老板开会问能不能优化,我嘴上说"行,我看看",心里其实没底。npm 都用了这么多年,还能翻出什么花来?

为什么是 pnpm

其实 pnpm 我早就听说过,核心就一句话:所有依赖放进全局存储,项目里只放硬链接。同一个版本的包,一百个项目也只下载一次。听起来简单,效果是真的猛——装完依赖磁盘占用直接少了六成,CI 安装时间从六分钟压到一分半。

更戳我的是它默认做依赖隔离。npm 那种"我没装这个包但代码里能 import"的幽灵依赖,在 pnpm 里根本不存在。我们之前线上出过一个特别诡异的 bug,排查了两天,最后发现是某个包偷偷依赖了另一个包的老版本,npm 把它平铺到了根目录,我们代码直接引用了。结果那个包一升级,API 变了,全线崩。换成 pnpm 之后,这类问题从根上就堵死了。

迁移过程比想象中顺利

真动手的时候,发现没那么可怕。第一步先把 package-lock.json 换成 pnpm-lock.yaml,跑一遍 pnpm install 看报错。我们主要遇到三类问题:一是有些老包没写 peerDependencies,得手动补;二是 postinstall 脚本 pnpm 默认禁用,要去 .npmrc 里把需要构建的包加进白名单;三是有一个包依赖写死了绝对路径,折腾了一会儿才解决。

前后花了一个下午加一个晚上,四十多个包全部跑通,测试也全绿。

上线后的数字

迁完第二周我拉了一下 CI 数据:依赖安装从 6 分钟降到 1 分半,全量构建从 8 分钟降到 4 分半,磁盘占用从 20G 降到 7G。最直观的感受是,群里再没人抱怨"拉个代码等半天"了。

如果你也被 node_modules 越来越大、构建越来越慢折磨,真心建议试试 pnpm。一个下午的折腾,换回来的是每天省下的十几分钟,这笔账怎么算都不亏。

分享

评论 (0)

评论通过后显示

暂无评论,来写第一条吧 ✍️