模块热替换(Hot Module Replacement 简称HMR)是webpack提供的非常有用的功能,它允许在运行时更新各个模块而无需进行完全刷新。HMR适用于开发环境,在页面开发调试过程中,当代码发生改变,只会影响发生改变的模块,其他模块的状态得以保留,因此不需要从头开始操作。
HMR的使用非常简单,我们只需要进行下面几步操作:
{
devServer: {
contentBase: './build',
hot: true
}
}
{
plugins: [
new webpack.NamedModulePlugin(),
new webpack.HotModuleReplacementPlugin()
]
}
// 添加NamedModulePlugin以便更容易查看要修补的依赖
if (module.hot) {
module.hot.accept('./app.js', () => {
doSomething();
});
}
为了使HMR正常工作babel-preset-es2015需要禁用module,["es2015", { "modules": false }];
还好style-loader对HMR的支持,使我们在改变样式文件时,不需要做任何样式相关的配置就能支持;
为了在react项目中使用HMR,我们需要用到react-hot-loader,并且我们需要做如下配置:
// .babelrc
{
"plugins": ["react-hot-loader/babel"]
}
// webpack.config.js
module.exports = {
entry: ['babel-polyfill', 'react-hot-loader/patch', './main.js'],
}
// main.js
import React from 'react'
import ReactDOM from 'react-dom'
import { AppContainer } from 'react-hot-loader'
import App from './app'
const render = Component => {
ReactDOM.render(
<AppContainer>
<Component />
</AppContainer>,
document.getElementById('root'),
)
}
render(App)
// Webpack Hot Module Replacement API
if (module.hot) {
module.hot.accept('./containers/App', () => {
render(App)
})
}
为了使HMR在嵌套routes下工作,devserver的publicPath必须设置为'';