HMR: hot module replacement 热模块替换 / 模块热替换
作用:一个模块发生变化,只会重新打包这一个模块(而不是打包所有模块)
极大提升构建速度
样式文件:可以使用HMR功能:因为style-loader内部实现了~
js文件:默认不能使用HMR功能 —> 需要修改js代码,添加支持HMR功能的代码
注意:HMR功能对js的处理,只能处理非入口js文件的其他文件。
html文件: 界面会重新加载

1、准备

  1. #box {
  2. width: 200px;
  3. height: 200px;
  4. background-image: url('../imgs/angular.jpg');
  5. background-repeat: no-repeat;
  6. background-size: 100% 100%;
  7. }
  1. console.log('print.js被加载了~');
  2. function print() {
  3. const content = 'hello print';
  4. console.log(content);
  5. }
  6. export default print;
  1. // 引入
  2. import print from './print';
  3. import '../css/index.less';
  4. console.log('index.js文件被加载了~');
  5. print();
  6. function add(x, y) {
  7. return x + y;
  8. }
  9. console.log(add(1, 3));
  10. if (module.hot) {
  11. // 一旦 module.hot 为true,说明开启了HMR功能。 --> 让HMR功能代码生效
  12. module.hot.accept('./print.js', function() {
  13. // 方法会监听 print.js 文件的变化,一旦发生变化,其他模块不会重新打包构建。
  14. // 会执行后面的回调函数
  15. print();
  16. });
  17. }
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>开发环境配置</title>
  7. </head>
  8. <body>
  9. <h1>开发环境配置~~~</h1>
  10. <div id="box"></div>
  11. <img src="./imgs/vue.jpg" alt="vue">
  12. <!-- <img src="./imgs/react.png" alt="react"> -->
  13. </body>
  14. </html>

2、webpack.config.js

  1. ...
  2. devServer: {
  3. // 开启HMR功能
  4. // 当修改了webpack配置,新配置要想生效,必须重新webpack服务
  5. hot: true
  6. }

3、结果

1、当hot未false或未定义时,

image.png
问题:修改js\html\css时,会重新加载其他的文件?

2、当hot为true

1、修改css样式,只有对应的css发生变化

  1. #box {
  2. width: 300px;
  3. height: 200px;
  4. // background-image: url('../imgs/angular.jpg');
  5. background-color: aqua;
  6. background-repeat: no-repeat;
  7. background-size: 100% 100%;
  8. }

image.png

2、js发生变化,只有对应的js发生变化

  1. console.log('print.js被加载了~');
  2. function print() {
  3. const content = 'hel1lo print';
  4. console.log(content);
  5. }
  6. export default print;

image.png