1、请确保用一个条件语句守护所有 HMR API 的使用,这样代码就可以在生产环境中被 tree-shaking 优化:
if (import.meta.hot) {
// HMR 代码
}
2、hmr相关api
(1)hot.accept
接收自身模块热更新
export const count = 1
if (import.meta.hot) {
import.meta.hot.accept((newModule) => {
newModule为自身模块
console.log('updated: count is now ', newModule.count)
})
}
接收依赖项进行更新
import { foo } from './foo.js'
foo()
if (import.meta.hot) {
import.meta.hot.accept('./foo.js', (newFoo) => {
回调函数接收到更新后的'./foo.js' 模块
newFoo.foo()
})
也可以接受一个依赖模块的数组:
import.meta.hot.accept(
['./foo.js', './bar.js'],
([newFooModule, newBarModule]) => {
回调函数接收一个更新后模块的数组
}
)
}
(2)hot.dispose
一个接收自身的模块或一个期望被其他模块接收的模块可以使用hot.dispose来清除任何由其更新副本产生的持久副作用
function setupSideEffect() {}
setupSideEffect()
if (import.meta.hot) {
import.meta.hot.dispose((data) => {
清理副作用,如模块中开启了定时器,热更新会造成再次重复开启
})
}
(3)hot.data
import.meta.hot.data对象在同一个更新模块的不同实例之间持久化。它可以用于将信息从模块的前一个版本传递到下一个版本
(4)hot.decline()
表示此模块不可热更新,如果在传播 HMR 更新时遇到此模块,浏览器应该执行完全重新加载
(5)hot.invalidate()
现在调用 import.meta.hot.invalidate() 只是重新加载页面。
(6)hot.on(event, cb)
.监听自定义hmr事件
vite内置事件
'vite:beforeUpdate' 当更新即将被应用时(例如,一个模块将被替换)
'vite:beforeFullReload' 当完整的重载即将发生时
'vite:beforePrune' 当不再需要的模块即将被剔除时
'vite:error' 当发生错误时(例如,语法错误)
自定义监听
配合插件的handleHotUpdate进行发送
vite hmr热更新
于 2022-03-08 13:53:52 首次发布