在這以前我老是容易把熱重載和模塊熱替換混淆成一個概念,在本身動手實現以後才發現二者仍是有一些差異的。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 工做流程圖解 此爲更加詳細的流程分析:
上圖是webpack 配合 webpack-dev-server 進行應用開發的模塊熱更新流程圖。