# Webpack-HMR
HMR: Hot Module Replacement
分清楚hot reload 和 hot update 三种方式实现:
- webpack-dev-middleware + webpack-hot-middleware + small code
- webpack-dev-middleware + webpack-hot-middleware + react-hot-loader
- webpack-dev-server
# 原则
搞清楚你的代码库是一个App还是一个lib
# 方法一
webpack-dev-middleware + webpack-hot-middleware + small code
// config/webpack.config.js
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: [
'webpack-hot-middleware/client',
'./src/index.js'
],
devtool: 'inline-source-map',
plugins: [
new webpack.HotModuleReplacementPlugin(),
new HtmlWebpackPlugin({
title: 'Development',
template: './template/index.html',
}),
],
output: {
path: path.resolve(__dirname, '../dist'),
filename: 'bundle.js',
},
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules)/,
use: {
loader: 'babel-loader'
}
},
]
},
mode: 'development'
};
// examples/server.js
const express = require('express');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');
const webpackHotMiddleware = require('webpack-hot-middleware');
const config = require('../config/webpack.dev.config.js');
const port = process.env.PORT || 3000;
const app = express();
const compiler = webpack(config);
app.use(webpackDevMiddleware(compiler, {
noInfo: true,
}));
app.use(webpackHotMiddleware(compiler));
app.listen(port, function() {
console.log('Listening at http://localhost:' + port);
});
// templates/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title><%= htmlWebpackPlugin.options.title %></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
</head>
<body>
<!--[if lt IE 11 ]>
<p>请使用IE11.0以上版本或Chrome, Firefox浏览器来访问本站。</p>
<![endif]-->
<div id='root'>
</div>
</body>
</html>
// src/index.js
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import App from './App';
ReactDOM.render(
<App/>,
document.getElementById('root')
);
//For Hot Module Replacement work in development
if(module.hot) {
module.hot.accept(); //为什么加这段代码: https://github.com/webpack-contrib/webpack-hot-middleware/issues/43#issuecomment-155697146
}
// packages.json
"start": "node ./examples/server.js",
# 方法二
webpack-dev-middleware + webpack-hot-middleware + react-hot-loader
与方法一的配置基本一样,但在index.js中不太一样
// src/App.js
import { hot } from 'react-hot-loader';
class App extends Component {
render() {
return ();
}
}
export default hot(module)(App);
// src/index.js
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import App from './App';
ReactDOM.render(
<App/>,
document.getElementById('root')
);
# 方法三
webpack-dev-server
Follow https://webpack.js.org/guides/hot-module-replacement/