Next.js buildエラーの原因と解決方法|初心者向け完全ガイド

React / Next.js

Next.js buildエラーの原因と解決方法|初心者向け完全ガイド

Next.jsでプロジェクトを開発していると、ビルド時に予期しないエラーが発生することがあります。本記事では、Next.js buildエラーの主な原因から解決手順まで、初心者向けに詳しく解説します。

Next.js buildエラーとは

Next.jsのnpm run buildまたはyarn buildコマンド実行時に発生するエラーです。開発環境では正常に動作していても、本番環境のビルド時にエラーが出ることが多くあります。これは、開発モードと本番モードで実行される処理が異なるためです。

Next.js buildエラーの主な原因

1. TypeScriptの型エラー

Next.jsは開発時にTypeScriptの型チェックを実行します。開発環境では型エラーを無視して実行される場合もありますが、ビルド時には厳密にチェックされます。

2. ESLintルール違反

プロジェクトに.eslintrcの設定がある場合、ビルド時にESLintによるチェックが実行されます。ルール違反があるとビルドが失敗します。

3. 外部パッケージの互換性問題

インストールしたnpmパッケージがNext.jsのバージョンと互換性がない場合、ビルドエラーが発生します。

4. 環境変数の不足

ビルド時に必要な環境変数が設定されていないと、エラーが発生することがあります。

5. ファイルパスの問題

WindowsとmacやLinuxではファイルパスの表記方法が異なり、これが原因でビルドエラーが発生することがあります。

Next.js buildエラーの解決手順

ステップ1: エラーメッセージの確認

まずは、ターミナルに表示されるエラーメッセージを詳しく読みましょう。エラーメッセージには、問題の原因と発生した行番号が記載されています。

npm run build
# または
yarn build

エラーメッセージの最後の部分を見ると、「error in」という表記で問題があるファイルが示されます。

ステップ2: TypeScriptエラーの確認

エラーメッセージに「Type error」と表示されている場合は、TypeScriptの型定義に問題があります。以下のコマンドで、型チェックを単独で実行できます。

npx tsc --noEmit

このコマンドで詳細な型エラーを確認し、ファイルの型定義を修正します。

ステップ3: ESLintエラーの確認

ESLintが原因の場合は、以下のコマンドで詳細を確認できます。

npx eslint . --ext .ts,.tsx,.js,.jsx

表示されるルール違反を修正するか、.eslintrcの設定を調整します。

ステップ4: node_modulesの再インストール

パッケージの依存関係が破損している可能性があります。以下の手順で解決することがあります。

rm -rf node_modules
rm package-lock.json  # npm使用時
npm install

Yarnを使用している場合は、yarn.lockを削除してからyarn installを実行します。

ステップ5: キャッシュのクリア

Next.jsのキャッシュが原因でエラーが発生することもあります。

rm -rf .next
npm run build

一般的な解決コード例

例1: TypeScript型エラーの修正

以下は、Reactコンポーネントで型エラーが発生している例と、その修正方法です。

// ❌ エラーが発生するコード
const MyComponent = ({ name }) => {
  return <div>{name}</div>;
};

// ✅ 修正後のコード
interface Props {
  name: string;
}

const MyComponent = ({ name }: Props) => {
  return <div>{name}</div>;
};

export default MyComponent;

例2: 非同期処理のエラー処理

getStaticPropsやgetServerSidePropsで発生しやすいエラーと修正方法です。

// ❌ エラーが発生するコード
export async function getStaticProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();
  
  return {
    props: {
      data,
    },
  };
}

// ✅ 修正後のコード
export async function getStaticProps() {
  try {
    const res = await fetch('https://api.example.com/data');
    if (!res.ok) throw new Error('API error');
    
    const data = await res.json();
    
    return {
      props: {
        data,
      },
      revalidate: 60, // ISR設定
    };
  } catch (error) {
    return {
      notFound: true,
      revalidate: 10,
    };
  }
}

例3: 環境変数の設定

環境変数が原因でビルドエラーが発生する場合の対処法です。

// .env.local ファイルを作成
NEXT_PUBLIC_API_URL=https://api.example.com
DATABASE_URL=postgresql://user:password@localhost/dbname
// pages/api/example.ts
export default function handler(req, res) {
  const apiUrl = process.env.NEXT_PUBLIC_API_URL;
  const dbUrl = process.env.DATABASE_URL;
  
  if (!apiUrl) {
    return res.status(500).json({ error: 'Missing API URL' });
  }
  
  res.status(200).json({ success: true });
}

