发布网友 发布时间:2024-10-01 22:24
共1个回答
热心网友 时间:2024-10-20 01:05
当我们使用CI构建前端项目时,对于一些NPM依赖项非常多的项目,依赖安装时间就会特别长。如果我们使用了monorepo的模式,整个团队的项目都使用同一个仓库,那么依赖数量就会指数级增长。这个时候进行依赖安装时,通常会需要10+分钟以上的时间,极端情况下可能会达到30+分钟。
这么长的编译时间,则会带来非常多的问题,例如:
想部署一下看看效果?先等编译吧您;
测试让你修bug,你说改好了,但是要等几十分钟编译;
需求要上线了,但是离封板时间剩下几十分钟,结果代码合并到master之后,光编译就花了几十分钟,还上锤子线;
...
使用yarn缓存我们可以使用yarn/npm的离线模式来安装依赖,这样就可以减少网络请求。但是使用这个缓存是没法减少依赖分析的时间的,所以使用缓存后的安装时间还是比较长。
使用pnpmpnpm在机制上就比yarn和npm快很多,可以看一下相关测试:https://pnpm.io/benchmarks
虽然使用pnpm能减少构建时间,但是依赖项太多的时候,分析依赖还是需要不少时间,剩下的分析依赖的时间能不能也节省掉呢?答案是可以的。
手动缓存node_modules有没有一种方案可以实现10s内依赖安装完成?答案是有的,且我们在业务上已经稳定运行两年多了,之前一直想写文章记录一下,一直拖到现在。
解决方案一句话概括:在满足相同条件时,直接使用之前安装的node_modules,不需要再运行yarninstall,减少依赖安装和索引需要的时间。
实现原理在安装依赖时,先将所有的package.json文件进行hash,获得唯一标识;
在cache中寻找是否有对应的hashcache,如果有,那么就直接使用此hashcache,将此cache软链到我们的项目中就可以完成依赖安装
如果发现没有,那么就算首次安装依赖,这次安装是比较慢的;
将安装完成后的依赖存储到cache中,当依赖无变更时,下次安装就可以直接使用cache;
给出的思路是最简单的版本,如果你的项目是monorepo则还需要考虑多个package.json和每个子项目中的node_modules,如果项目严格使用lock文件的话,其实也可以使用lock文件来生成cachehash值。
当然这些都是细节上的事情,解决起来都很快,主要是这种缓存的想法。实际代码我就不贴了,因为真的不难。
参考勇神的鬼点子
原文:https://juejin.cn/post/7099085591265935368热心网友 时间:2024-10-20 01:08
当我们使用CI构建前端项目时,对于一些NPM依赖项非常多的项目,依赖安装时间就会特别长。如果我们使用了monorepo的模式,整个团队的项目都使用同一个仓库,那么依赖数量就会指数级增长。这个时候进行依赖安装时,通常会需要10+分钟以上的时间,极端情况下可能会达到30+分钟。
这么长的编译时间,则会带来非常多的问题,例如:
想部署一下看看效果?先等编译吧您;
测试让你修bug,你说改好了,但是要等几十分钟编译;
需求要上线了,但是离封板时间剩下几十分钟,结果代码合并到master之后,光编译就花了几十分钟,还上锤子线;
...
使用yarn缓存我们可以使用yarn/npm的离线模式来安装依赖,这样就可以减少网络请求。但是使用这个缓存是没法减少依赖分析的时间的,所以使用缓存后的安装时间还是比较长。
使用pnpmpnpm在机制上就比yarn和npm快很多,可以看一下相关测试:https://pnpm.io/benchmarks
虽然使用pnpm能减少构建时间,但是依赖项太多的时候,分析依赖还是需要不少时间,剩下的分析依赖的时间能不能也节省掉呢?答案是可以的。
手动缓存node_modules有没有一种方案可以实现10s内依赖安装完成?答案是有的,且我们在业务上已经稳定运行两年多了,之前一直想写文章记录一下,一直拖到现在。
解决方案一句话概括:在满足相同条件时,直接使用之前安装的node_modules,不需要再运行yarninstall,减少依赖安装和索引需要的时间。
实现原理在安装依赖时,先将所有的package.json文件进行hash,获得唯一标识;
在cache中寻找是否有对应的hashcache,如果有,那么就直接使用此hashcache,将此cache软链到我们的项目中就可以完成依赖安装
如果发现没有,那么就算首次安装依赖,这次安装是比较慢的;
将安装完成后的依赖存储到cache中,当依赖无变更时,下次安装就可以直接使用cache;
给出的思路是最简单的版本,如果你的项目是monorepo则还需要考虑多个package.json和每个子项目中的node_modules,如果项目严格使用lock文件的话,其实也可以使用lock文件来生成cachehash值。
当然这些都是细节上的事情,解决起来都很快,主要是这种缓存的想法。实际代码我就不贴了,因为真的不难。
参考勇神的鬼点子
原文:https://juejin.cn/post/7099085591265935368