Home / Class/ HMRContext Class — vite Architecture

HMRContext Class — vite Architecture

Architecture documentation for the HMRContext class in hmr.ts from the vite codebase.

Entity Profile

Dependency Diagram

graph TD
  d86a8333_3c9a_922b_57b2_926575326289["HMRContext"]
  56154347_d0e1_1403_ce0e_25508620362c["hmr.ts"]
  d86a8333_3c9a_922b_57b2_926575326289 -->|defined in| 56154347_d0e1_1403_ce0e_25508620362c
  99e78c4e_c5fd_cc5a_c78d_d4a1f68ab5ce["constructor()"]
  d86a8333_3c9a_922b_57b2_926575326289 -->|method| 99e78c4e_c5fd_cc5a_c78d_d4a1f68ab5ce
  84526a55_d2ac_9585_b652_69e0e81df1a9["data()"]
  d86a8333_3c9a_922b_57b2_926575326289 -->|method| 84526a55_d2ac_9585_b652_69e0e81df1a9
  f0b7b836_2021_adcb_4b70_ecd5293b9089["accept()"]
  d86a8333_3c9a_922b_57b2_926575326289 -->|method| f0b7b836_2021_adcb_4b70_ecd5293b9089
  3d354a6c_d47c_7e0f_a3c9_c335e4eb5721["acceptExports()"]
  d86a8333_3c9a_922b_57b2_926575326289 -->|method| 3d354a6c_d47c_7e0f_a3c9_c335e4eb5721
  b0e854be_b32c_d548_8cce_50eee722b15e["dispose()"]
  d86a8333_3c9a_922b_57b2_926575326289 -->|method| b0e854be_b32c_d548_8cce_50eee722b15e
  5e2ee04a_805b_189d_e857_9ca523f61c13["prune()"]
  d86a8333_3c9a_922b_57b2_926575326289 -->|method| 5e2ee04a_805b_189d_e857_9ca523f61c13
  030186c4_078d_bee6_8038_20c37ac16377["decline()"]
  d86a8333_3c9a_922b_57b2_926575326289 -->|method| 030186c4_078d_bee6_8038_20c37ac16377
  8734724b_d91d_59c5_6ae1_9c54c972eea0["invalidate()"]
  d86a8333_3c9a_922b_57b2_926575326289 -->|method| 8734724b_d91d_59c5_6ae1_9c54c972eea0
  e9e2f4e6_b4f1_9171_926a_46f9ab95209e["on()"]
  d86a8333_3c9a_922b_57b2_926575326289 -->|method| e9e2f4e6_b4f1_9171_926a_46f9ab95209e
  0e7590d6_da27_d1a7_ad53_e83555f6c9e5["off()"]
  d86a8333_3c9a_922b_57b2_926575326289 -->|method| 0e7590d6_da27_d1a7_ad53_e83555f6c9e5
  6cbd2953_6c7a_3620_4afe_54813dab91b1["send()"]
  d86a8333_3c9a_922b_57b2_926575326289 -->|method| 6cbd2953_6c7a_3620_4afe_54813dab91b1
  73d5c6b6_4669_9083_4698_693c1d9a8117["acceptDeps()"]
  d86a8333_3c9a_922b_57b2_926575326289 -->|method| 73d5c6b6_4669_9083_4698_693c1d9a8117

Relationship Graph

Source Code

packages/vite/src/shared/hmr.ts lines 24–168

export class HMRContext implements ViteHotContext {
  private newListeners: CustomListenersMap

  constructor(
    private hmrClient: HMRClient,
    private ownerPath: string,
  ) {
    if (!hmrClient.dataMap.has(ownerPath)) {
      hmrClient.dataMap.set(ownerPath, {})
    }

    // when a file is hot updated, a new context is created
    // clear its stale callbacks
    const mod = hmrClient.hotModulesMap.get(ownerPath)
    if (mod) {
      mod.callbacks = []
    }

    // clear stale custom event listeners
    const staleListeners = hmrClient.ctxToListenersMap.get(ownerPath)
    if (staleListeners) {
      for (const [event, staleFns] of staleListeners) {
        const listeners = hmrClient.customListenersMap.get(event)
        if (listeners) {
          hmrClient.customListenersMap.set(
            event,
            listeners.filter((l) => !staleFns.includes(l)),
          )
        }
      }
    }

    this.newListeners = new Map()
    hmrClient.ctxToListenersMap.set(ownerPath, this.newListeners)
  }

  get data(): any {
    return this.hmrClient.dataMap.get(this.ownerPath)
  }

  accept(deps?: any, callback?: any): void {
    if (typeof deps === 'function' || !deps) {
      // self-accept: hot.accept(() => {})
      this.acceptDeps([this.ownerPath], ([mod]) => deps?.(mod))
    } else if (typeof deps === 'string') {
      // explicit deps
      this.acceptDeps([deps], ([mod]) => callback?.(mod))
    } else if (Array.isArray(deps)) {
      this.acceptDeps(deps, callback)
    } else {
      throw new Error(`invalid hot.accept() usage.`)
    }
  }

  // export names (first arg) are irrelevant on the client side, they're
  // extracted in the server for propagation
  acceptExports(
    _: string | readonly string[],
    callback?: (data: any) => void,
  ): void {
    this.acceptDeps([this.ownerPath], ([mod]) => callback?.(mod))
  }

  dispose(cb: (data: any) => void): void {
    this.hmrClient.disposeMap.set(this.ownerPath, cb)
  }

  prune(cb: (data: any) => void): void {
    this.hmrClient.pruneMap.set(this.ownerPath, cb)
  }

  // Kept for backward compatibility (#11036)
  // eslint-disable-next-line @typescript-eslint/no-empty-function
  decline(): void {}

  invalidate(message: string): void {
    const firstInvalidatedBy =
      this.hmrClient.currentFirstInvalidatedBy ?? this.ownerPath
    this.hmrClient.notifyListeners('vite:invalidate', {
      path: this.ownerPath,
      message,

Domain

Frequently Asked Questions

What is the HMRContext class?
HMRContext is a class in the vite codebase, defined in packages/vite/src/shared/hmr.ts.
Where is HMRContext defined?
HMRContext is defined in packages/vite/src/shared/hmr.ts at line 24.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free