例4: next.config.jsの設定

next.config.jsでビルド設定を調整する例です。

/** @type {import('next').NextConfig} */
const nextConfig = {
  // TypeScriptエラーを無視する場合(非推奨)
  typescript: {
    ignoreBuildErrors: true,
  },
  
  // ESLintエラーを無視する場合(非推奨)
  eslint: {
    ignoreDuringBuilds: true,
  },
  
  // 画像最適化設定
  images: {
    domains: ['example.com'],
  },
  
  // リダイレクト設定
  async redirects() {
    return [
      {
        source: '/old-path',
        destination: '/new-path',
        permanent: true,
      },
    ];
  },
};

module.exports = nextConfig;

よくある間違いと対処法

間違い1: next.config.jsの構文エラー

next.config.jsに構文エラーがあるとビルルが失敗します。JavaScriptの基本的な構文を確認してください。

// ❌ 間違い:セミコロンやカンマの忘れ
const nextConfig = {
  typescript: {
    ignoreBuildErrors: true
  } // ← カンマがない
  eslint: {
    ignoreDuringBuilds: true,
  },
};

// ✅ 正しい書き方
const nextConfig = {
  typescript: {
    ignoreBuildErrors: true,
  },
  eslint: {
    ignoreDuringBuilds: true,
  },
};

module.exports = nextConfig;

間違い2: サーバーサイドコードの混在

クライアントサイドのコンポーネントにサーバーサイドの機能を書くとエラーになります。

// ❌ 間違い:クライアントコンポーネントでDBを直接使用
export default function Page() {
  const users = db.query('SELECT * FROM users'); // エラー
  
  return <div>{users.map(u => u.name)}</div>;
}

// ✅ 正しい書き方:getStaticPropsを使用
export async function getStaticProps() {
  const users = await db.query('SELECT * FROM users');
  
  return {
    props: { users },
    revalidate: 60,
  };
}

export default function Page({ users }) {
  return <div>{users.map(u => u.name)}</div>;
}

間違い3: 相対パスの誤り

ファイルのインポートパスが誤っていてもビルド時に検出されます。

// ❌ 間違い
import { Button } from '../../../components/Button';

// ✅ パスエイリアスを使用
// tsconfig.json に設定を追加
{
  \"compilerOptions\": {
    \"baseUrl\": \".\",
    \"paths\": {
      \"@components/*\": [\"components/*\"],
      \"@lib/*\": [\"lib/*\"]
    }
  }
}

// こう書く
import { Button } from '@components/Button';

間違い4: 未使用の変数やインポート

ESLintのルールによっては、未使用の変数でビルドが失敗します。

// ❌ 未使用の変数
const MyComponent = ({ name, unused }) => {
  return <div>{name}</div>;
};

// ✅ 不要な変数を削除
const MyComponent = ({ name }: { name: string }) => {
  return <div>{name}</div>;
};

トラブルシューティングチェックリスト

  • エラーメッセージの内容を全部読んだか
  • node_modulesを再インストールしたか
  • .nextキャッシュを削除したか
  • .env.localファイルで必要な環境変数を設定したか
  • TypeScriptの型エラーを修正したか
  • ESLintのルール違反を修正したか
  • next.config.jsの構文は正しいか
  • インポートパスは正しいか
  • Node.jsのバージョンはNext.jsと互換性があるか
  • package.jsonの依存パッケージのバージョンは正しいか

まとめ

Next.js buildエラーは、適切な手順で原因を特定すれば、ほとんどのケースで解決できます。重要なポイントをまとめます:

  • エラーメッセージを詳しく読む:問題の場所と原因が明確に記載されています
  • 段階的に調査する:TypeScript、ESLint、パッケージの順に確認します
  • キャッシュをクリアする:.nextディレクトリとnode_modulesを再インストールすることで多くが解決します
  • 環境変数を確認する:.env.localファイルが正しく設定されているか確認します
  • 型定義を正確に書く:TypeScriptの型安全性は、ビルド時のエラー防止に役立ちます
  • サーバーとクライアントコードを分離する:getStaticPropsやgetServerSidePropsを正しく使い分けます

開発初期段階から型安全性を意識し、ESLintルールに従うことで、ビルド時のエラーを減らせます。本記事で紹介した方法を参考に、Next.jsのビルドエラーに対応してください。

タイトルとURLをコピーしました