工程化用「增量」思想提升代码检查和打包构建的效率网易云音乐技术团队

在前端开发工程化领域,本文将介绍用「增量」思想提升代码检查、打包构建环节的速度,从而实现开发过程的效率提升。

接下来我们通过自定义git的pre-commit钩子脚本来为一个工程实现增量代码提交检查能力。

本脚本中ESLint检查执行到文件这一粒度。实现增量代码检查首先就是要能找到增量代码,即修改了哪些文件。我们借助git版本管理工具寻找提交时暂存区和HEAD之间的差异,找到修改的文件列表。

代码交付时的增量检查实现方式和上面的步骤类似,关键点就是找到增量的部分。

以一个包含460个js文件的中等规模工程为例,下图中左边为全量代码检查的耗时,右边为增量代码检查的耗时:

如果开发者只修改了一个文件,在提交代码时全量检查需要耗时38秒,而增量检查只需要耗时2秒。

前文实现了文件粒度的增量检查,考虑到大型项目中可能存在很多大文件,如果只修改了几行代码就需要对整个文件进行ESLint检查依然是个低效的操作,我们可以尝试找到代码行粒度的增量代码做检查。

以使用webpack进行打包构建为例,我们同样尝试用「增量」思想来优化这个问题。

和前文类似,第一步依旧是找到增量代码,即本次发布修改了哪些文件。最简单的仍然是选择用gitdiff命令来实现。和增量代码检查不一样的是,这里要对比待发布的集成分支和主干,找到之间的差异文件列表。

constexecSync=require('child_process').execSync;constpath=require('path').posix;constGITDIFF='gitdifforigin/master--name-only';//执行git的命令constdiffFiles=execSync(GITDIFF,{encoding:'utf8',}).split('\n').filter((item)=>item).map((filePath)=>path.normalize(filePath));获得了修改的文件列表后,并不能直接触发webpack打包,需要根据文件之间的引用关系找到入口文件,把需要重新打包的页面入口传给webpack。

思路是先构建每个页面入口文件的依赖树,如果这棵树包含了上述被修改的文件,就说明这个页面需要被重新打包。如图所示:

以上图中两个入口文件为例,它们的依赖树如下:

//被修改的文件列表constdiffFiles=['util/fetch.js'];//用madge库计算依赖树的示例代码,具体可查看官方文档//Promise.all([madge('./demo/index.js'),madge('./demo/buy.js')]).then((result)=>{//result.forEach((e)=>{//console.log(e.obj());//})//});//最后得到的依赖树如下constrelyTree={//demo/index.js文件的依赖树{'demo/a.jsx':['util/fetch.js'],'demo/b.js':[],'demo/index.js':['demo/a.jsx','demo/b.js'],'util/fetch.js':[]},//demo/buy.js文件的依赖树{'util/env.js':[],'demo/buy.js':['demo/c.js','demo/d.js'],'demo/c.js':['util/env.js'],'demo/d.js':[]}};深度遍历每个入口文件的依赖树,根据是否包含被修改的文件列表中的文件来判断是否需要重新打包构建,示例代码如下:

/*计算增量入口示例代码*///全量页面入口constentries=['demo/index.js','demo/buy.js',];//判断两个数组是否存在交集functionintersection(arr1,arr2){letflag=false;arr1.forEach((ele)=>{if(arr2.includes(ele)){flag=true;}});returnflag;}//计算增量入口constincrementEntries=[];for(constiinrelyTree){for(constjinrelyTree[i]){if(intersection(relyTree[i][j],diffFiles)){incrementEntries.push(i);}}}比如我们已知本次发布是修改了util/fetch.js这个文件,遍历以上2个依赖树就得知只有demo/index这个页面受影响,修改webpack的配置只把这个文件作为入口参数触发打包就可以极大提升打包构建的速度。

