言語を切り替える
テーマを切り替える

Astroビルド失敗?5分で解決する7つの原因とトラブルシューティング

深夜2時、ターミナルが真っ赤なエラーログで埋め尽くされている…。
ローカルの npm run dev では完璧に動いていたのに、いざ astro build を走らせると爆発する。

Astro開発者なら一度は経験する悪夢です。ローカル環境と本番ビルドの差異、謎の依存関係エラー、意味不明なスタックトレース。
「どこが悪いのか検討もつかない」と途方に暮れた経験はありませんか?

私もAstroを使い始めた頃、同じ苦しみを味わいました。しかし、数多くのプロジェクトでトラブルシューティングを繰り返すうちに、気がつきました。ビルドエラーの90%は、決まった7つのパターンのどれかだということに。

この記事では、私の2年間の「踏み抜き」経験をもとに、以下の内容を共有します:

  • 5分で原因を特定する診断フレームワーク
  • 頻出する7つのビルド失敗パターンと解決策
  • Vercel / Cloudflare / GitHub Pages 特有の落とし穴
  • 再発を防ぐベストプラクティス

もう盲目的にググる必要はありません。まずは深呼吸して、以下の手順を試してみてください。

クイックリファレンス:エラーメッセージ別対処法

エラーメッセージ / 現象考えられる原因解決策
SyntaxError: Unexpected token 'with'Node.jsバージョンが古いv18.17.1+ または v20.3.0+ にアップグレード
Cannot find module / ERR_MODULE_NOT_FOUND依存関係の欠損・破損node_modules 削除して再インストール
frontmatter does not match schemaMarkdownデータの型不一致Content Collectionsのスキーマか記事修正
document is not defined / window is not definedSSR非互換コードの実行client:only ディレクティブの使用
The build was canceledインテグレーション競合怪しいインテグレーションを一時無効化
ローカルOK、デプロイ先で失敗環境変数の不一致デプロイ先の環境変数設定を確認
GitHub PagesでCSS/画像が404baseパス設定漏れastro.config.mjsbase を設定

1. 5分で原因特定:5ステップ診断法

エラーが出たら、闇雲にいじらず、まずはこの手順を踏んでください。

Step 1: ログの解読(3つのポイント)

エラーログは「暗号」ではなく「ヒント」です。

  1. エラータイプを見る: SyntaxError(構文ミス)、ReferenceError(未定義の変数)、ValidationError(データ不正)など。
  2. ファイルパスを探す: at src/components/Header.astro:15:3 のような行を探します。node_modules 内のパスは無視して、自分のコードのパスを見つけましょう。
  3. フェーズを確認: Building...(ビルド設定)、Rendering...(ページ生成)のどちらで落ちているか。

Step 2: Node.jsバージョンの確認

node -v

Astro v4以降は、Node.js v18.17.1以上、または v20.3.0以上 が必須です(v19は非推奨)。
デプロイ環境(Vercelなど)の設定が古くなっていることが非常によくあります。

Step 3: 核兵器級リセット(クリーンインストール)

依存関係の整合性が崩れているケースが多発します。迷ったらこれをやってください。

# キャッシュファイルと依存関係を全削除
rm -rf node_modules .astro dist package-lock.json
# 再インストール
npm install
# ビルド試行
npm run build

3割くらいの問題はこれで直ります。

Step 4: 直近の変更を確認

git diff で、最後にビルドが成功してから何を変更したか見直します。
新しいライブラリを追加しましたか? astro.config.mjs を触りましたか?

Step 5: 環境差異の確認(CIで落ちる場合)

ローカルとCIの環境差異を疑います。

  • パッケージマネージャーは同じですか?(npm vs pnpm vs yarn)
  • 環境変数は設定されていますか?

2. 頻出する7つのビルド失敗原因

原因1:Node.jsバージョンの不一致

