HMR 涉及多个部分的协同工作,包括 Webpack 编译器、开发服务器(如 webpack-dev-server 或 webpack-dev-middleware)以及应用程序的客户端代码。其核心原理是 Webpack 监视文件变化,并通过 WebSocket 或轮询等方式通知浏览器进行模块替换。
Webpack 编译器:
fs.watch
),Webpack 重新编译受影响的模块,生成新的模块代码。HMR 服务器:
HMR 客户端:
module.hot
API)来应用更新,而无需刷新整个页面。以下是一个简单的 Webpack 配置示例,展示了如何启用 HMR:
npm install webpack webpack-cli webpack-dev-server style-loader css-loader --save-dev
webpack.config.js
):const path = require('path');
const webpack = require('webpack');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
publicPath: '/', // 公共路径,用于 HMR
},
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
],
},
devServer: {
contentBase: path.join(__dirname, 'dist'),
hot: true, // 启用 HMR
},
plugins: [
new webpack.HotModuleReplacementPlugin(), // HMR 插件
],
};
src/index.js
:import './style.css';
if (module.hot) {
module.hot.accept('./style.css', function () {
console.log('CSS module updated!');
});
}
src/style.css
:body {
background-color: lightblue;
}
npx webpack serve --open
通过 HMR,开发者可以显著提升开发体验和效率,实现更快的迭代和调试过程。在现代 Web 开发中,HMR 已成为不可或缺的重要工具。