🚨

NextjsでのErrorBoundaryの使い分け(page単位とコンポーネント単位)

に公開
2025/12/20
4件

NextjsでのError Boundaryの使い分け

初めに

業務でNextjsでweb applicationを作成しています。
Error Boundaryを使ってエラー時のUIの対応を行いました。
error.tsxは使ったことはあるのですが、
client componentで起きているjavascriptエラーをコンポーネント単位でエラー時のUIの表示をする必要があり、error.tsxのページ単位でのエラーを表示したくない。コンポーネント単位で抑えたいという要件です。
そこでErrorBoundary.tsxを使い対応を行ったので備忘として書き記したいと思います。

上記の実装にあたり、初めてError Boundary.tsxを使い実装しました。

間違いやアドバイスあればご教示いただきたいです!

結論:使い分け

どちらもerrorboundaryに変わりはありませんが、用途は異なるようです。
自分の中では使い分けは以下で理解しました。
今回は後者のErrorBoundary.tsxについて触れます。

  • error.tsx: ページレベルのエラー(nextjs特有のerrorboundary)
  • ErrorBoundary.tsx: コンポーネントレベルのエラー(reactのクライアントコンポーネント用errorboundary)

概要

React Error Boundaryは、コンポーネントツリー内でJavaScriptエラーをキャッチし、フォールバックUIを表示する仕組み。

Next.js App Routerでの実装

1. 共通利用のError Boundaryコンポーネント作成

'use client'
import { Component, ReactNode } from 'react'

interface Props {
  children: ReactNode
  fallback?: ReactNode
}

interface State {
  hasError: boolean
}

class ErrorBoundary extends Component<Props, State> {
  constructor(props: Props) {
    super(props)
    this.state = { hasError: false }
  }

  static getDerivedStateFromError(): State {
    return { hasError: true }
  }

  componentDidCatch(error: Error, errorInfo: any) {
    console.error('Error caught by boundary:', error, errorInfo)
  }

  render() {
    if (this.state.hasError) {
      return this.props.fallback ?? <p>エラーが発生しました。</p>
    }
    return this.props.children
  }
}

2. コンポーネントをラップしfallback要素としてエラー時に表示したい内容を渡す

<ErrorBoundary fallback={<ErrorComponent />}>
  <ComponentA/>
</ErrorBoundary>

Next.js特有の注意点

  • Server Component内では使用不可 - 'use client'が必要
  • Client Component境界で実装 - Server/Client間でエラーハンドリングを分離

終わりに

nextjsでのserver componentでの fetchエラー時に表示するUIの対応は以前から行っていましたが、今回初めてclient componentで発生したエラーをError Bonudry.tsxを使い対処しました。
間違えている箇所やアドバイスがあればぜひご指摘ください!

実装にあたり参考にした記事

https://zenn.dev/akfm/books/nextjs-basic-principle

https://zenn.dev/k_mori/books/24320553af0956

https://zenn.dev/hakoten/articles/f5b577d8b63a4a

Discussion

ふっけーふっけー

コメント失礼します!
NextJSの標準APIにErrorBoundaryが導入されたので、そちら使っても良いかもですね!

れんれん

コメントありがとうございます!
すみませんここについては勉強中で、間違っていたらしっかり理解したいので質問させてください!
現段階では以下が私の理解なのですが間違っている点あれば教えてください!

私の理解
・ErrorBoundaryの概念はReact、Nextjs共通
・React、Next.jsで出来る事⇒ErrorBoundaryクラスを使ってクライアントコンポーネントのコンポーネント単位でのfallback UIの対応。
・Next.jsのみで出来ること⇒error.tsxを使いページ単位のfallback UIの表示に対応。

そこで2点質問です。
1,Next.js(ver15)でアプリケーション作成時に、error.tsxを出来るだけ表示せずコンポーネント単位でエラーを抑えるようにとのことでerror boundaryクラスとerror.tsxを使い分けた対応を取っておりますが、こちら実装方法異なりますか?

2,以下のコメントの意図が掴めなかったためご教示いただきたいのですが、NextJSの標準APIにErrorBoundaryが追加されたとはどれの事を指されていますか?error.jsのことでしょうか?
であればページ単位でのfallback UIが表示される認識です。

https://nextjs.org/docs/app/api-reference/file-conventions/error

NextJSの標準APIにErrorBoundaryが導入されたので、そちら使っても良いかもですね!

ふっけーふっけー

ご返信ありがとうございます!
下記回答させていただきます!

  1. Next.js(ver15)でアプリケーション作成時に、error.tsxを出来るだけ表示せずコンポーネント単位でエラーを抑えるようにとのことでerror boundaryクラスとerror.tsxを使い分けた対応を取っておりますが、こちら実装方法異なりますか?
  • 実装方法は変わりありません!ただ、Next.jsの標準APIにErrorBoundaryがあったので個人的にはそちらを使うようにしています!(上記クラスとほとんど同じ挙動をする認識です!)
  1. 以下のコメントの意図が掴めなかったためご教示いただきたいのですが、NextJSの標準APIにErrorBoundaryが追加されたとはどれの事を指されていますか?error.jsのことでしょうか?
    であればページ単位でのfallback UIが表示される認識です。

https://nextjs.org/docs/app/getting-started/error-handling
https://zenn.dev/sarusy/articles/108ce694717202

こちらの記事のNested error boundariesと僕の記事を見ていただきたいのですが、ErrorBoundaryはNext.jsのimport { ErrorBoundary } from "next/dist/client/components/error-boundary"として、標準APIに登録されています!
使い方はれんさんのErrorBoundaryと同じで、任意のコンポーネントをこれでラップしてあげると全く同じように動作します!
error.jsがページ単位のfallback UIが表示される認識は僕も同じです!

1
れんれん

ご丁寧に解説いただきありがとうございます!

import { ErrorBoundary } from "next/dist/client/components/error-boundary"

こんなの導入されていたなんて全然知りませんでした、、
早速ふっけーさんの記事を参考に触ってみます✊
ふっけーさんのおかげでここの解像度が増しました!!
コメントいただきありがとうございました!

1