症状: SyntaxError: Unexpected token 'with', Unexpected token ? など、新しい構文が通らない。
解説: あなたのローカルNode.jsは最新でも、デプロイ先のサーバーが古い(v16やv14)ままになっているケースです。
対策:

  • ローカル: nvm use 20
  • Vercel: Settings → General → Node.js Version で「20.x」を選択。
  • Cloudflare: 環境変数 NODE_VERSION20 に設定するか、ルートに .nvmrc ファイル(中身は 20)を置く。

原因2:依存パッケージの競合・破損

症状: Cannot find module 'astro', ERR_MODULE_NOT_FOUND
解説: パッケージマネージャーのキャッシュが壊れていたり、lockファイルと package.json が矛盾していたりします。特にAstroのバージョンアップ直後に起きやすいです。
対策: 前述の「核兵器級リセット」を実行してください。npm ci を使うとlockファイルに忠実にインストールされるので、CI環境では推奨されます。

原因3:Content Collections スキーマ違反

症状: Error: blog -> post.md frontmatter does not match collection schema
解説: AstroのContent Collectionsは強力な型チェック機能ですが、融通が利きません。MarkdownのFrontmatter(冒頭のメタデータ)が、config.ts で定義したスキーマと1つでも食い違うとビルドが止まります。
よくあるミス:

  • 必須の description が抜けている。
  • date のフォーマットが不正(2023/12/01 ではなく 2023-12-01 が必要など)。
  • 定義していないフィールドを書いている。

対策: エラーメッセージで指定されたファイルを開き、修正します。古い記事が大量にあって直せない場合は、スキーマで .passthrough() を使うか、全てのフィールドを .optional() にする逃げ手もあります。

// src/content/config.ts
const blog = defineCollection({
  schema: z.object({
    // ...
  }).passthrough(), // 未定義のフィールドを許可する
});

原因4:環境変数の設定ミス

症状: ページの一部が表示されない、APIコールが失敗する、HOME などの変数が undefined
解説:

  1. デプロイ先に環境変数を設定し忘れている。
  2. クライアント側(ブラウザ)で使う変数に PUBLIC_ 接頭辞をつけていない。
    • Astroでは、PUBLIC_ で始まらない変数はセキュリティのためサーバサイド(ビルド時)でしか読めません。

対策:

  • デプロイ先の管理画面で環境変数を追加する。
  • ブラウザのJSで使う変数は PUBLIC_API_KEY のようにリネームする。

原因5:コンフィグ設定ミス(Baseパスなど)

症状: 404エラー、CSSや画像が読み込まれない。
解説: 特にGitHub Pagesのようなサブディレクトリ(例: user.github.io/my-repo/)にデプロイする場合、base 設定が必須です。
対策:

// astro.config.mjs
export default defineConfig({
  site: 'https://username.github.io',
  base: '/my-repo', // これを忘れるとパスが壊れる
});

原因6:SSR非互換ライブラリの使用

症状: ReferenceError: document is not defined, window is not defined
解説: Astroのビルド(SSG)はNode.js環境で行われます。そこには windowdocument は存在しません。ブラウザ専用のライブラリ(jQueryプラグインや特定のUIライブラリ)を .astro ファイルのフロントマターやコンポーネントのトップレベルでインポートして実行しようとすると死にます。

対策:

  1. client:only ディレクティブを使う:

    <ChartComponent client:only="react" />

    こうすると、ビルド時にはレンダリングされず、ブラウザでのみ実行されます。

  2. 条件付きインポート:

    if (typeof window !== 'undefined') {
      // ここでブラウザ専用コードを実行
    }

原因7:Astroバージョンアップによる破壊的変更

症状: アップデート後に謎のエラー多発。
解説: Astroは進化が早いです。v2→v3→v4→v5とメジャーアップデートのたびに、古いAPIが廃止されたり、設定方法が変わったりしています。
対策:

  • npx @astrojs/upgrade コマンドを使う(自動的に依存関係や設定を修正してくれます)。
  • 公式ブログの「Upgrade Guide」を必ず読む。

3. プラットフォーム別トラブルシューティング