前端工程还有一些依赖是package.json文件里描述的npm包,安装在node_modules文件夹里,模块之间的依赖关系非常复杂。简单起见,当第一步gitdiff发现package.json里有模块升级时,考虑到这不是高频事件,可以直接触发全量打包。

以一个包含50个页面的MPA工程为例,下图中左边为全量打包构建的耗时,右边为增量打包构建的耗时:假设开发者修改了2个页面,增量打包机制通过计算只传入这两个页面入口给webpack,整个打包构建流程将从7分钟缩短为50秒,极大提升持续集成的效率。

本文以增量代码检查和增量打包构建两个特定业务场景为例,介绍了「增量」思想在前端开发工程化中如何做效率提升。这两个案例不一定能直接照搬到大家的前端工程化实践中去,旨在介绍这样一种编程设计思想,大家可以发挥各自的想象力运用到更多的地方。

THE END
1.在拓展增量上下功夫人民日报在拓展增量上下功夫,消费长效机制,内生增长机制,建筑领域,不竭动力,生产力,增量是新的增长、新的开拓,是一种向好向上的变化。寻求增量、提高质量,可以说是推动高质量发展取得新进展新突破的内在要求结合https://wap.cnki.net/touch/web/Newspaper/Article/RMRB202407240050.html
2.有效增量的五种方式(精选8篇)有效增量的五种方式(精选8篇) 篇1:有效增量的五种方式 一、 新品的市场导入和推广 “好酒不怕巷子深”,其实企业最有效的营销策略还是产品策略,企业为了四、 市场质量的提升 “质量决定一切”,成了近几年企业管理的重心。不仅仅是要做好产品质量,还要做好单市场的质量。市场质量说起来难以理解,其实就是怎样https://www.360wenmi.com/f/filebt3rwz05.html
3.精准投放策略,钻展推广优化方案,提升广告效能推广优化钻展推广优化方案,聚焦精准投放策略,旨在提升广告效果。通过数据分析,优化关键词、创意内容和投放时段,实现广告精准触达目标受众,提高率和投资回报率。 在电商竞争日益激烈的今天,钻展推广已经成为品牌商家提升品牌知名度、扩大市场份额的重要手段,如何优化钻展推广方案,实现广告效果的最大化,成为了许多商家关注的焦点,本文http://www.fengzhengtop.com/tgyh/623332.html
4.什么是增量Adjust?术语表Adjust增量是营销支出为 B 组带来的转化量百分比(20 次安装,占 B 组总量的 16.7%)。 那么,每次增量转化的成本是多少?您可以将用于 B 组的广告支出除以所得的提升量。如果推广活动的成本为 100 美元,而增量为 20 次安装,那么每位增量用户的成本为 5 美元。 https://www.adjust.com/zh/glossary/incrementality/
5.存量房转新颜,增量房品质提升的秘笈房产资讯【存量房转新颜,增量房品质提升的秘笈】本文探讨了如何加速消化存量房产和优化增量住房供给的问题,提出了创新政策措施,如实施“以旧换新”政策、将非居住房改建为租赁住房、合理控制新房供应等方法,以及如何打造宜居环境和促进租购并举,共同推动房地产市场的高质量发展。 https://guigang.news.fang.com/open/50140953.html
6.2025风光装机突破25GW!湖南印发电力支撑能力提升行动方案(2022理顺输配电价结构、完善增量配电网价格形成机制。不断完善分时电价、阶梯电价、差别电价等制度。推进配售电改革。完善信用监督体系,规范电力零售市场秩序,完善增量配电网配套政策,加快形成增量配电业务放开常态化机制。建立健全行业标准体系,提升增量配电企业盈利能力和水平。https://www.in-en.com/article/html/energy-2316351.shtml
7.见实杭州私域大会,一起聊11大私域订单增量新来源杭州私域大会将聚焦私域2.0阶段品牌企业关注的“订单与增量”,侧重如何提升用户增量、订单增量的运营策略和运营玩法。在此议题下,我们将围绕其中十一个增量来源展开,分别是: 用户黄金运营周期、用户精细化运营、会员深度运营、“双前台”新玩法、私域提效模型、高净值用户运营、跨越新平台(抖音、小红书、视频号)、社群提效https://maimai.cn/article/detail?fid=1750365214&efid=lhA02m1kx4ZXp80GIQQvYQ
8.元气森林2023自贩机渠道饮料“新链路”增量样本来了!云峰链路改革加速提升增量效率 相对于前期的不稳不火,元气森林2023年在自贩机渠道内的爆发与其在链路方面大刀阔斧的改革密不可分。元气森林结合行业实际情况,对原有销售链路的重组起到了至关重要的作用。元气森林原来的链路从企业到消费者手中要经过经销、分销、运营商后才能到达消费者手中。而经过观察和评估,元气森林在https://www.163.com/dy/article/ID83UI1V0552GWXH.html
9.上海企业如何提升每月发票额度代办发票增量视频上海企业如何提升每月发票额度|代办发票增量 不成功退全款 众多成功案例供查看 申与城企业服务 上海代理记账协会会员单位 作为申与城(上海)企业发展有限公司,我们完全理解您作为上海企业希望提升每月发票额度的需求。在这篇文章中,我们将从多个角度为您详细描述如何实现这一目标。 https://shanghai.11467.com/info/24476939.htm
10.快速提升模型效果,机器学习这些迭代方法要掌握(Python)技术提升交流 二、增量学习 一、模型迭代方法 机器学习模型在实际应用的场景,通常要根据新增的数据下进行模型的迭代,常见的模型迭代方法有以下几种: 1、全量数据重新训练一个模型,直接合并历史训练数据与新增的数据,模型直接离线学习全量数据,学习得到一个全新的模型。优缺点:这也是实际最为常见的模型迭代方式,通常模型https://blog.csdn.net/qq_34160248/article/details/127523381
11.手把手XTTSV4迁移51CTO博客16、 为源库开启快跟踪(可以提升增量备份的效率) alter database enable block change tracking using file '%ORACLE_HOME%/trace/trace.log'; 17、 检查无效对象 select owner, object_name, object_type, status from dba_objects where owner = 'TEST' and status <> 'VALID'; https://blog.51cto.com/u_15077549/4396325
12.中信建投:无论存量还是增量,中国居民杠杆率都处于相对低位近年来居民杠杆率持续提升,这构成了中期市场对房地产市场的质疑:目前杠杆水平下,市场对货币宽松以及政策是否还具备足够弹性?此乃我们做杠杆细化研究之缘起。此次我们采用了 3 个存量指标(居民贷款余额/GDP、偿债比率、存贷比)和 2 个增量指标(按揭负担比、贷款成数),并侧重于核心城市杠杆研究。https://wallstreetcn.com/articles/3505097
13.两会圆桌以“三量”激活优化城市潜在生产力天津要“紧扣高质量发展内在逻辑,激活并优化城市潜在生产力,培育新的经济增长点,推进城市向内涵式发展转变”,要实现这样的目标,今年政府工作报告给出的路径是“进一步盘活存量、培育增量、提升质量”。代表委员们结合自己的岗位特点,纷纷给出解读、细化举措,一颗颗赤子之心,展望未来豪情满怀。 http://www.tj.xinhuanet.com/20240126/2a606ea6a9674ce190b56a54b8befecf/c.html
14.国研中心新国货爆发式增长,中高端市澈争力如何提升全球智库近年来,顺应居民消费提质升级的趋势和需求,新国货依托网络零售市场快速发展,在衣、食、住、行、用等消费领域全方位快速涌现。总体来看,新国货消费呈现出市场占有率快速提升、市场增量贡献扩大、消费活力日益强劲的特征,为消费提质升级注入强大新动能。 (一)新国货关注度和市场占有率迅速提升 https://www.thepaper.cn/newsDetail_forward_16388972