wenjinhua / my-blog

有关工作学习的知识点总结
3 stars 0 forks source link

深入理解webpack自动刷新浏览器 #7

Open wenjinhua opened 3 years ago

wenjinhua commented 3 years ago

我们在日常开发时,有一个需要在开发状态下的优化,就是浏览器能自动显示修改后的代码,而无需我们手动刷新

1. 自动刷新浏览器

为了能实现浏览器自动刷新,需要做两件事情:

1.1 监听文件变化

监听文件变化是在webpack模块进行。

1.1.1 方式

需要在webpack中开启监听模式,有两种方式(开启监听模式后,可以设置监听相关配置watchOptions):

1. 在webpack配置文件中添加watch:true

module.export = {
  watch: true,
  watchOptions: {
    // 不监听的文件或文件夹
    ignored: /node_modules/,
    // 监听到变化发生后会等300ms再去执行动作,防止文件更新太快导致重新编译频率太高  
    aggregateTimeout: 300,  
    // 判断文件是否发生变化是通过不停的去询问系统指定文件有没有变化实现的
    poll: 1000
  }
}

2. 在执行启动 Webpack 命令时,带上 --watch 参数

1.1.2 原理

1.2 自动刷新浏览器

监听到文件变化后需要去刷新浏览器,这部分在webpack-dev-server模块中进行。(在使用 webpack-dev-server 模块去启动 webpack 模块时,webpack 模块的监听模式默认会被开启)

1.2.1 原理

自动刷新有三种方法:

DevServer 支持第2、3种方法,第2种是 DevServer 默认采用的刷新方法。

2. 模块热更新

以上自动刷新是会刷新整个页面,这种方式的缺点就是时间长,同时不能保存页面的状态。

而模块热更新即可在不刷新整个页面的情况下来实时预览。它只会在代码发生变化时,只编译发生变化的模块,并替换浏览器中的老模块。

2.1 两种方式

以下两种方式都能实现模块热替换,区别在于其内部使用的通信方式不同。前者使用webcoket通信,后者使用eventSource通信。

2.1.1 webpack-dev-server

1. 开启方式

2. 原理

参考 (1)webpack 对文件系统进行 watch 打包到内存中

(2)devServer 通知浏览器端文件发生改变

(3)webpack-dev-server/client 接收到服务端消息做出响应

(4)webpack 接收到最新 hash 值验证并请求模块代码

(5)HotModuleReplacement.runtime 对模块进行热更新

2.1.2 webpack-hot-middleware

1. 开启方式

2. 原理 原理参考