brand logo

ドキュメント

useRuntimeHook

Nuxtアプリケーションでランタイムフックを登録し、スコープが破棄されたときに適切に処理されることを保証します。

このコンポーザブルはNuxt v3.14+で利用可能です。

signature
function useRuntimeHook<THookName extends keyof RuntimeNuxtHooks>(
  name: THookName,
  fn: RuntimeNuxtHooks[THookName] extends HookCallback ? RuntimeNuxtHooks[THookName] : never
): void

使用法

パラメータ

  • name: 登録するランタイムフックの名前。完全なリストはこちらで確認できます。
  • fn: フックがトリガーされたときに実行されるコールバック関数。関数のシグネチャはフック名に基づいて異なります。

戻り値

このコンポーザブルは値を返しませんが、コンポーネントのスコープが破棄されると自動的にフックを解除します。

pages/index.vue
// リンクがプリフェッチされるたびに実行されるフックを登録しますが、
// コンポーネントがアンマウントされると自動的にクリーンアップされ(再度呼び出されません)
useRuntimeHook('link:prefetch', (link) => {
  console.log('Prefetching', link)
})

tips

このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。

NuxtのuseRuntimeHookとは?〜何が嬉しいのか〜

Nuxtアプリケーション開発において、特定のイベントや状態変化に応じて処理を実行したい場面は多々あります。useRuntimeHookは、こうした「ランタイムフック」を簡単に登録できるコンポーザブルで、特にコンポーネントのスコープに紐づけて自動的にフック解除が行われる点が大きな特徴です。

これにより、不要なフックの残存によるメモリリークや意図しない副作用を防ぎつつ、柔軟にイベントを監視・処理できます。SSR(サーバーサイドレンダリング)とCSR(クライアントサイドレンダリング)の両方で安全に使えるため、Nuxtのモダンな開発スタイルにマッチしています。


まず結論:useRuntimeHookのポイント

  • ランタイムフックを簡単に登録できる
    Nuxtが提供する多様なフック名に対応し、イベント発生時にコールバックを実行可能。

  • コンポーネントのスコープに紐づく
    コンポーネントが破棄されると自動的にフック解除されるため、メモリリークを防止。

  • SSR/CSR両対応で安全に使える
    サーバー・クライアントどちらの環境でも問題なく動作。

  • 戻り値はなく、副作用のみを目的とする
    フック登録のための副作用的な処理に特化。


いつ使うべきか?使わない方がよいケースは?

使うべきケース

  • 特定のNuxtランタイムイベントを監視したいとき
    例:リンクのプリフェッチ開始時、ルート遷移時、ビルド完了時など。

  • コンポーネントのライフサイクルに合わせてフックを管理したいとき
    明示的に解除処理を書く必要がなく、スコープ破棄時に自動解除されるため安全。

  • プラグインやモジュールではなく、ページやコンポーネント単位でイベントを扱いたいとき

使わない方がよいケース

  • グローバルに一度だけ登録すればよいフック
    アプリ全体で一度だけ登録したい場合は、プラグインやモジュールで直接フック登録したほうが効率的。

  • フックの戻り値や状態管理が必要な場合
    useRuntimeHookは戻り値を返さず副作用のみなので、状態管理が必要な場合は別途対応が必要。

  • フックの登録・解除を手動で細かく制御したい場合
    自動解除が便利な反面、細かい制御が難しいこともあるため注意。


実務でよくあるユースケースとサンプルコード

1. リンクのプリフェッチ監視

ユーザーがリンクをホバーしたりスクロールで近づいたときにプリフェッチが走ることがあります。これを検知してログを取ったり、カスタム処理を挟みたい場合に便利です。

useRuntimeHook('link:prefetch', (link) => {
  console.log('プリフェッチ開始:', link.href)
  // ここでカスタムロジックを実行可能
})

2. ルート遷移の開始・完了検知

ページ遷移のタイミングでローディング表示やアナリティクス計測を行いたい場合に使えます。

useRuntimeHook('page:start', () => {
  console.log('ページ遷移開始')
  // ローディング表示など
})

useRuntimeHook('page:finish', () => {
  console.log('ページ遷移完了')
  // ローディング非表示など
})

3. ビルド完了イベントの監視(開発時)

開発中にビルドが完了したタイミングで特定の処理を走らせたい場合に利用可能です。

useRuntimeHook('build:done', () => {
  console.log('ビルドが完了しました')
  // 開発用のリフレッシュ処理など
})

よくある落とし穴・注意点

1. SSRとCSRの違いに注意

useRuntimeHookはSSR・CSR両方で動作しますが、フックの内容によってはクライアント限定の処理にしたい場合があります。例えばブラウザAPIを使う処理はサーバー側でエラーになるため、process.clientで条件分岐が必要です。

2. Hydration時の副作用に注意

コンポーネントがサーバーからクライアントにHydrationされる際、フックが複数回呼ばれる可能性があります。副作用が重複しないように設計しましょう。

3. パフォーマンスへの影響

大量のコンポーネントで同じフックを登録すると、イベント発火時に多くのコールバックが走りパフォーマンスに影響が出ることがあります。グローバルに一度だけ登録する方法も検討してください。

4. フックの自動解除を過信しすぎない

自動解除は便利ですが、複雑な状態管理や複数のフックを組み合わせる場合は、明示的に解除処理を実装したほうが安全なケースもあります。


まとめ

useRuntimeHookはNuxtのランタイムイベントをコンポーネント単位で簡単に監視・処理できる強力なツールです。自動的にフック解除されるためメモリリークの心配が減り、SSR/CSR両対応で安心して使えます。

ただし、グローバルに一度だけ登録したい場合や複雑な状態管理が必要な場合は別の方法を検討し、Hydrationやパフォーマンス面の注意も怠らないことが重要です。

実務でのユースケースを踏まえ、適切に使い分けることでNuxt開発の効率と品質を向上させましょう。


useRuntimeHookはNuxt v3.14以降で利用可能です。バージョンを確認してから導入してください。