Webpack 性能优化 二次编译速度提升3倍!

news2024/10/5 16:19:22

本文作者为 360 奇舞团前端开发工程师 Rien.

本篇文章主要记录 webpack 的一次性能优化。

现状

随着业务复杂度的不断增加,项目也开始变得庞大,工程模块的体积也不断增加,webpack 编译的时间也会越来越久,我们现在的项目二次编译的时间在 5s到6s 之间,对于我们迭代速度非常快的项目来说,二次编译时间长会导致效率非常低下。优化的手段有很多,之前项目原本已经做了很多如环境分离、并行编译等优化,本文从几个小的角度进行二次编译的优化讲解,大家也可以检查一下自己的项目能否从以下几个方面进行优化。

更改source map配置

首先,介绍一款插件webpack.ProgressPlugin。官网给出的解释是

The ProgressPlugin provides a way to customize how progress is reported during a compilation.

也就是说,ProgressPlugin可以监控各个hook执行的进度,输出各个hook的名称和描述,输出构建进度。通过插件webpack.ProgressPlugin对webpack整个运行做了分析,发现耗时较长的阶段主要是生成sourceMap文件的阶段:

7fbf383e85cd14fe6b4a961992a446e5.png34e1c9206baa4b282adabed52fb175ed.png

通过查阅sourcemap的配置,发现了问题是因为devtool配置为source-map的原因。之前的同学使用source-map可能是因为要做一些其他的处理,需要用到源码,现在并无此需要。Webpack支持sourceMap20+种不同的方式,通过关键字组合,可以生成用于各种场景的sourcemap。每种方式的速度和效果各不相同。效果最好的速度最慢。

在这里我贴了一张官网截图的对比图:

56f5c3b1d3fbabb2da1848010731ce32.png

从上图我们可以看到webpack为sourcemap提供的一些关键字,而sourcemap模式都是左边介绍的关键字进行拼接构成。

6c00a5b09000df0be6fd082ca92dfb85.png

上图是一些不同配置项的对比,可以看到其中一些值适用于开发环境,一些适用于生产环境。
对于开发环境,通常希望更快速的sourcemap,需要添加到bundle中以增加体积为代价,但是对于生产环境,则希望更精准的sourcemap,需要从bundle中分离并独立存在。在开发环境下使用eval-cheap-module-source-map(webpack推荐方式)大大减少了这一阶段的耗时,同时对开发体验及错位定位影响较小。
这里顺便提一下,生产模式我们可以使用:none,因为SourceMap会暴露源代码;调试是开发阶段的事情。如果对代码实在没有信心可以使用nosources-source-map。sourcemap里是有sourceContent部分的,也就是直接把源码贴在这里,这样的好处是根据文件路径查不到文件也可以映射,但这样会增加sourcemap的体积,也会暴露源码。加上 nosources之后,生成的sourcemap就没有sourceContent部分了,sourcemap文件大小会小很多,也不会暴露源码。

Html-webpack-plugin的升级

经过上面的优化 二次编译的时间有了较大的提升 。但是通过观察分析,发现html-webpack-plugin耗时不太正常,因为html-webpack-plugin 的作用很简单,就是:使用 webpack打包时创建一个 html 文件,并把 webpack 打包后的静态文件自动插入到这个 html 文件当中。我们已经从全量的8个页面改为增量单个html启动了耗时不应该那么久。

ca138599f234b69ef3c1125c0c0e3697.png经过排查及github issue里看到,是当前插件版本有一些性能问题。

f60e3e074262f61be6b9b581304db143.png

从v3改为v4版本后 这个插件的耗时从秒级降为毫秒级。9ec6a9496a33d9f90709be50baa7b8b3.png

ESlint-loader 去除

后续我发现在对不同文件模块进行更改时,编译时间有较大的差异,通过插件speed-measure-webpack-plugin对插件、loader耗时分析发现,部分loader运行时间不一致,编译慢是由eslint-loader导致的。

5d4b7e8d6251b0c3f1bb1f29878766be.png

