webpack打包生成的map文件_一站式搞明白webpack中的代码分割

上次分析到通过devtool的配置项来设置source map,在线上环境可以通过设置成cheap-module-source-map来生成单独的map文件,但是map文件在线上环境会不会每次都加载呢?如果加载的话,会不会造成带宽和请求的浪费呢?

笔者也有这样的疑问,于是在网络上查了一下。后来才了解到,在浏览器中,只有在调试模式下才会自动下载map文件,平时线上环境的话,是不用担心这个问题的。

在使用webpack构建单页面应用时,为什么要进行代码分割?

  1. 如果entry中只配置了一个入口,那么如果从这个入口文件开始引入的公共库的代码过大,打包出来会只有一个bundle文件。当浏览器端加载这样一个体积太大的bundle时就会造成加载过慢。

  2. 通常来讲我们的公共库代码是不经常修改的。但是我们的业务代码是经常要修改的,如果打包到不同的bundle文件可以更好的利用浏览器的缓存,在浏览器端来复用之前的公共库的bundle文件。

那如何通过代码分割来优化呢?

在webpack3中可以通过CommonsChunkPlugin来进行代码分割,但是webpack4中,官方提倡使用SplitChunksPlugin这个插件,所以本次主要讲解的也是在webpack4中通过SplitChunksPlugin这个插件来实现代码分割的方法。

首先要先弄懂一个预备知识点,就是在webpack中,什么叫做chunk,什么叫做bundle?

下面这种图可以帮助我们更好地理解:

86462596a3ac0652ea9c38d304745427.png

在webpack的打包配置entry中有两个入口:index和utils。分别对应index.js文件和utils.js文件,其中index.js文件引用了common.js和index.css。那么webpack打包的时候就会把前三个文件作为一个chunk,utils.js文件作为一个chunk,但是在webpack配置中国年用MiniCssExtractPlugin插件抽离出了css文件,所以产生了.css和.js两个bundle文件。总之,chunk是webpack打包时候的一个概念,而产生出来的单个文件,可以在浏览器中运行的就叫做bundle。

其实上文中通过在webpack配置文件中配置两个entry入口,其中utils把一些工具函数挂载到全局,也可以算是一种代码切割,但是有没有更加灵活的方式呢?我们来看下SplitChunksPlugin插件。

SplitChunksPlugin插件的介绍可以在webpack的官方文档中找到:

51a19578f8aa7697f69bc4d09cbcb58c.png

从文档中可以看到SplitChunksPlugin的默认配置如下:

49c5a7a214449bcd356f69a6e439ab67.png

下面会一点点来讲解。

代码分割有两种场景:一种是同步引入代码模块的分割,还有一种是异步引入的代码模块的分割。

一、同步代码分割:

在业务代码中引入lodash,通过之前讲的webpack-bundle-analyzer插件分析打包情况如下:

4131a8bf0c96ea0529905f42939747ef.png

可以看出我们的src文件和node_modules文件都是在一个bundle中。如果我们想把node_module中的库文件单独打包到一个chunk中,我们可以把官网上的SplitChunksPlugin的默认配置拷贝到打包配置文件中,然后做如下修改:951293c6675be35c4e3c741e85039499.png

其中chunks表示可以配置成initial、async、all分别表示静态引入、动态引入和两种情况下来进行代码分割。

minSize为可以进行代码分割的最小包体积,默认为30000Byte。而在打包分析中我们看到lodash的包体积在webpack处理完后是将近70KB,大于SplitChunksPlugin的最小打包体积。所以在做如上修改以后,便能够将lodash打包到单独的chunk中。打包后的情况如下:

0f719f6fac86c9c6d9ead2507d9d8b40.png

从图中我们可以看到,lodash被单独打包到了叫做vendors~index.js的chunk中。

下面再来完善一下上面分析的打包流程,满足了minSize的条件以后,顺着条件往下走可以走到cacheGroups配置,cacheGroups中有不同的对象,对象中的test即为测试正则,当引用的模块名满足了这个测试正则后,才会按照当前对象的规则打包。

vendors这个键名即是打完包的前缀名,而automaticNameDelimiter中配置的就是前缀后面的连接符,后面就是引入此模块的entry中配置的入口文件名index。

如果我们想要,自定义lodash打包的文件名,我们可以在vendors中配置filename为vendors.js如下:

8f1d644796ba2a2263b0a4d607d23fe7.png

那么打完包的lodash的chunk就叫做vendors.js了,而cacheGroups上方的name:true的意思就是使cacheGroups中的filename生效。

接下来介绍在splitChunks中剩余的配置:

minChunks是什么意思呢?他的意思就是在entry中配置的入口,引用了该模块的最少个数,只有满足了最少有minChunks个chunk引用了当前模块,才会进行单独打包。

maxAsyncRequests表示代码分割完后,同时可以请求的最大数量。

maxInitialRequests表示首页中的最大请求数,如果代码分割后,首页请求的请求数大于这个数,就不会再继续代码分割了。

