Vite 和 Webpack 的热更新(HMR)有什么区别?

🚀 Vite 和 Webpack 的热更新(HMR)有什么区别?

✅ 1. 核心区别

对比项Vite HMRWebpack HMR
运行方式 基于原生 ESM 模块 基于 Webpack 依赖图
更新机制 按需更新,直接替换模块 需要构建整个模块依赖树
性能 极快,无需重新打包整个项目 慢,需要 Loader + Plugin 处理
支持范围 原生支持 Vue / React / Svelte 等 需要配置 react-refreshvue-loader

✅ 2. 运行原理

🔥 Vite 的 HMR 机制

  1. 基于 ES Modules (import) 直接更新模块,不需要重新编译整个项目。
  2. 利用 WebSocket 监听变更,局部更新文件,无需整个页面刷新
  3. 对于 CSS / Vue SFC(单文件组件),可以精准替换,不影响页面状态。

📌 示例:修改 Vue 组件

  • Vite 直接替换模块,不会触发整个应用重新加载:
// Vite 内部 HMR 机制
import.meta.hot.accept((newModule) => {
  updateComponent(newModule.default)
})
  • 速度快,因为 只替换一个 Vue 组件,不影响其他模块。

🔥 Webpack 的 HMR 机制

  1. 使用 Webpack Dev Server + HMR 插件,监听文件变化。
  2. 通过 Webpack module.hot.accept() 处理模块更新
  3. 模块更新时,需要重新构建依赖树,部分依赖可能会影响整个项目。

📌 示例:修改 Vue 组件

if (module.hot) {
  module.hot.accept('./App.vue', () => {
    const NewApp = require('./App.vue').default
    app.component('App', NewApp)
  })
}
  • Webpack 需要手动处理模块替换
  • 构建速度较慢,因为需要重新构建依赖

✅ 3. HMR 更新范围

更新内容Vite HMRWebpack HMR
CSS 直接更新,无页面刷新 直接更新,无页面刷新
Vue / React 组件 仅替换组件,不影响状态 可能会丢失状态(React 需 react-refresh
JS 逻辑 模块级更新,不影响页面状态 依赖链更新,可能导致整个页面刷新
配置文件 需要手动重启 Vite 需要手动重启 Webpack

✅ 4. 总结

  • Vite 更快,因为它 基于 ESM,不需要重新打包整个项目
  • Webpack 适合大项目,但 HMR 更新依赖链较慢,需要优化 Loader / Plugin。
  • 如果是 Vue / React 项目,Vite 的 HMR 更流畅,开发体验更好!🚀

posted on 2025-03-15 23:38  ChoZ  阅读(193)  评论(0)    收藏  举报

导航