原创翻译,转载请注明出处。
原文地址:https://webpack.js.org/concepts/hot-module-replacement/
模块热替换(Hot Module Replacement/HMR),用来在一个运行中的应用里变换,增加和删除模块,而不需要页面再加载。这使变更一个模块的时候,不用通过刷新页面而更新这个模块,提高了开发的速度。
它是怎样工作的?
以应用视点
- 应用代码要求运行期HMR检查更新。
- 运行期HMR下载更新(异步),并告诉应用code发现了一个更新。
- 应用code要求运行期HMR实施更新。
- 运行期HMR实施(同步)
你可以通过设定HMR使这个过程自动执行,或者你可以选择在发生更新的时候请求用户交互。
以编译器(webpack)视点
除了正常的资源以外,编译器需要发出一个“update”来实现旧版本到新版本的更新。这个“update”包含了两部分:
- 更新清单(JSON)
- 一个或多个更新代码块(JavaScript)
更新清单包含一个新的编译哈希值和一个包含所有更新代码块的一览。
每一个更新代码块包含了存在于各自代码块里的被更新模块(或者一个表示模块被移除的标识符)
编译器确保在每次构建过程中模块ID和代码块ID一致。它通常把这些ID保存在内存中(例如,当使用webpack-dev-server的时候),但是也可以把它们存储在JSON文件中。
以模块视点
HMR是一个可选择使用的特性,它只影响包含HMR代码的模块。一个例子是通过style-loader来引入样式。为了让它有效,style-loader实现了HMR接口;当它通过HMR接收到一个更新的时候,用新的样式来替代旧的样式。
同样的,当一个模块实现了HMR接口的时候,你可以描述当发生更新的时候应该发生什么。
然而,在大多数情况下,并不强制在每一个模块里写HMR代码。如果一个模块没有HMR处理程序,更新就向上冒泡。这就意味着一个处理程序可以对完整的模块树进行更新。如果在这个模块树里的一个模块被更新了的话,这个模块树被重新载入(只是被重新载入,不是被更换)
以运行期HMR视点(技术上的)
对于模块系统运行期,会产生附加代码来跟踪父模块和子模块。
在管理方面,运行期支持两个方法:check和apply
- Check发出对更新清单的HTTP请求。如果请求失败了,就是没有更新。如果成功了的话,对被更新代码块的列表和现在已经加载的代码块列表进行比较。对每一个已加载的代码块,下载相对应的更新代码块。所有的模块更新都保存在运行期里。当所有更新代码块都被下载完并准备好实施,运行期转入ready状态。
- apply方法把所有更新过的模块标识为无效。对每一个无效模块,都需要一个在模块里或者在它父模块里的更新处理程序。另外,无效标识符会向上冒泡,使它的父模块也变为无效。每个冒泡一直持续到应用的入口点,或者到达一个带有更新处理程序的模块(看哪个先发生)。如果它从入口点开始冒泡,那么处理失败。
然后,所有的无效模块都被销毁(通过销毁处理程序)并被卸载掉。然后更新现在的哈希值,并且调用所有的accept处理程序。运行期切换回idle状态,一切正常继续。
能用它做什么?
可以在开发过程中实时再加载/替换来使用。webpack-dev-server支持一种热模式,它在试图再加载整个页面之前,尝试使用HMR加载更新部分。参照在React里实施HMR的例子。
一些加载器已经生成了可热更新的模块。例如,style-loader可以置换出一个页面的样式表。像这样的模块,你不需要做任何特别的事情。
Webpack的强大在于它的可定制,并且根据每个项目不同需求,有很多方法来配置HMR。
-- End --
相关推荐
Webpack 是一个强大的模块打包工具,它能够处理 JavaScript、CSS、图片等静态资源,通过配置可以实现按需加载、代码分割、热替换等功能。 在 Python Web 开发中,Flask 是一个轻量级且灵活的 Web 框架,常用于构建 ...
### Webpack 1.x 指导文档 #### 1.1 概述 Webpack 是一款用于打包前端模块的工具,主要用于处理 JavaScript 文件,并能够转换、捆绑、打包其他类型的静态资源,例如 CSS、图片、字体文件和模板等。在前端项目开发...
- **插件系统**:Webpack 提供了一个强大的插件系统,允许开发者扩展其功能,比如优化输出文件、实时编译和热替换等。 #### 三、模块系统与Webpack的关系 **模块系统** 主要涉及模块的定义、依赖管理和导出机制。...
- **热更新(Hot Module Replacement, HMR)**: 实现模块的实时替换,无需刷新页面。 - **DevServer**: 内置服务器,方便开发调试。 - **常见问题及解决方案**: - **错误排查**: 查阅Webpack官方文档或社区资源...
Vue CLI 3 还提供了热模块替换(Hot Module Replacement,HMR)、代码分割、预设的优化选项等功能,大大提升了开发效率。在实际开发中,开发者可以根据需要添加额外的Vue插件,如Vuex进行状态管理,或者Element UI等...
1. **热模块替换(HMR)**: HMR是Webpack等构建工具的一个特性,能够在不刷新整个页面的情况下替换和更新模块,保持应用状态,提高开发效率。 2. **构建工具**: 可能是基于Webpack、Rollup或Parcel等构建工具进行...
### Webpack2 中文文档概览 #### Webpack 概述 Webpack 是一款现代前端项目的模块打包工具。它能够将项目中的多个独立模块按照依赖关系和规则打包成适合生产环境部署的静态资源,并且支持按需加载的代码分割功能。...
6. **热模块替换(Hot Module Replacement, HMR)**:为了实现开发过程中代码的实时更新,需要在Webpack配置中启用HMR。这将提升开发效率,但配置不当可能导致问题。 7. **错误日志**:当Vue报错时,仔细阅读错误...
- 在`devServer`配置中启用热模块替换(Hot Module Replacement),提高开发效率。 - 自定义`stats`选项以控制Webpack在构建过程中的输出信息。 记住,Webpack配置是高度可定制的,可以根据项目需求进行调整。随着...
- **热模块替换(Hot Module Replacement, HMR)**:学习如何在不刷新页面的情况下实时更新应用中的模块。 #### 本书结构 本书分为两大部分: 1. **开发阶段**:涵盖Webpack的基本设置、配置拆分、自动浏览器刷新等...
- 考虑使用ES6模块和Webpack进行代码组织和打包,提高代码复用性和维护性。 5. **测试与部署** - 使用浏览器的开发者工具进行前端调试,确保所有功能正常运行。 - 将项目部署到服务器,进行实际环境测试。 总的...
7. **热模块替换(Hot Module Replacement)**:Webpack的一项高级功能,允许在不刷新整个页面的情况下更新模块,提高开发效率。 8. **开发服务器**:Webpack Dev Server提供了一个本地开发服务器,可以实时编译和...
4. **热模块替换(Hot Module Replacement)**:在不刷新页面的情况下更新模块,加快开发速度。 5. **性能分析(Performance Analysis)**:通过`webpack-bundle-analyzer`等工具分析打包后的文件大小,优化资源分配...
8. **热模块替换(Hot Module Replacement)**: 一种实时更新代码的技术,无需刷新页面即可看到代码变更的效果,提高开发效率。 9. **CommonsChunkPlugin**: 在Webpack 1.x中,这个插件用于提取公共模块,减少网络...
- **热模块替换**(HMR):支持开发模式下的热更新,无需手动刷新浏览器即可看到代码更改效果。 - **优化**:可能包含了代码压缩、去除未使用的代码、生成Source Map等功能,以提升生产环境的性能。 Webpack-...
5. **热模块替换(Hot Module Replacement,HMR)**:在不刷新整个页面的情况下更新模块,提高开发效率。 6. **Loader Options API**:提供了一种更统一的方式来设置加载器的选项,使得配置更加简洁。 7. **更好的...
10. **热模块替换(Hot Module Replacement, HMR)** HMR 是Webpack提供的一项功能,可以在不刷新整个页面的情况下更新模块,提高开发效率。通过配合`webpack-dev-server`和相关配置,可以轻松启用HMR。 11. **...
5. **模块化和兼容性**:考虑到现代前端开发的需求,SVG Injector通常与模块打包工具如Webpack或Rollup配合使用。它兼容各种浏览器,包括较旧版本的IE,确保项目的广泛适用性。 6. **API接口**:SVG Injector提供了...