HMR hotUpdate
插件钩子
反馈
请在 环境 API 反馈讨论 中提供您的反馈。
我们计划弃用 handleHotUpdate
插件钩子,转而使用 hotUpdate
钩子 以支持 环境 API,并使用 create
和 delete
处理额外的观察事件。
受影响范围:Vite 插件作者
未来弃用
hotUpdate
最初是在 v6.0
中引入的。handleHotUpdate
的弃用计划在 v7.0
中进行。我们目前尚不建议迁移出 handleHotUpdate
。如果您想尝试并提供反馈,可以在您的 vite 配置文件中将 future.removePluginHookHandleHotUpdate
设置为 "warn"
。
动机
handleHotUpdate
钩子 允许执行自定义的 HMR 更新处理。需要更新的模块列表在 HmrContext
中传递。
ts
interface HmrContext {
file: string
timestamp: number
modules: Array<ModuleNode>
read: () => string | Promise<string>
server: ViteDevServer
}
此钩子针对所有环境调用一次,并且传递的模块包含来自客户端和 SSR 环境的混合信息。一旦框架迁移到自定义环境,就需要一个针对每个环境调用的新钩子。
新的 hotUpdate
钩子的工作方式与 handleHotUpdate
相同,但它会针对每个环境调用,并接收一个新的 HotUpdateOptions
实例。
ts
interface HotUpdateOptions {
type: 'create' | 'update' | 'delete'
file: string
timestamp: number
modules: Array<EnvironmentModuleNode>
read: () => string | Promise<string>
server: ViteDevServer
}
可以使用 this.environment
访问当前的开发环境,就像在其他插件钩子中一样。modules
列表现在仅包含来自当前环境的模块节点。每个环境更新可以定义不同的更新策略。
此钩子现在还针对其他观察事件调用,而不仅仅是针对 'update'
。使用 type
来区分它们。
迁移指南
过滤并缩小受影响的模块列表,使 HMR 更准确。
js
handleHotUpdate({ modules }) {
return modules.filter(condition)
}
// Migrate to:
hotUpdate({ modules }) {
return modules.filter(condition)
}
返回空数组并执行完整重新加载
js
handleHotUpdate({ server, modules, timestamp }) {
// Invalidate modules manually
const invalidatedModules = new Set()
for (const mod of modules) {
server.moduleGraph.invalidateModule(
mod,
invalidatedModules,
timestamp,
true
)
}
server.ws.send({ type: 'full-reload' })
return []
}
// Migrate to:
hotUpdate({ modules, timestamp }) {
// Invalidate modules manually
const invalidatedModules = new Set()
for (const mod of modules) {
this.environment.moduleGraph.invalidateModule(
mod,
invalidatedModules,
timestamp,
true
)
}
this.environment.hot.send({ type: 'full-reload' })
return []
}
返回空数组并通过向客户端发送自定义事件执行完整的自定义 HMR 处理
js
handleHotUpdate({ server }) {
server.ws.send({
type: 'custom',
event: 'special-update',
data: {}
})
return []
}
// Migrate to...
hotUpdate() {
this.environment.hot.send({
type: 'custom',
event: 'special-update',
data: {}
})
return []
}