Vercel

  • ビルドタイムアウト: 無料プランの制限を超えることがあります。不要なファイルを減らすか、依存関係を見直しましょう。
  • Output Directory: Astroのデフォルトは dist です。Vercelの設定もこれに合わせる必要があります。

Cloudflare Pages

  • Nodeバージョン: デフォルトが古い場合があります。環境変数 NODE_VERSION を必ず設定しましょう。
  • astro-compress: Cloudflare環境で画像圧縮ライブラリがエラーを吐くことがあります。問題が出る場合は無効化してください。

GitHub Pages

  • Jekyll処理: GitHub PagesはデフォルトでJekyll処理を走らせるため、_ で始まるフォルダ(_astroなど)が無視されます。
  • 対策: public フォルダに .nojekyll という空ファイルを作成しておくと、この挙動を無効化できます。

4. 予防策:平和な開発のために

トラブルを未然に防ぐための習慣です。

  1. npm run build をこまめに実行: 開発中はずっと dev モードになりがちですが、コミット前には一度ビルドコマンドを走らせて確認しましょう。
  2. Dependabot導入: 依存関係を自動更新しつつ、CIでテストを回すことで、「いつの間にか動かなくなった」を防げます。
  3. エラーログを保存: 自分が出会ったエラーと解決法をメモしておくと、次回の自分が助かります。

結論

ビルド失敗は成長痛のようなものです。
エラーログを見て絶望する前に、まずは深呼吸。そして**「Nodeバージョン」「依存関係」「スキーマ」「SSR互換性」**の4大容疑者を尋問してください。およそこれで解決します。

Astroは素晴らしいツールです。ビルドさえ通れば、最高のパフォーマンスと開発体験を提供してくれます。この記事が、あなたの赤いターミナルを緑色に変える助けになれば幸いです。

Astroビルドエラー解決ガイド

Astroプロジェクトのビルド失敗を5分で診断・解決するためのステップバイステップガイド

⏱️ Estimated time: 10 min

  1. 1

    Step1: エラーログの解読

    エラータイプ(SyntaxError/ReferenceError等)と発生ファイルパスを確認する。
  2. 2

    Step2: 環境チェック

    `node -v`を実行し、v18.17.1以上またはv20.3.0以上であることを確認する。CI上の設定もチェック。
  3. 3

    Step3: クリーンインストール

    `node_modules`, `.astro`, `dist`, `package-lock.json` を削除し、`npm install` を実行。
  4. 4

    Step4: Content Collections検証

    MarkdownのFrontmatterが `src/content/config.ts` のスキーマ定義と一致しているか確認。
  5. 5

    Step5: SSR互換性対応

    `window` や `document` を使用するコンポーネントに `client:only` ディレクティブを追加。

FAQ

一番多いビルド失敗の原因は何ですか?
Node.jsのバージョン不一致です。Astro v4/v5は比較的新しいNodeバージョンを要求しますが、デプロイサーバーのデフォルトが古いままになっていることが多々あります。
クライアント専用ライブラリ(windowを使うもの)がビルドで落ちます。
Astroはビルド時にサーバサイド(Node.js)で実行されるため、windowオブジェクトがありません。`<Component client:only />` を使ってサーバレンダリングをスキップするか、`if (typeof window !== 'undefined')` でガードしてください。
GitHub PagesにデプロイするとCSSが読み込まれません。
サブディレクトリ(リポジトリ名)にデプロイされている場合、`base` パス設定が抜けている可能性が高いです。`astro.config.mjs` に `base: '/リポジトリ名'` を追加してください。
ローカルでは動くのにVercelで動きません。
環境変数の設定漏れか、Node.jsバージョンの不一致が多いです。また、ファイル名の大文字小文字の違い(Windows/Macでは無視されるがLinuxでは区別される)も原因になりえます。

4 min read · 公開日: 2025年12月3日 · 更新日: 2026年1月22日

コメント

GitHubアカウントでログインしてコメントできます

関連記事