HMR API
手动 HMR API 主要用于框架和工具作者。作为最终用户,HMR 可能已经在特定于框架的启动器模板中为你处理过了。 :::
Vite 通过特殊的 import.meta.hot
对象暴露手动 HMR API。
首先,请确保用一个条件语句守护所有 HMR API 的使用,这样代码就可以在生产环境中被 tree-shaking 优化:
要接收模块自身,应使用 import.meta.hot.accept
,参数为接收已更新模块的回调函数:
请注意,Vite 的 HMR 实际上并不替换最初导入的模块:如果 HMR 边界模块从某个依赖重新导出其导入,则它应负责更新这些重新导出的模块(这些导出必须使用 let
)。此外,从边界模块向上的导入者将不会收到更新。
这种简化的 HMR 实现对于大多数开发用例来说已经足够了,同时允许我们跳过生成代理模块的昂贵工作。
模块也可以接受直接依赖项的更新,而无需重新加载自身:
hot.dispose(cb)
一个接收自身的模块或一个期望被其他模块接收的模块可以使用 hot.dispose
来清除任何由其更新副本产生的持久副作用:
调用 import.meta.hot.decline()
表示此模块不可热更新,如果在传播 HMR 更新时遇到此模块,浏览器应该执行完全重新加载。
现在调用 import.meta.hot.invalidate()
只是重新加载页面。
hot.on(event, cb)
监听自定义 HMR 事件。
以下 HMR 事件由 Vite 自动触发:
'vite:beforeUpdate'
当更新即将被应用时(例如,一个模块将被替换)'vite:beforeFullReload'
当完整的重载即将发生时'vite:beforePrune'
当不再需要的模块即将被剔除时