二、异步代码分割:

大家可能还不是很熟悉异步加载的语法,可以在官网的API部分中找到import异步加载的语法说明,其实就是ES6的一种语法:

01b307376be7b7bbca3205b30bfe796a.png

而在webpack的使用中,webpack通过一种叫做“魔法注释”的功能丰富了打包功能,下面会详细看到。

在webpack中SplitChunksPlugin默认就会对异步引入的代码进行分割,但是为了支持异步引入模块的语法,我们还是需要安装babel的plugin-syntax-dynamic-import插件来支持异步加载的语法。

下面来详细看下我们的业务代码:

在index.js中,我们通过click事件动态引入了handleClick.js文件,其中注释的部分就是通过魔法注释来给分割的chunk命名为handleClick。

8085f9591f61eaf8f8fdfa248fb718df.png

在handleClick.js文件中,我们为文档添加元素(其中process.env.NODE_ENV是运行时环境变量,可以参考之前几期的推送)。

2d10b981dc8f77fe11fae58eeac8940b.png

从下面的运行效果我们可以看到,当网页刷新的时候,先加载出来index.html文件和index.js文件。当点击网页的时候,才会去请求handleClick.js文件,并且网页上出现“123”。

1127ce733a6631b6b4298b68c46f8e5a.gif

其实异步代码分割还有一个大家可能更熟悉的名字——懒加载。

但是,如果被异步加载的模块很大,我们在真实项目中操作完了再临时请求,会不会还是加载很慢。为了解决这个问题,可以使用魔法注释中的webpackPrefetch来让浏览器加载完首页的js文件后空闲的时候去加载异步分割的bundle文件。

参考:

https://segmentfault.com/q/1010000000396077

https://juejin.im/post/5cede821f265da1bbd4b5630#heading-15

https://coding.imooc.com/lesson/316.html#mid=22363

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

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

相关文章

计算机PMA,PMA通信协议分析及仿真工具

PMA通信协议分析及仿真软件是专为计算机通信开发人员打造的一款模拟分析工具,现在不少设备在进行开发的时候都需要对通信协议进行分析了,使用这款工具可以有效地对设备进行模拟、查看通信状况以及进行模拟仿真处理等操作,软件提供了多种运行模…

红帽JBoss企业应用平台7.0 ALPHA发布了!

红帽JBoss企业应用程序平台7(JBoss EAP 7)是基于开放标准构建并符合Java Enterprise Edition 7规范的中间件平台。 它将WildFly Application Server 10与高可用性群集,消息传递,分布式缓存和其他技术集成在一起。 现在可以下载最新…

chrome只能装在c盘吗_电脑硬盘使用与文件整理入门——逃离C盘?

在Windows 10伴随着SSD固态硬盘大范围铺开的背景下,曾经广泛传播的硬盘使用模式(C盘装系统,D盘装软件,E、F盘放各种文件)是否还有实践意义?我们该基于什么样的理念来养成一些良好习惯,从而安全又…

机器人峰会王伟_【“峰”景独好】大美中国探春中国机器人峰会举办地——浙江宁波余姚...

导读:5月8日至10日,第六届中国机器人峰会暨智能经济人才峰会即将盛大启幕,海内外重磅嘉宾、业界精英将汇聚一堂,带来一场超高水准的人工智能盛宴。会议举办地浙江宁波余姚,历史悠久、文化底蕴深厚,通过文化…

计算机ip地址未修复连接不了无线网络,本地连接没有有效的ip配置,教您修复本地连接没有有效的ip配置...

我们在平时使用电脑工作中,时常会遇到网络连接不上,进行网络诊断后,会提示“本地连接没有有效的IP配置”的问题,那么如何解决这个问题呢?下面小编就来给大家快速修复本地连接没有有效的ip配置的问题。经常使用电脑上网…

同步方法 调用异步防范_.NET Web应用中为什么要使用async/await异步编程?

布莱恩特:.NET Core开发精选文章目录,持续更新,欢迎投稿!​zhuanlan.zhihu.com前言1.什么是async/await? await和async是.NET Framework4.5框架、C#5.0语法里面出现的技术,目的是用于简化异步编程模型。2.async和await…

戴尔电脑开机黑屏怎么办_笔记本电脑开机黑屏怎么办

笔记本电脑开机黑屏是什么原因,电脑黑屏问题如何修复解决众所周知笔记本电脑的散热性能不是特别好,长时间使用笔记本电脑就可能会出现笔记本发烫的状况,严重的有可能造成笔记本电脑出现问题。人们在使用笔记本电脑时可能会出现电脑开机黑屏等情况&#x…

ftp服务器上传文件提示451,解决IIS7之FTP部分文件上传451错误

单位的需要搭建一个FTP,于是就直接使用服务器上的IIS添加了FTP组件,大家都知道IIS组件中的ftp服务器功能比较简单,但是设置起来不太个性化!配置好以后,添加一个组的用户具有上传及读取权限,使用Flashfxp软件…

