brand logo

ドキュメント

<NuxtErrorBoundary>

<NuxtErrorBoundary> コンポーネントは、デフォルトスロットで発生するクライアントサイドのエラーを処理します。

<NuxtErrorBoundary> は内部で Vue の onErrorCaptured フックを使用しています。

イベント

  • @error: コンポーネントのデフォルトスロットがエラーをスローしたときに発生するイベント。

    <template>
      <NuxtErrorBoundary @error="logSomeError">
        <!-- ... -->
      </NuxtErrorBoundary>
    </template>
    

スロット

  • #error: エラーが発生した場合に表示するフォールバックコンテンツを指定します。

      <template>
        <NuxtErrorBoundary>
          <!-- ... -->
          <template #error="{ error, clearError }">
            <p>エラーが発生しました: {{ error }}</p>
    
            <button @click="clearError">エラーをクリア</button>
          </template>
        </NuxtErrorBoundary>
      </template>
    
こちらも参照 getting-started > error-handling

スクリプト内での errorclearError へのアクセス

コンポーネントのスクリプト内で errorclearError プロパティに以下のようにアクセスできます:

<template>
  <NuxtErrorBoundary ref="errorBoundary">
    <!-- ... -->
  </NuxtErrorBoundary>
</template>

<script setup lang="ts">
const errorBoundary = useTemplateRef('errorBoundary')

// errorBoundary.value?.error
// errorBoundary.value?.clearError()
</script>

tips

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

NuxtErrorBoundaryとは?〜クライアントサイドのエラーを安全に扱うために〜

Webアプリケーション開発において、ユーザー体験を損なわずにエラーを適切に処理することは非常に重要です。特にNuxtのようなフレームワークでは、サーバーサイドレンダリング(SSR)とクライアントサイドレンダリング(CSR)が混在するため、クライアント側で発生する予期せぬエラーをどう扱うかが課題となります。

NuxtErrorBoundaryは、VueのonErrorCapturedフックを内部で利用し、子コンポーネントのレンダリング中に発生したクライアントサイドのエラーをキャッチして安全に処理できるコンポーネントです。これにより、アプリ全体のクラッシュを防ぎつつ、ユーザーに適切なフィードバックを提供できます。


まず結論:NuxtErrorBoundaryのポイント

  • クライアントサイドのエラーを捕捉し、UIの崩壊を防ぐ
    子コンポーネントのエラーを検知し、フォールバックUIを表示可能。

  • エラー発生時にイベントを発火できる
    @errorイベントでエラー情報を取得し、ログ送信や通知に活用できる。

  • エラー表示用のスロットを用意できる
    #errorスロットでカスタムのエラーメッセージやリトライボタンなどを実装可能。

  • エラー状態のリセットも可能
    clearErrorメソッドでエラー状態を解除し、再レンダリングを試みられる。

  • SSRではなくクライアントサイド専用のエラーハンドリング
    サーバー側のエラーとは別に、クライアント側の動的な問題に対応。


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

使うべきケース

  • 動的に読み込むコンポーネントや外部API連携でエラーが起きやすい場合
    例えば、ユーザー操作に応じて表示内容が変わる部分でのエラーを局所的に処理したいとき。

  • ユーザーにエラー発生時の代替UIを見せたい場合
    単にエラーをログに残すだけでなく、リトライボタンや説明文を表示したいとき。

  • 大規模なページで一部のコンポーネントだけエラーが起きてもページ全体を維持したい場合
    ページ全体のクラッシュを防ぎ、部分的にフォールバックUIを表示するため。

使わない方がよいケース

  • サーバーサイドでのエラー処理が必要な場合
    NuxtErrorBoundaryはクライアントサイド専用なので、SSRでのエラーは別途対応が必要。

  • エラーをグローバルに一括管理したい場合
    アプリ全体のエラー管理はVuexやPinia、Nuxtのエラーハンドリング機構を使うほうが適切。

  • パフォーマンスが極めて重要で、余計なレンダリングを避けたい場合
    エラーバウンダリの使用は若干のオーバーヘッドがあるため、必要な箇所に限定するのが望ましい。


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

