在这以前我老是容易把热重载和模块热替换混淆成一个概念,在本身动手实现以后才发现二者仍是有一些差异的。javascript
HMR的有两种实现方式,一种是经过插件HotModuleReplacementPlugin和devserver配和实现,一种是经过在自定义开发服务下,使用插件webpack-dev-middleware和webpack-Hot-middleware配合实现HMRjava
1.配置 在webpack.config.js中配置devServernode
devServer: {
contentBase: './dist', // 起一个在dist文件夹下的服务器
open: true, // 自动打开浏览器并访问服务器地址
port: 8085,
hot: true, // 开启HMR功能
hotOnly: true // 即便HMR不生效,也不自动刷新
},
复制代码
pluginsp配置中使用HotModuleReplacementPlugin插件webpack
plugins: [
...// 其余插件
new webpack.HotModuleReplacementPlugin()
],
复制代码
2.判断 而后进行手动判断进行模块热更新,若是你不想作如下判断那么可使用module.hot.accept(),整个项目作hmr只要有代码变化就进行更新。git
if(module.hot) {
module.hot.accept('./number', () => {
// 使用更新过的 library 模块执行某些操做...
})
}
复制代码
3.启动 最重要一点不要忘了修改启动命令github
"start": "webpack-dev-server"
复制代码
此时运行npm start,便可实现模块热更新web
经过本身在本地搭建一个服务器,利用webpack-dev-middleware和webpack-Hot-middleware两个插件来配合实现HMR. 1.安装express
// 安装express, webpack-dev-middleware , webpack-Hot-middleware
cnpm install express webpack-dev-middleware webpack-Hot-middleware -D
复制代码
2.配置dev.server.js dev.server.jsnpm
const path = require('path');
const express = require('express');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');
const webpackHotMiddleware = require("webpack-Hot-middleware")
const config = require('./webpack.dev.js');
const complier = webpack(config); // 编译器,编译器执行一次就会从新打包一下代码
const app = express(); // 生成一个实例
const {devServer: {port, contentBase}} = config
const DIST_DIR = path.resolve(__dirname, '../', contentBase); // 设置静态访问文件路径
// 等同于const DIST_DIR = path.resolve(__dirname, '../dist');
let devMiddleware = webpackDevMiddleware(complier, { // 使用编译器
publicPath: config.output.publicPath,
quiet: true, //向控制台显示任何内容
noInfo: true
})
let hotMiddleware = webpackHotMiddleware(complier,{
log: false,
heartbeat: 2000
})
app.use(devMiddleware)
app.use(hotMiddleware)
// 设置访问静态文件的路径
app.use(express.static(DIST_DIR))
app.listen(port, () => {
console.log("成功启动:localhost:"+ port)
}) //监听端口
复制代码
webpack.dev.js配置json
module.exports = {
entry: { // 入口文件配置
//实现刷新浏览器webpack-hot-middleware/client?noInfo=true&reload=true 是必填的
main: ['webpack-hot-middleware/client?noInfo=true&reload=true', './src/index.js']
},
devServer: {
contentBase: 'dist',
port: 8081
},
plugins: [
new webpack.NamedModulesPlugin(), //用于启动HMR时能够显示模块的相对路径
new webpack.HotModuleReplacementPlugin(),
new OpenBrowserPlugin({ url: 'http://localhost:8081' }), // 自动打开浏览器
],
...// 其余配置
}
复制代码
完整实如今这里
配置项能够经过query 方式添加到webpack config中的路径来传递给客户端 配置项都有
经过传递第二个参数,能够将配置选项传递给中间件
webpackHotMiddleware(webpack,{
log: false,
path: "/__what",
heartbeat: 2000
})
复制代码
注意:经过express启动服务器后,devServer中的配置就不起做用了。
3.启动命令
"start": "node ./build/dev-server.js",
复制代码
启动命令npm start,便可实现HMR的功能
1.HMR的更新流程
2.HMR 工做流程图解 此为更加详细的流程分析: