<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>
例
スクリプト内での error と clearError へのアクセス
コンポーネントのスクリプト内で error と clearError プロパティに以下のようにアクセスできます:
<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のエラーハンドリングの仕組みを理解しておくとより効果的に使えます。
※このページは Nuxt.js 公式ドキュメントの翻訳ページです。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/api/components/nuxt-error-boundary