项目之初,每个文件的代码量基于规范不会太大,在开发过程中使用eslint-loader进行代码规范校验,后续随着需求迭代,可能因为时间或者历史的原因,没有对单个文件的代码量做限制,导致部分功能模块代码量巨大,在开发这一块内容的时候,eslint-loader对整个文件进行校验,耗时较长。

由于

  1. eslint无法从根本上解决代码逻辑上的质量问题

  2. eslint-loader已废弃。所以这里就把eslint-loader暂时去掉了。

通过去除eslint-loader,在部分大文件改动时,编译时间有了较大提升。

40ae71354bd007787bc154414b276f1f.png

为了弥补代码规范的问题,不经过eslint-loader进行校验,我们可以在本地开发的时候,使用vscode的 eslint插件进行代码校验,规范调整。但是这里只是口头约定,后续可以使用git钩子结合eslint在代码提交的时候做强制校验。

总结

经过一系列优化,最终我们得到,在改动同一大文件的基础上,二次编译时间得到了大幅度提升,改善了开发效率和体验。将近提升3倍。

bd9f42d361013ae67fd56642b1caa637.png

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

5dfcfb39b204f853fa353344323ed52e.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1206870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

医院安全(不良)事件管理系统源码 不良事件报告全套源码

不良事件管理系统是一种专为企业或组织设计的软件工具,用于跟踪、记录和管理不良事件。该系统可以有效地整合不良事件的收集、分类、分析和报告,帮助企业及时识别和处理不良事件,从而降低风险和损失。通过实时监控和自动化报告,该…

JavaScript数据类型和存储区别

目录 一、原始数据类型 二、引用数据类型 三、存储区别 四、常见错误 JavaScript是一种动态类型语言,这意味着变量可以在程序执行过程中改变其数据类型。了解JavaScript中的数据类型和它们的存储方式对于编写高效和可维护的代码至关重要。 在JavaScript中&…

世界互联网大会|云轴科技ZStack受邀分享云原生超融合

11月8日至10日“世界互联网大会乌镇峰会”在浙江嘉兴的乌镇开幕,大会的主题为“建设包容、普惠、有韧性的数字世界——携手构建网络空间命运共同体”,全球各界代表就热点焦点问题展开讨论,反映产业各界对互联网发展的前瞻思考,引领…

knife4j集成Swagger

knife4j集成 配置knife4j 第一步: 导入knife4j对应的maven坐标,knife4j是为MVC框架集成Swagger生成API文档的增强解决方案 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><ver…

中国平安:短期面临两项重大风险,长期具有增长潜力

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 中国平安面临的短期风险 在过去的一个月里&#xff0c;中国平安(02318)(601318)的股价已经下跌了16.4%&#xff0c;而同期标普500指数则上涨了1.3%。所以&#xff0c;猛兽财经认为&#xff0c;中国平安近期的股价疲软&…

python数据结构与算法-02_数组和列表

线性结构 本节我们从最简单和常用的线性结构开始&#xff0c;并结合 Python 语言本身内置的数据结构和其底层实现方式来讲解。 虽然本质上数据结构的思想是语言无关的&#xff0c;但是了解 Python 的实现方式有助于你避免一些坑。 我们会在代码中注释出操作的时间复杂度。 数…

nginx之使用与配置教程

目录 简介 优点 安装 目录结构 nginx.conf配置文件结构 server虚拟主机配置 listen server_name location root index try_files proxy_pass 使用 反向代理 配置语法 常用指令 proxy_pass proxy_set_header proxy_redirect 负载均衡 负载均衡策略 轮询&…

发现一款好用的制作企业杂志网站/强推

除了展示企业的信息&#xff0c;企业杂志还可以成为员工展示自我、表达情感的电子书。你可以鼓励员工分享他们的故事、他们的想法、他们的创新。这样&#xff0c;企业杂志就成为了一个充满活力和创新的空间。 那么如何制作一本企业杂志呢&#xff1f;给大家推荐一款实用的网站&…

Hadoop3.3.4分布式安装

