webpack学习笔记(11)-高级篇(2)-提升打包构建速度篇
HotModuleReplacement(热模替换)
开发时我们修改了其中一个模块代码,
Webpack默认会将所有模块全部重新打包编译,速度很慢。所以我们需要做到修改某个模块代码,就只有这个模块代码需要重新打包编译,其他模块不变,这样打包速度就能很快。
什么是HotModuleReplacement(热模替换)
HotModuleReplacement(HMR/热模块替换):在程序运行中,替换、添加或删除模块,而无需重新加载整个页面。
使用热模替换前:(开发服务器 => hot:false)

- 关闭热模替换后,每一次改动样式代码,页面重新加载
使用热模替换前:(开发服务器 => hot:true)
修改样式过后页面不再刷新就能实现变换
- 开启热模替换后,每一次改动样式代码,页面不会重新加载,只会重新加载相对应的修改过后的模块并在控制台输出
热模替换的使用(hot配置)
样式的基本配置
// 配置开发服务器: 不会输出任何资源, 在内存中的编译打包的******************************* |
- 此时
css样式经过style-loader处理,已经具备HMR功能了(默认开启)。 但是js还不行。
js的基本配置
// main.js |
此时我们改动对应的
js代码,浏览器同样不会重新加载,只会输出更改过后的模块count.js

sum.js
上面这样写会很麻烦,所以实际开发我们会使用其他 loader 来解决。
- 比如:vue-loader , react-hot-loader, 这样在我们的实际开发中,就不需要再
main.js中一点一点的写, 方便我们项目的开发
OneOf
为什么需要OneOf
- 打包时每个文件都会经过所有
loader处理,虽然因为test正则原因实际没有处理上,但是都要过一遍。比较慢。 - 也就是说,当一个
css文件进来的时候, 这个文件会经过所有的loader,尽管你第一个loader就是处理css样式的,但是它还会继续的向下进行判断,这样就会导致打包时间被延长了,因为它做了很多无用功 - 我们希望打包的时候,在文件经过其第一个处理该文件类型的
loader时,进行打包,不需要再向下过其他的loader,这时就需要OneOf了。
什么是OneOf
- 顾名思义就是只能匹配上一个
loader, 剩下的就不匹配了。
使用方法:(开发模式和生产模式均可使用)
// 使用的是commonjs 的语法格式[node.js] |
Include&Exclude
为什么需要Include/Exclude
- 开发时我们需要使用第三方的库或插件,所有文件都下载到
node_modules中了。而这些文件是不需要编译可以直接使用的。 - 所以我们在对
js文件处理时,要排除node_modules下面的文件。
什么是Include&Exclude
include
- 包含,只处理
xxx文件
- 包含,只处理
exclude- 排除,除了
xxx文件以外其他文件都处理
- 排除,除了
基本使用
// 使用的是commonjs 的语法格式[node.js] |
- 生产模式也是如此
总结:
- 一般来讲,在项目当中我么们只需要针对
js文件做处理,也就是Babel和ESLint, 样式是不需要做Include&Exclude处理的,为什么呢? 因为在开发的时候我们很少去引入第三方的样式, 一般都是我们自己写样式, 因此我们就自然就不需要去排除它了, 其次,尽管我们引入了如Bootstrap这样的第三方样式,但是我们最终是希望它和我们最终的样式打包到一起的, 因此我们仍然是要处理的, 所以就不存在什么包含和非包含了
Cache缓存
为什么需要Cache缓存?
- 每次打包时
js文件都要经过Eslint检查 和Babel编译,要知道, 打包其实所用的事件大部分是用在js的编译上面, 诸如css等这些样式上的打包速度是很快的, 因此我们对打包速度进行一些优化多数是在js的打包中。 - 我们可以缓存之前的
Eslint检查 和Babel编译结果,这样第二次打包时速度就会更快了。
什么是Cache
- 对
Eslint检查 和Babel编译结果进行缓存。 - 作用就是在我们第二次打包项目的时候不需要再对整个项目的
js问价你重新打包, 只需要打包更改过后的即可
基本使用:
// 使用的是commonjs 的语法格式[node.js] |
生成的文件.cache

Thead
为什么需要Thead
- 当项目越来越庞大时,打包速度越来越慢,甚至于需要一个下午才能打包出来代码。这个速度是比较慢的。
- 我们想要继续提升打包速度,其实就是要提升 js 的打包速度,因为其他文件都比较少。
- 而对
js文件处理主要就是eslint、babel、Terser(内置的,一般不需要我们去配置) 三个工具,所以我们要提升它们的运行速度。 - 我们可以开启多进程同时处理
js文件,这样速度就比之前的单进程打包更快了。
什么是Thrad
- 多进程打包:开启电脑的多个进程同时干一件事,速度更快。
- 需要注意:请仅在特别耗时的操作中使用,因为每个进程启动就有大约为
600ms左右开销。因此如果项目体积过小的话反而会拖慢打包速度
基本使用:
- 首先我们要获取我们的
cpu数量,我们启动进程的数量就是我们CPU的核数。
- 如何获取 CPU 的核数,因为每个电脑都不一样。
// nodejs核心模块,直接使用 |
- 下载包
npm i thread-loader -D |
- 使用(这里展示生产模式, 开发模式不需要压缩,即不需要配置
Terser)
// 使用的是commonjs 的语法格式[node.js] |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0许可协议。转载请注明来自 肥林の仓库



