This is the client HMR API. For handling HMR update in plugins, see handleHotUpdate.The manual HMR API is primarily intended for framework and tooling authors. As an end user, HMR is likely already handled for you in the framework specific starter templates.
import.meta.hot object:
TypeScript Interface
Required Conditional Guard
First of all, make sure to guard all HMR API usage with a conditional block so that the code can be tree-shaken in production:IntelliSense for TypeScript
Vite provides type definitions forimport.meta.hot in vite/client.d.ts. You can add “vite/client” in the tsconfig.json so TypeScript picks up the type definitions:
hot.accept()
For a module to self-accept, useimport.meta.hot.accept with a callback which receives the updated module.
Type Signature
Parameters
Callback function that receives the updated module. The module is
undefined when a SyntaxError happened.Example
Vite’s HMR does not actually swap the originally imported module: if an HMR boundary module re-exports imports from a dep, then it is responsible for updating those re-exports (and these exports must be using
let). In addition, importers up the chain from the boundary module will not be notified of the change.This simplified HMR implementation is sufficient for most dev use cases, while allowing us to skip the expensive work of generating proxy modules.hot.accept(deps, cb)
A module can also accept updates from direct dependencies without reloading itself.Type Signature
Parameters
Single dependency path to accept updates from
Array of dependency paths to accept updates from
Callback that receives the updated module(s). For single dependency, receives one module. For multiple dependencies, receives an array where only the updated module is non-null.
Example
hot.dispose()
A self-accepting module or a module that expects to be accepted by others can usehot.dispose to clean-up any persistent side effects created by its updated copy.
Type Signature
Parameters
Callback function for cleanup. Receives the
data object which can be used to pass information to the new module instance.Example
hot.prune()
Register a callback that will be called when the module is no longer imported on the page.Type Signature
Parameters
Callback function for cleanup when module is removed from the page
hot.dispose, this can be used if the source code cleans up side-effects by itself on updates and you only need to clean-up when it’s removed from the page. Vite currently uses this for .css imports.
Example
hot.data
Theimport.meta.hot.data object is persisted across different instances of the same updated module. It can be used to pass on information from a previous version of the module to the next one.
Type
Re-assignment of
data itself is not supported. Instead, you should mutate properties of the data object so information added from other handlers are preserved.Example
hot.decline()
This is currently a noop and is there for backward compatibility. This could change in the future if there is a new usage for it. To indicate that the module is not hot-updatable, usehot.invalidate().
hot.invalidate()
A self-accepting module may realize during runtime that it can’t handle a HMR update, and so the update needs to be forcefully propagated to importers.Type Signature
Parameters
Optional message to give context on why the invalidation happened
import.meta.hot.invalidate(), the HMR server will invalidate the importers of the caller, as if the caller wasn’t self-accepting. This will log a message both in the browser console and in the terminal.
You should always call
import.meta.hot.accept even if you plan to call invalidate immediately afterwards, or else the HMR client won’t listen for future changes to the self-accepting module. To communicate your intent clearly, we recommend calling invalidate within the accept callback.Example
hot.on()
Listen to an HMR event.Type Signature
Parameters
The event name to listen for
Callback function that receives the event payload
Built-in Events
The following HMR events are dispatched by Vite automatically:'vite:beforeUpdate'- when an update is about to be applied (e.g. a module will be replaced)'vite:afterUpdate'- when an update has just been applied (e.g. a module has been replaced)'vite:beforeFullReload'- when a full reload is about to occur'vite:beforePrune'- when modules that are no longer needed are about to be pruned'vite:invalidate'- when a module is invalidated withimport.meta.hot.invalidate()'vite:error'- when an error occurs (e.g. syntax error)'vite:ws:disconnect'- when the WebSocket connection is lost'vite:ws:connect'- when the WebSocket connection is (re-)established
Example
hot.off()
Remove callback from the event listeners.Type Signature
Parameters
The event name to remove the listener from
The callback function to remove (must be the same reference as used in
on())hot.send()
Send custom events back to Vite’s dev server.Type Signature
Parameters
Custom event name
Optional data payload to send with the event