安装前提&#xff1a;已经配置好java环境&#xff0c;所有机器之间ssh的免密登录。 注意&#xff1a;下文中的flinkv1、flinkv2、flinkv3是三台服务器的别名 1.集群部署规划 注意&#xff1a;NameNode和SecondaryNameNode不要安装在同一台服务器 注意&#xff1a;ResourceMan…

2013年01月09日 Go生态洞察:App Engine SDK与工作区(GOPATH)深度解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

电机应用-编码器

目录 编码器 增量式编码器 绝对式编码器 混合式绝对式编码器 旋转编码器原理 增量式编码器原理 绝对式编码器原理 编码器基本参数 分辨率 精度 最大响应频率 信号输出形式 编码器 用来测量机械旋转或位移的传感器&#xff0c;能够测量机械部件在旋转或直线运动时的…

16岁还是街头餐厅“洗碗妹”,46岁已成美国“三院士”,华人科学家李飞飞的美国之路

昨天群里大V分享了一本书《The Worlds I See》&#xff0c;我迫不及待的下载阅读了。 16岁&#xff0c;她还是美国街头餐厅的“洗碗妹”。 46岁&#xff0c;她已成为美国三大权威科学院院士、斯坦福教授、当代科技领军人物榜上&#xff0c;与乔布斯齐名的人物。 她就是华裔女科…

为什么要用kubernetes?

第一章 kubernetes介绍 本章节主要介绍应用程序在服务器上部署方式演变以及kubernetes的概念、组件和工作原理。 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物…

requestAnimationFrame是什么?介绍 如何使用?适用场景?有哪些缺点和优点,兼容性怎么样?

文章目录 前言是什么&#xff1f;如何使用适用场景优点和缺点兼容性后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端系列文章 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技…

12周年庆|一文回顾思迈特十二年大事记

白驹过隙&#xff0c;转眼思迈特软件迎来了十二岁生日&#x1f382; 在中华文化里&#xff0c;十二是一个轮回&#xff0c;十二寓意着圆满。圆满代表着一种从容、自信、充满能量的状态。 任何一种圆满的状态&#xff0c;都不是一蹴而就的&#xff0c;都曾经经历过千锤百炼的磨砺…

BGP路由控制实验

目录 一、实验拓扑 二、实验需求 三、实验步骤 1、IP地址配置 2、As 200 内部配置OSPF 3、建立BGP邻居关系 4、宣告网段&#xff0c;在BGP中传递网段 5、通过修改MED 使 R1 到达 192.168.2.0/24 网段的路由经过 R3 6、通过修改Preferred-value 属性&#xff0c;使 R4 …

PyCharm鼠标控制字体缩放

File->Settings->Keymap 右边搜索栏输入increase(放大)&#xff0c;可以看到下面出现increase Font Size(放大字体尺寸)&#xff0c;双击。 双击后出现几个选项&#xff0c;选择Add Mouse Shortcut,会出现一个页面给录入动作。 按住Ctrl同时鼠标向上滚动&#xff0c;该动…

从零开始,掌握Nacos搭建的艺术(单点、集群、docker-compose)

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 从零开始&#xff0c;掌握Nacos 前言&#xff1a;前提&#xff1a;建表语句第一&#xff1a; 单节点搭建&#xff1a;第二&#xff1a; 集群搭建&#xff1a;第三&#xff1a…

使用VScode编译betaflight固件--基于windows平台

使用VScode编译betaflight固件--基于windows平台 1、使用git克隆betaflight的开源代码2、betaflight的代码框架分析&#xff1a;3、配置编译环境&#xff1a;4、VScode上编译 betaflight不仅可以在LInux上进行编译也可以在Windows上编译&#xff0c;本文主要介绍在windows平台上…

智能巡检软件哪个好?中小企业如何提升工作效率与质量?

在当今数字化、智能化的时代&#xff0c;智能巡检软件作为一种高效的工具&#xff0c;已经在各行各业得到了广泛的应用。它利用物联网、大数据、人工智能等技术&#xff0c;为巡检工作提供了全面的解决方案&#xff0c;帮助企业实现数据化、智能化管理&#xff0c;提高工作效率…