コンテンツへスキップ

HMR hotUpdate プラグインフック

フィードバック

環境APIフィードバックディスカッションでフィードバックをお寄せください

Viteは、handleHotUpdate プラグインフックを非推奨にし、環境APIに対応したhotUpdate フックに移行し、createdelete で追加の監視イベントを処理することを計画しています。

対象範囲: Vite プラグイン作者

将来的な非推奨化

hotUpdatev6.0 で初めて導入されました。handleHotUpdate の非推奨化は将来のメジャーリリースで計画されています。まだ 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 []
}

MIT ライセンスで公開。(083ff36d)