存根类 测试代码 java_嘲弄和存根–了解Mockito的测试双打

存根类 测试代码 java介绍 我遇到的一件事是使用模拟框架的团队假设他们在模拟。 他们并不知道Mocks只是Gerard Meszaros在xunitpatterns.com上分类的“测试双打”之一。 重要的是要认识到每种类型的双重测试在测试中扮演着不同的角色。 用与学习不同模式或重构相同的方式&a…

只会python怎么挣钱_业余学python有用吗

Python的火热我就不细说了,大家都是编程老司机,对最前沿最火热的编程语言肯定比我还了解。前几天,我看了一篇“如何用Python制造一个抖音小姐姐发掘器?”,阅读量竟然比头条上的还多了一倍。可见Python的火热&#xff0…

物联网项目:将Arduino连接到Ubidots和Android –第1部分

这个物联网项目探索了物联网的一个重要方面:如何使用以太网屏蔽将Arduino连接到物联网云平台 。 这方面很重要,因为可以将数据存储在云中然后进行分析。 一旦数据(如传感器值)存储在云中,便可以使用智能手机访问数据并…

iphone黑屏转圈_iphone XR被曝新BUG,众多用户中招,无规律黑屏假死

进入今年一月份以来,苹果放宽了对iphone的定价,所以各大电商都对多款iphone XR进行了上千元的降价。这也让iphone XR瞬间取代了华为MATE 20 PRO成为新的“真香机”。而随着iphone XR的用户越来越多,这款手机也再次爆出新的BUG。根据网友的反馈…

怎么邀请人加入组队_糖豆人:终极淘汰赛怎么玩?玩法技巧介绍

这几天玩糖豆人:终极淘汰赛的玩家都在问,这个游戏模式怎么玩,糖豆人终极淘汰赛是一款60人同台竞争的卡通吃鸡游戏。想要获胜还是有一定难度的,战神游戏加速器为大家带来这款游戏的基础操作和具体玩法,超低延迟极速体验…

2017年4月21号课堂笔记

2017年4月21号 星期五 空气质量&#xff1a;良 内容&#xff1a;XML&#xff0c;Dom4j解析XML文件&#xff0c;单例 一、XML 老师代码&#xff1a; <?xml version"1.0" encoding"UTF-8"?><!-- XML的注释xml是什么&#xff1f; 可扩展的标记语言…

服务器物理内存总是九十几,服务器物理内存使用率90以上

服务器物理内存使用率90以上 内容精选换一换开启弹性云服务器的虚拟内存后&#xff0c;会导致硬盘I/O性能下降&#xff0c;因此&#xff0c;平台提供的Windows弹性云服务器默认未配置虚拟内存。如果弹性云服务器内存不足&#xff0c;建议通过“变更规格”操作来扩大内存。如果业…

比较二进制_浮点数比较的精度问题

引言 先举个例子&#xff1a;#include <stdio.h>int main() {float a 0.1;float b 0.2;float c a b;if(c 0.3){printf("c 0.3n");}else{printf("0.1 0.2 ! 0.3n");}return 0; }如果变量a,b换0.75&#xff0c;0.5可以看出运行出c 1.25,说明浮…

open表和closed表_excel工作表合并,多文件数据一键合成

工作中 遇到十几个甚至几十个单独工作excel文件要合并成一个怎么办&#xff0c;难道还按照老办法复制工作表?几个还好说&#xff0c;遇到十几个几十个文件&#xff0c;手速不够快的宝宝心里苦。那么&#xff0c;有没有什么日常偷懒神技&#xff0c;一键合成多个excel文件&…

濡沫江湖一直显示获取服务器地址,濡沫江湖采集点坐标大全

濡沫江湖每个地图都有采集点&#xff0c;那么濡沫江湖采集点具体坐标是多少&#xff1f;下面9k9k小编就为大家整理带来濡沫江湖采集点坐标大全&#xff1a;小渔村(35,4)采集铜矿石、碎铁块小渔村(38&#xff0c;16)采集药草、杂草小渔村(14,35)采集亚麻、杂草小渔村(13,12)采集…

java第五次作业

《Java技术》第五次作业 &#xff08;一&#xff09;学习总结 1.在上周完成的思维导图基础上&#xff0c;补充本周的学习内容&#xff0c;对Java面向对象编程的知识点做一个全面的总结。 2.汽车租赁公司&#xff0c;出租汽车种类有客车、货车和皮卡三种&#xff0c;每辆汽车除了…

mysqld已删除但仍占用空间的_Windows 10删除备份文件方法

Windows具有许多内置备份功能&#xff0c;包括卷影副本&#xff0c;系统还原点和整个系统备份。尽管它们既不是最可靠也不是功能最丰富的备份解决方案&#xff0c;但它们确实提供了一种备份系统和个人数据的不错的方式。Windows内置备份工具的问题之一是它们几乎过于安静和方便…