1. 外部APIのデータ取得コンポーネントでのエラー処理

API通信でエラーが起きた場合に、ユーザーにわかりやすくエラーメッセージとリトライボタンを表示。

<template>
  <NuxtErrorBoundary @error="handleError">
    <ApiDataDisplay />
    <template #error="{ error, clearError }">
      <div>
        <p>データの取得に失敗しました: {{ error.message }}</p>
        <button @click="clearError">再試行</button>
      </div>
    </template>
  </NuxtErrorBoundary>
</template>

<script setup>
function handleError(error) {
  console.error('API取得エラー:', error)
  // ここでログ送信なども可能
}
</script>

2. ユーザー操作で動的に切り替わるコンポーネントの保護

ユーザーの操作ミスや予期しない状態遷移でエラーが発生しても、ページ全体の崩壊を防ぐ。

<template>
  <NuxtErrorBoundary>
    <DynamicUserComponent :userId="selectedUserId" />
    <template #error="{ error, clearError }">
      <p>コンポーネントの読み込みに問題が発生しました。</p>
      <button @click="clearError">再読み込み</button>
    </template>
  </NuxtErrorBoundary>
</template>

3. 複数の子コンポーネントをまとめてエラーハンドリング

複数の子要素をまとめて囲み、どこかでエラーが起きても一括で処理。

<template>
  <NuxtErrorBoundary @error="logError">
    <ChildComponentA />
    <ChildComponentB />
    <template #error="{ error, clearError }">
      <p>エラーが発生しました: {{ error.message }}</p>
      <button @click="clearError">クリア</button>
    </template>
  </NuxtErrorBoundary>
</template>

<script setup>
function logError(error) {
  // エラーログを外部サービスに送信
  console.log('捕捉されたエラー:', error)
}
</script>

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

SSRとCSRの違いに注意

NuxtErrorBoundaryはクライアントサイドでのみ動作します。サーバーサイドでのレンダリング時に発生したエラーは捕捉できません。したがって、SSRでのエラーはNuxtのサーバー側エラーハンドリング機構を利用してください。

Hydrationエラーとの関係

クライアント側でのHydration(サーバーで生成されたHTMLにVueのリアクティブ機能を紐付ける処理)時に発生するエラーは、NuxtErrorBoundaryで捕捉できない場合があります。Hydrationエラーは通常、コードの不整合や非同期処理の問題が原因なので、事前に修正することが重要です。

パフォーマンスへの影響

エラーバウンダリはエラー検知のために追加の監視処理を行うため、過剰に多用するとパフォーマンスに影響を与える可能性があります。特に大量のコンポーネントに囲いを設けるのは避け、必要な箇所に限定して使いましょう。

エラー状態のリセットを忘れない

clearErrorを呼び出さずにエラー状態を放置すると、フォールバックUIが表示されたままになるため、ユーザーが操作を続けられません。リトライボタンなどで必ずリセットできるUIを用意しましょう。


まとめ

NuxtErrorBoundaryは、Nuxtアプリケーションのクライアントサイドで発生するエラーを局所的に捕捉し、ユーザー体験を損なわずに安全に処理するための強力なツールです。適切に使うことで、部分的なUIの崩壊を防ぎ、エラー発生時にユーザーにわかりやすいフィードバックを提供できます。

ただし、SSRのエラーとは役割が異なるため、両者を使い分けることが重要です。また、パフォーマンスやHydrationの問題にも注意しつつ、実務でのユースケースに応じて適切に導入してください。


NuxtErrorBoundaryはVueのonErrorCapturedを活用しているため、Vueのエラーハンドリングの仕組みを理解しておくとより効果的に使えます。