💂 个人网站:【紫陌】【笔记分享网】
💅 想寻找共同学习交流、共同成长的伙伴,请点击【前端学习交流群】
文章最后有作者l联系方式(备注进群)
另外一个代码拆分的方式是动态导入时,webpack提供了两种实现动态导入的方式:
比如我们有一个模块 bar.js:
注意:使用动态导入bar.js:
因为动态导入通常是一定会打包成独立的文件的,所以并不会再cacheGroups中进行配置;
那么它的命名我们通常会在output中,通过 chunkFilename 属性来命名;
希望修改name的值,可以通过magic comments(魔法注释)的方式
常用配置解析
Chunks:
minSize:
maxSize:
cacheGroups:
用于对拆分的包就行分组,比如一个lodash在拆分之后,并不会立即打包,而是会等到有没有其他符合规则的包一起来打包;
test属性:匹配符合规则的包;
name属性:拆分包的name属性;
filename属性:拆分包的名称,可以自己使用placeholder属性;
3. 解决注释的单独提取
在生产环境下默认webpack在进行分包时,有对包中的注释进行单独提取。
这个包提取是由另一个插件默认配置的原因(默认为true,改为false即可)
optimization.chunkIds配置用于告知webpack模块的id采用什么算法生成
最佳实践:
会打包出单独的js文件。单独模块
webpack v4.6.0+ 增加了对预获取和预加载的支持。
在声明 import 时,使用下面这些内置指令,来告知浏览器:
与 prefetch 指令相比,preload 指令有许多不同之处:
CDN称之为内容分发网络(Content Delivery Network或Content Distribution Network,缩写:CDN), 它是指通过相互连接的网络系统,利用最靠近每个用户的服务器; 更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户; 来提供高性能、可扩展性及低成本的网络内容传递给用户;
可以直接修改publicPath,在打包时添加上自己的CDN地址;
通常一些比较出名的开源框架都会将打包后的源码放到一些比较出名的、免费的CDN服务器上:
项目中,我们如何去引入这些CDN呢?
第一步,我们可以通过webpack配置,来排除一些库的打包:
第二步,在html模块中,加入CDN服务器地址:
MiniCssExtractPlugin可以帮助我们将css提取到一个独立的css文件中,该插件需要在webpack4+才可以使用。
安装 mini-css-extract-plugin:
npm install mini-css-extract-plugin -D
配置rules和plugins:
注意:1.style-loader打包样式是放到标签内联上的,2. minicssExtractPlugin打包独立css文件然后link标签引入css。
推荐使用contenthash,可以让没改动的文件文件名一样,然后用户浏览器还能使用以前的缓存文件
什么是Terser呢?
Terser可以帮助我们压缩、丑化我们的代码,让我们的bundle变得更小。
Terser是一个独立的工具,它可以单独安装:
全局安装 npm install terser -g
局部安装 npm install terser -D
这里就不介绍单独使用了,主要讲在webpack使用
安装 css-minimizer-webpack-plugin:
npm install css-minimizer-webpack-plugin -D
在optimization.minimizer中配置:
什么是Tree Shaking呢?
Tree Shaking是一个术语,在计算机中表示消除死代码(dead_code);
最早的想法起源于LISP,用于消除未调用的代码(纯函数无副作用,可以放心的消除,这也是为什么要求我们在进行函数式 编程时,尽量使用纯函数的原因之一);
后来Tree Shaking也被应用于其他的语言,比如JavaScript、Dart;
JavaScript的Tree Shaking:
对JavaScript进行Tree Shaking是源自打包工具rollup(后面我们也会讲的构建工具);
这是因为Tree Shaking依赖于ES Module的静态语法分析(不执行任何的代码,可以明确知道模块的依赖关系);
webpack2正式内置支持了ES2015模块,和检测未使用模块的能力;
在webpack4正式扩展了这个能力,并且通过 package.json的 sideEffects属性作为标记,告知webpack在编译时,哪里文 件可以安全的删除掉;
webpack5中,也提供了对部分CommonJS的tree shaking的支持;
webpack/changelog-v5: Temporary repo for the changelog for webpack 5 (github.com)
usedExports实现
将mode设置为development模式:
设置usedExports为true和false对比打包后的代码:
在usedExports设置为true时,会有一段注释:unused harmony export mul;
这段注释的意义是什么呢?告知Terser在优化时,可以删除掉这段代码;
这个时候,我们讲 minimize设置true:
usedExports实现Tree Shaking是结合Terser来完成的。
上面我们学习的都是关于JavaScript的Tree Shaking,那么CSS也可以进行Tree Shaking操作
安装PurgeCss的webpack插件:
npm install purgecss-webpack-plugin -D
webpack配置PurgeCss
我们之前使用了HtmlWebpackPlugin插件来生成HTML的模板,事实上它还有一些其他的配置:
inject:设置打包的资源插入的位置
cache:设置为true,只有当文件改变时,才会生成新的文件(默认值也是true)
minify:默认会使用一个插件html-minifier-terser
上一篇:前端 react教程(详细版)