Next.js
におけるエラー境界の実装
Next.js
では、ReactのError Boundary
を使用して、予期しないエラーが発生した際にアプリケーションの一部がクラッシュするのを防ぐことができます。エラーをキャッチし、ユーザーにカスタムメッセージやエラーページを表示することで、アプリケーションの安定性を向上させます。ここでは、エラー境界の基本的な実装方法と、その活用法について解説します。
ReactのErrorBoundary
を使ったエラー境界
Next.js
のアプリケーションでエラーをキャッチするには、ErrorBoundary
を利用する方法があります。これは、子コンポーネントで発生したエラーをキャッチし、代わりにフォールバックUIを表示する仕組みです。
import React from 'react';
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
console.error(error, errorInfo);
}
render() {
if (this.state.hasError) {
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
export default ErrorBoundary;
このErrorBoundary
コンポーネントでアプリケーション全体や特定の部分をラップし、エラー発生時に安全なUIに切り替えることができます。
global-error.js
の利用
Next.js
のApp Routerで、アプリ全体のエラーを処理するためにglobal-error.js
を使用することができます。このファイルは、アプリ全体で発生するエラーを包括的にキャッチし、フォールバックUIを表示する役割を果たします。
'use client';
import React from 'react';
export default function GlobalError({ error, reset }) {
return (
<div>
<h1>エラーが発生しました。</h1>
<button onClick={reset}>もう一度試す</button>
</div>
);
}
このglobal-error.js
は、クライアントサイドで動作し、本番環境でのみ有効です。開発中にはデフォルトのエラーメッセージが表示されます。
ユーザー入力を保持するための工夫
エラーが発生した際に、フォームの入力内容が失われないようにするためには、sessionStorage
を使ったキャッシュの手法が効果的です。例えば、GitHubのようなサイトでは、入力中のデータが自動的に保存され、エラー後やページのリロード後でも復元可能です。
sessionStorage.setItem('formData', JSON.stringify(formData));
const savedData = JSON.parse(sessionStorage.getItem('formData'));
この方法を使用すると、エラー時に入力データを保持でき、ユーザー体験を向上させることができます。
まとめ
Next.js
でのエラー境界の実装は、アプリケーションの安定性を保ち、ユーザーに快適な体験を提供するために不可欠です。ErrorBoundary
やglobal-error.js
を利用して、エラー発生時に適切な処理を行いましょう。また、ユーザー入力をキャッシュする工夫を取り入れることで、エラー時でもデータを失わない工夫が可能です。