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' 当不再需要的模块即将被剔除时