问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

通过缓存依赖的方式实现秒级依赖安装加速CI构建

发布网友 发布时间:2024-10-01 22:24

我来回答

1个回答

热心网友 时间:2024-10-20 01:05

当我们使用CI构建前端项目时,对于一些NPM依赖项非常多的项目,依赖安装时间就会特别长。如果我们使用了monorepo的模式,整个团队的项目都使用同一个仓库,那么依赖数量就会指数级增长。这个时候进行依赖安装时,通常会需要10+分钟以上的时间,极端情况下可能会达到30+分钟。

这么长的编译时间,则会带来非常多的问题,例如:

想部署一下看看效果?先等编译吧您;

测试让你修bug,你说改好了,但是要等几十分钟编译;

需求要上线了,但是离封板时间剩下几十分钟,结果代码合并到master之后,光编译就花了几十分钟,还上锤子线;

...

使用yarn缓存

我们可以使用yarn/npm的离线模式来安装依赖,这样就可以减少网络请求。但是使用这个缓存是没法减少依赖分析的时间的,所以使用缓存后的安装时间还是比较长。

使用pnpm

pnpm在机制上就比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的离线模式来安装依赖,这样就可以减少网络请求。但是使用这个缓存是没法减少依赖分析的时间的,所以使用缓存后的安装时间还是比较长。

使用pnpm

pnpm在机制上就比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
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
灵显的意思是什么 安国药王庙结构 显灵宫建筑构造 煤炭储量储量计算 大容量塑料水杯可以用开水烫吗 大容量塑料水杯能不能用开水烫 辽宁朝阳一日游去哪里比较好 ...电脑打开后出现一个对话框影响正常开机不知道怎样解决 哪些可以关掉,这些英文是什么意思? 企业应对网络舆情攻略:10个危机公关应对策略,有效解决 兔宝宝石氏名字寓意好字 东莞市康兴医院做人流怎么样啊 东莞康兴妇产医院怎样 东莞康兴医院打胎怎样 康兴医院东莞怎么样 康兴人流怎么样 康兴医院妇科做人流怎么样 康兴医院人流好吗 某旅游团从甲地到乙地游览,甲、乙两地相距100KM,团中的一部分人乘车先行... 甲,乙两人(甲骑自行车,乙骑摩托车)从A城出发到B城旅行. 甲乙旅行团若单独买票,要1142元,若联合买票,需要864元。甲乙两团各有... 甲乙两个旅行团,同时去苏州旅行,已知乙团人数比甲团人数多4人,两团人... 甲乙去旅行,甲带的钱占两人总钱数的38%,如果甲消费70元乙消费142元,这 ... 绍兴文理元培,衢州学院,杭州科技职业技术学院,宁波教育学院的学前教育... 问:专科学前教育这个专业 杭州科技职业技术学院 金华职业技术学院 宁波... 阳的反义词是什么字 阳的反义词是什么意思? 老年性阴道炎怎样治疗好 老年性阴道炎怎么办 老年阴炎不治疗能好吗 产后涨奶多久才会好 如何将ipad上的app移动到iphone上使用? Doulci激活剂 C盘快满了,用金山卫士整理时发现最大的几个文件都是*.ci文件,都有好几... 想问下大家雷克萨斯NX200,改装音响用什么牌子音质好些呢? 关于雷克萨斯NX200T锋尚版的配置问题 ...其它品牌的助听器,为什么感觉总是听的没有那么好? 以前买一个3000多的助听器感觉挺好的,现在换了一个6000多的反而感觉没... 助听器已经2个月了,还不适应要怎么办呀? 丹麦瑞声达的老产品和新产品哪个好?有啥区别? 原来戴一千多的助听器听得很好,换成一万的为啥听不清了呢? 用无线路由器安装后,笔记本显示连接状态了,但是为什么还是不能上网... c盘满了,怎么处理,求高手指点 惠耳助听器有没有以旧换新 笔记本设置wifi的时候,显示已启动承载网络,手机显示连上wifi,可是就是... ...显示已启动承载网络,但还是无网络访问而且连不上是肿么回事?_百度... 索尼笔记本,已经成功建立好承载网络,手机可以收到网络,但一按就提示... 设置好承载网络手机连上了却无访问求大神解决 netsh_wlan_start_hostednetwork显示已启动承载网络,手机显示已连接 win7 64位系统成功启用承载网络后,但无网络访问权限!(主要为了笔记本带... OSPF的一些问题