1. 打包结果优化
压缩体积优化:
加速网络请求:
Tree-Shaking(prod模式下自带的优化)
Tree-Shaking
: 能够在模块的层面上做到打包后的代码只包含被引用并被执行的模块,而不被引用或不被执行的模块被删除掉,以起到减包的效果
这里并未使用minus
,但是却被打包到bundle
中,Tree-Shaking
可以帮我们把没有被使用的minus
去除。
备注: Tree-Shaking
只针对于prod环境(prod环境默认是开启Tree-Shaking
),prod环境下冗余代码minus
会被移除;dev环境就算配置了Tree-Shaking
依然会把无用代码打包到bundle,但是会附带注释。
配置:
这个时候我们需要配置 sideEffects
如下:
我们碰到上面sideEffects
数组中指定的几个模块,我们就不去进行 tree_shaking
tree-shaking 的局限性?
-
只能是静态声明和引用的 ES6 模块,不能是动态引入和声明的。(不支持commonJS)
-
只能处理模块级别,不能处理函数级别的冗余;
因为 webpack 的 tree-shaking 是基于模块间的依赖关系,所以并不能对模块内部自身的无用代码进行删除。
- 只能处理 JS 相关冗余代码,不能处理 CSS 冗余代码。
目前 webpack 只对 JS 文件的依赖进行了处理,CSS 的冗余并没有给出很好的工具。可以借助 PureCss 来完成这个目的。
CommonsChunkPlugin提取公共代码
把多个页面依赖的业务公共代码
提取到common.js
中:
找出依赖的基础库,写一个base.js
文件,再与common.js
提取公共代码到base
中,common.js
就剔除了基础库代码(因为conmmon中可能也包含基础库代码import 'react';
),而base.js
保持不变。
得到基础库代码base.js
,不含基础库的公共代码common.js
,和页面各自的代码文件xx.js
。
页面引用顺序如下:base.js--> common.js--> xx.js
下面3种插件都是打包公共代码的,是打包公共代码插件的进化版
CommonsChunkPlugin的问题:
假如我们的文件是这么配置的:
带来的问题:entryB
并没有使用 vuex,entryA
并没有使用 axios
,但是从产出的文件上来看,entryA
与 entryB
都引入了部分“脏”模块,这并不太好。
SplitChunksPlugin
:在CommonsChunkPlugin的基础上,并不是把所有被引用的都打包到一个chunk,对于那些部分共有但是阈值过小的文件其不会创建单独的输出文件,因为其大小不值得去新开一个请求。(缓存策略配置在 cacheGroup 中)
DLLPlugin
: 除了 webpack.config.js
,项目中还会新建一个webpack.dll.config.js
文件来配置 dll
的打包。
webpack.dll.config.js
作用是把所有的第三方库依赖打包到一个 bundle
的 dll
文件里面,还会生成一个名为manifest.json
文件。
该 manifest.json
的作用是用来让 DllReferencePlugin
映射到相关的依赖上去的。
SplitChunksPlugin
虽然也是将公共模块抽离,但是其每次打包的时候还是会去处理一些第三方依赖库,只是它能把第三方库文件和我们的代码分开掉,生成一个独立的 js 文件。但是它还是不能提高打包的速度。
DLLPlugin
它则是提前将公共的包构建出来,使得在 build 时过滤掉这些构建过的包,使得在正是构建时的速度缩短。所以其相对来说打包速度会更快
分割不同chunk按需加载
juejin.cn/post/695585…
2. 构建过程优化
从以下方面入手:
include/exclude
使用 loader 的时候,我们需要在尽量少的模块中去使用。 我们可以借助 include 和 exclude 这两个参数,规定 loader 只在那些模块应用和在哪些模块不应用。
resolve告诉webpack怎么去搜索文件
resolve.extensions
:
如果我们想在导入模块时不写后缀,如下:
打包一下 npm run dev
,会报一个错误,说是 list
找不到
这个时候我们可以在配置文件中增加resolve
参数,增加一个 extensions
属性,我们配置 ['.js', '.jsx']
,意思是我们会先去找指定目录下面以 .js
结尾的文件,再去找.jsx
结尾的文件,如果还是找不到就返回找不到
但是这里我们要尽量少配置,因为如果配置多了,我们把诸如 css、jpg
结尾的都配置进去了,这会调用多次文件的查找,这样就会减慢打包速度
。
resolve.mainFiles
: 设置尽量少的值可以减少入口文件的搜索步骤
第三方模块为了适应不同的使用环境,会定义多个入口文件,mainFields
定义使用第三方模块的哪个入口文件,由于大多数第三方模块都使用main字段描述入口文件的位置,所以可以设置单独一个main
值,减少搜索
如果我们想在 index.js 中直接使用下面这种引用方式进行引用:
mainFiles
表示在查找 from './list'
目录时,会先查找./list/index.js
,如果没找到,则接着查找./list/list.js
有一些第三方模块会针对不同环境提供几分代码。 例如分别提供采用 ES5 和 ES6 的2份代码,这2份代码的位置写在 package.json 文件里,如下:
Webpack 会根据 mainFields 的配置去决定优先采用那份代码;Webpack 会按照数组里的顺序去package.json 文件里寻找,只会使用找到的第一个。
假如你想优先采用 ES6 的那份代码,可以这样配置
-
resolve.alias:
略过 -
resolve.modules
设置resolve.modules:[path.resolve(__dirname, 'node_modules')]
避免层层查找。
resolve.modules
告诉webpack
去哪些目录下寻找第三方模块,默认值为['node_modules']
,会依次查找./node_modules、../node_modules、../../node_modules
。
使用DllPlugin减少基础模块编译次数
DllPlugin动态链接库插件,其原理是把网页依赖的基础模块抽离出来打包到dll文件中,当需要导入的模块存在于某个dll中时,这个模块不再被打包,而是去dll中获取。为什么会提升构建速度呢? 原因在于dll中大多包含的是常用的第三方模块,如react、react-dom,所以只要这些模块版本不升级,就只需被编译一次
使用HappyPack开启多进程Loader转换
在整个构建流程中,最耗时的就是Loader对文件的转换操作了,而运行在Node.js之上的Webpack是单线程模型的,也就是只能一个一个文件进行处理,不能并行处理。HappyPack可以将任务分解给多个子进程,最后将结果发给主进程。
noParse
比如项目中依赖了一些底层模块jquery
,webpack打包解析的过程中看到导入了jquery
,就会再解析jquery
,看看jquery
里面是否还引入其他的第三方模块,但是我们知道jquery
是底层的库,jquery
中已经不会再引入其他第三库了,这时候就可以配置webpack
不用再去解析jquery
了,节省时间
externals
如果我们想引用一个库,不想让webpack打包,也就是不想npm install
安装,但是又不能影响我们在程序中以CMD、AMD或者window/global全局等方式进行使用,那就可以通过配置externals
。因为打包进去就会体积太大
使用lodash:
配置externals:
Tapable
webpack本质上是一个事件流,工作流程就是将各个插件串联起来;而实现这一切的核心是Tapable
,核心原理是依赖发布订阅模式
同步钩子
1. 同步钩子SyncHook
2. 同步钩子SyncBailHook
SyncBailHook是保险钩子,决定是否向下执行;如果tap的回调函数返回值是非undefined,那么就不会向下执行了。
3. 同步钩子SyncWaterfallHook
SyncWaterfallHook会将tap的回调函数扯上关系,上一个回调函数的返回值,会作为下一个回调函数的参数;瀑布流
4. 同步钩子SyncLoopHook
SyncLoopHook会循环 不返回undefined的回调函数
异步钩子
异步
:当需要多个并行的请求都执行完之后,再执行回调。
异步有分两类
:串行和并行; 串行有的可能需要知道上一步的结果,才能进行下一步;并行是需要等待所有并发的异步事件执行后再执行回调方法
1. AsyncParallelHook
AsyncParallelHook等待所有异步事件执行完毕之后再执行传入的回调cb()
参考
juejin.cn/post/684490…
webpack.wuhaolin.cn/4%E4%BC%98%…
monocy.site/2019/05/23/…
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!