webpack 热更新 HMR(Hot Module Replacement)
热更新:文件改动后,以最小的代价改变被改变的区域。尽可能保留改动文件前的状态(修改 js 代码之后可以把页面输入的部分信息保留下来)
热更新的原理
使用 webpack-dev-server (后面简称 WDS)托管静态资源,同时以 Runtime 方式注入一段处理 HMR 逻辑的客户端代码;
浏览器加载页面后,与 WDS 建立 WebSocket 连接;
Webpack 监听到文件变化后,增量构建发生变更的模块,并通过 WebSocket 发送 hash 事件;
浏览器接收到 hash 事件后,请求 manifest 资源文件,确认增量变更范围;
浏览器加载发生变更的增量模块;
Webpack 运行时触发变更模块的 module.hot.accept 回调,执行代码变更逻辑; done。
热更新使用
devServer: {
contentBase: './dist',
port: '7008',
inline: true,
host: '0.0.0.0',
disableHostCheck: true,//不使用白名单的原因是多人开发,每个人都需要绑定Host不方便,因此关闭Host检查
hot: true, //开启热更新
},
plugins: [
new MiniCssExtractPlugin({
filename: "css/[name].css",
}),
new HtmlWebpackPlugin({
title: 'Output Management'
}),
new webpack.HotModuleReplacementPlugin() //开启热更新
],
// 在webpack 入口js底部加上以下代码
if (module.hot) {
module.hot.accept();
}
before: (app) => {
app.use('*', (req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "POST,GET");
res.header("Access-Control-Allow-Headers", "Origin,Accept,Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
next();
});
}
热更新代码用到的
热更新的优化方式
减少热更新的文件范围
热更新的速度与需要更新的文件数量直接相关。通过减少不必要的文件更新,可以显著提升性能
优化方法:
优化 webpack 配置
通过调整 webpack 配置,可以减少构建时间和热更新的开销
优化方法:
3. 优化开发服务器
禁用不必要的功能: 如禁用压缩(compress: false)和静态文件服务(serveStatic: false)。
调整轮询间隔: 如果使用文件系统轮询(如 Docker 环境),可以调整 watchOptions.poll 的间隔。
代码分割与懒加载
通过代码分割和懒加载,可以减少每次热更新时需要处理的代码量。
优化方法:
5. 减少依赖模块的数量
项目依赖的模块越多,热更新的开销越大。通过减少不必要的依赖,可以提升性能。
优化方法: 移除未使用的依赖。
使用 webpack-bundle-analyzer 分析依赖,优化打包体积。
最后更新于
这有帮助吗?