面试题答案
一键面试核心模块
- webpack-dev-server:搭建开发服务器,负责与客户端建立WebSocket连接,监听文件变化并向客户端推送更新消息。
- webpack Hot Module Replacement (HMR) runtime:运行在浏览器端,负责接收来自服务器的更新消息,并协调模块热替换的过程。它管理模块的状态,确保在更新时能正确处理新旧模块之间的依赖关系。
- module.hot API:提供给开发者在模块内部使用的接口,用于定义模块如何进行热替换。开发者可以通过这个API指定在模块更新时需要执行的逻辑,例如如何处理模块状态的变化等。
- webpack compiler:负责编译webpack配置文件,将所有模块打包成bundle。在开发模式下,它会监听文件系统的变化,当文件发生更改时,重新编译相关模块并生成增量更新。
交互过程
- 初始加载:
- 用户启动webpack-dev-server,webpack compiler开始编译项目,生成初始的bundle文件。
- webpack-dev-server将bundle文件发送到浏览器,浏览器加载bundle,HMR runtime也随之启动,并与webpack-dev-server建立WebSocket连接。
- 文件变化检测:
- webpack compiler持续监听文件系统变化。当检测到文件变化时,它会重新编译发生变化的模块及其依赖,生成新的模块代码和更新信息(delta)。
- 更新推送:
- webpack-dev-server接收到新的编译结果后,通过WebSocket向浏览器端的HMR runtime发送更新消息,消息中包含需要更新的模块信息。
- 热更新处理:
- HMR runtime接收到更新消息后,首先检查更新是否可以应用。如果可以,它会尝试下载新的模块代码。
- 对于使用了module.hot API的模块,HMR runtime会调用开发者定义的热替换逻辑,处理模块状态的迁移。例如,在一个React组件模块中,可以使用
module.hot.accept
来指定当组件更新时如何处理组件内部的状态,避免重新渲染导致状态丢失。 - 完成热替换后,页面不会重新加载,而是保持当前状态并应用新的模块代码,实现热更新效果。如果热更新过程中出现错误,HMR runtime会向开发者报告错误信息。