本文介绍了webpack中开启文件监听的两种方法以及热更新的原理
文件监听
webpack中,为了避免每次更新代码后都需要手动构建,可以开启文件监听选项。开启文件监听后,webpack会调用Node.js里面的文件读取API fs这个模块来判断文件内容是否变化,并且在文件变化的时候自动构建。
开启文件监听的方法有两种:
- 命令行
- webpack.config.js中进行配置
命令行
在启动webpack
命令的时候,带上--watch
参数即可,即:
1 | webpack --watch |
配置文件
1 | // webpack.config.js |
热更新
使用
热更新需要使用到插件webpack-dev-server
(WDS),WDS使用时需要配合插件HotModuleReplacementPlugin
一起使用(这个插件会在配置hot: true
自动添加,可以不手动添加)
首先,先安装WDS:
1 | npm i webpack-dev-server -D |
使用时,在webpack.config.js
中配置下devServer:
1 | // webpack.config.js |
最后使用命令webpack-dev-server --open
启动即可
–open:在构建结束后自动打开浏览器
原理
- webpack compiler: 将JS构建为Bundle
- HMR Server: 将热更新的文件输出给HMR Runtime
- Bundle Server: 提供文件在浏览器访问
- HMR Runtime: 被注入到bundle.js中,更新文件变化
- bundle.js: 构建输出的文件
热更新中最核心的是HMR Server和HMR Runtime:
HMR Server
是服务端,用来将变化的 js 模块通过 websocket 的消息通知给浏览器端。
HMR Runtime
是浏览器端,用于接受 HMR Server 传递的模块数据,浏览器端可以看到 .hot-update.json 的文件。
热更新分为两个阶段:
-
启动阶段:
启动阶段就是在文件系统中,将初始代码通过Webpack Compiler
打包,并将打包好的代码,传输给Bundle Server
。Bundle Server其实就是一个服务器,通过Bundle Server,浏览器就能访问到打包好的文件。这个过程即图上的 1 -> 2 -> A -> B -
更新阶段:
如果文件系统中的代码发生了改变,代码还是会经过Webpack Compiler
打包,打包好了会把代码发送给HMR Server
,HMR Server中能够对比得到具体是哪些文件发生了改变。接着HMR Server就会通知HMR Runtime
,HMR Runtime就会更新代码,最终就可以不需要刷新浏览器就看到最新的代码。即图上的 1 -> 2 -> 3 -> 4 -> 5