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

Astro ビルド失敗?5 分で切り分ける 7 つのよくある原因

ターミナルが真っ赤なエラーで埋まっている。ローカル開発は問題なく、npm run dev も快調で、コンポーネントの表示もルーティングも完璧。ところが astro build を実行すると——クラッシュする。

Astro のビルド失敗は、フロントエンド開発者にとって最も頭を抱える問題のひとつです。ローカル環境と本番ビルドの差が、原因を掴みにくくします。エラーメッセージは何十行にも及び、専門用語ばかりで、どこから手をつければいいかわからない——そんな経験、ありませんか。

この記事では、Astro での失敗談を踏まえ、次の内容をまとめました。5 分以内に問題を素早く特定する方法(闇雲に試行錯誤しない)、最も多い 7 つのビルド失敗シナリオと解決策、デプロイ先(Vercel / Cloudflare / GitHub Pages)ごとの特有の落とし穴、そして同じ轍を踏まないための予防的ベストプラクティス。ビルド失敗の 90% は、この 7 つのよくある原因に収まります。

クイックリファレンス:エラーメッセージ早見表

まずは早見表です。エラーに遭遇したら、すぐ照合できます。

エラーメッセージ想定される原因クイック対処
SyntaxError: Unexpected token 'with'Node.js バージョンが低すぎるNode 18.17.1+ または 20.3.0+ にアップグレード
Cannot find module / ERR_MODULE_NOT_FOUND依存のインストール問題node_modules を削除して再インストール
frontmatter does not match schemaContent Collections の検証失敗Markdown の frontmatter 形式を確認
document is not defined / window is not definedSSR 非対応のサードパーティパッケージclient:only または動的インポートを使用
The build was canceledインテグレーションの競合または依存の問題インテグレーションを 1 つずつコメントアウトして切り分け
ローカルは成功、本番は失敗環境変数または Node バージョンの差異デプロイ先の設定を確認
GitHub Pages で 404base パス未設定astro.config.mjs の base フィールドを設定

一、迅速な診断フレームワーク:5 分で問題を特定する

エラーメッセージを読む 3 つのポイント

エラーを見て慌てる人は多いですが、答えはすでにメッセージの中にあります。素早く読み解く 3 つのポイントを紹介します。

1. エラー種別の識別

最初の行やキーワードを確認します。

  • SyntaxError:コードの構文問題
  • ModuleNotFoundError または Cannot find module:依存が見つからない
  • ValidationError:データ検証の失敗(多くは Content Collections の frontmatter)
  • ENOENT:ファイルまたはディレクトリが存在しない
  • is not defineddocument / window):SSR 中にブラウザ API にアクセスしている

たとえば SyntaxError: Unexpected token 'with' が出たら、ほぼ確実に Node.js のバージョンが低すぎます。

2. エラー位置の特定

次のような情報を探します。

at /path/to/your/file.astro:23:5

どのファイルの何行目かがわかります。途中の node_modules のパスに惑わされず、自分のコードのパスを見つけるのが肝です。

エラーが自分のコードではなく、依存パッケージから出ることもあります。その場合はスタックの上の方に Error: xxx caused by のような手がかりがあることが多いです。

3. エラーコンテキストの理解

どの段階で出たかに注目します。

  • Building for production... → ビルド段階のエラー
  • Rendering... → ページレンダリング段階のエラー
  • vite v5.0.0 building for production... → Vite ビルド層のエラー

ビルド段階は設定や依存の問題、レンダリング段階はコードロジックの問題が多いです。

5 ステップの迅速な切り分け

エラーメッセージの読み方がわかったら、次の 5 ステップで進めましょう。多くの問題はここで特定できます。

Step 1: Node.js バージョンを確認

node -v

Astro には Node.js 18.17.1+ または 20.3.0+ が必要です。これより低い場合はアップグレードが先決です。デプロイ先のデフォルトが古い Node のまま、というケースを何度も見てきました。

ローカルで nvm を使っているなら、次のように切り替えられます。

nvm use 20

Step 2: 依存が正しくインストールされているか確認

npm list  # または pnpm list

UNMET DEPENDENCYmissing があれば、依存が揃っていません。

package.jsonpackage-lock.json の更新日時も比較しましょう。lock ファイルが古いと、依存が同期していない可能性があります。

Step 3: キャッシュを削除して再ビルド

単純ですが、非常に効く手です。不可解なエラーでは、まずキャッシュ削除が第一候補です。

# ビルド成果物と依存をすべて削除
rm -rf node_modules .astro dist
# 再インストール
npm install
# もう一度ビルド
npm run build

少なくとも 30% の問題はこれで解消します。キャッシュ汚染や依存バージョンの不一致は本当によくあります。

Step 4: 最近変更したファイルを確認

前回ビルドが成功してから、何を変えましたか?新しいコンポーネント、設定の変更、新しい依存の追加?

git で最近の変更を確認します。

git diff HEAD

問題は直近の 1〜2 コミットに集中していることが多いです。新しく入れたコードを一旦コメントアウトしてビルドできれば、原因の切り分けが一気に早くなります。

Step 5: ローカル環境と CI 環境の差分を比較

ローカルでは成功するのに CI/CD やデプロイ先で失敗する——それは環境差のサインです。重点的に確認する項目は次のとおりです。

  • Node バージョン:ローカルと本番で一致しているか?
  • パッケージマネージャー:npm / pnpm / yarn のどれを使っているか?バージョンは一致しているか?
  • 環境変数:本番に必要な変数はすべて設定されているか?
  • 依存バージョン:lock ファイルはコミットされているか?本番でインストールされるバージョンはローカルと同じか?

以前、ローカルは Node 20、Vercel はデフォルトの Node 18 という組み合わせで、Node 20 専用の API を使ったら本番だけ落ちたことがあります。Vercel のプロジェクト設定で Node バージョンを指定して解決しました。

二、最も多いビルド失敗の 7 つの原因

原因 1:Node.js バージョンの非互換

典型的なエラーメッセージ

SyntaxError: Unexpected token 'with'

または

error: Cannot use import statement outside a module

根本原因

Astro には Node.js 18.17.1 以上(または 20.3.0+)が必要です。ビルド失敗の根っこがバージョン不足であることが非常に多いです。

なぜ起きるか——主に次の 2 パターンです。

  1. ローカルでは Node を上げたが、デプロイ先は古いまま
  2. チーム開発で、メンバーごとに Node バージョンがバラバラ

解決策

ローカル環境

nvm で Node を管理しているなら、切り替えは簡単です。

nvm install 20
nvm use 20

デプロイ先の設定

プラットフォームごとに方法が異なります。

Vercel
プロジェクト設定 → General → Node.js Version で 20.x を選択

Cloudflare Pages
プロジェクトルートに .nvmrc を作成:

20

Netlify
ルートに netlify.toml を作成:

[build.environment]
  NODE_VERSION = "20"

予防策

package.json に必要な Node バージョンを明記します。

{
  "engines": {
    "node": ">=18.17.1"
  }
}

低いバージョンの Node では、npm install 時に警告が出ます。

原因 2:依存パッケージの競合またはバージョン固定の問題

典型的なエラーメッセージ

Error: Cannot find module 'astro'
ERR_MODULE_NOT_FOUND

または、もっと不可解な:

X [ERROR] The build was canceled

よくあるシナリオ

この種の問題には何度も遭遇しました。典型的には次のような状況です。

  1. パッケージマネージャーの互換性

Astro 4.11.2 以降、Bun と pnpm のサポートが調整され、一部プロジェクトで突然依存が入らなくなることがありました。4.11.1 から 4.11.2 に上げたとき、pnpm でエラーが出た経験があります(のちに Astro チームが修正)。

  1. lock ファイルと node_modules の不整合

package.json だけ変えて lock を更新し忘れた、または逆に、他人の lock を pull したのにローカルで依存を入れ直していない、といったパターンです。

  1. そもそも Astro 環境で問題になりやすいパッケージ

たとえば次のような報告があります。

  • astro-compress:ビルド失敗の報告が多い
  • @supercharge/stringsis not a function の報告あり
  • nodejs-mysqlmysql2 への置き換えを推奨(互換性がよい)

解決策

定番の 3 手順

# 1. 依存とキャッシュをすべて削除
rm -rf node_modules .astro dist package-lock.json
# pnpm の場合:
rm -rf node_modules .astro dist pnpm-lock.yaml

# 2. パッケージマネージャーのキャッシュをクリア
npm cache clean --force
# または pnpm store prune

# 3. 再インストール
npm install
# CI では lock と一致させる:
npm ci

それでもダメなら、設定ファイルを確認

pnpm ユーザーは .npmrc の調整が必要なことがあります。

shamefully-hoist=true
public-hoist-pattern[]=*astro*

最小再現での切り分け

特定の依存が原因か疑うときは、次の手順が有効です。

  1. まっさらな Astro プロジェクトを作成:
npm create astro@latest minimal-test -- --template minimal
  1. 問題の依存だけ追加し、再現するか確認

  2. 再現できれば GitHub Issues で同様の報告を検索

この方法で astro-compress が原因だとわかり、別の画像最適化方案に切り替えたことがあります。

原因 3:Content Collections の形式検証失敗

典型的なエラーメッセージ

Error: blog → post.md frontmatter does not match collection schema.
"date" must be a valid date

または:

MarkdownContentSchemaValidationError: Content entry frontmatter does not match schema
"title" is required

根本原因

Astro 2.0 から Content Collections が導入され、Markdown の frontmatter を Zod で検証します。型安全には強力ですが、frontmatter の形式が乱れているとビルド時にエラーになります。

最初の頃は、古い記事の frontmatter がバラバラで、2024-01-012024/01/01 が混在し、必須フィールドの欠落もありました。Content Collections を有効にした瞬間、一斉にエラーになった経験があります。

頻出するエラー種別

  1. 必須フィールドの欠落

スキーマで title が必須なのに、書き忘れ:

---
# title を書き忘れた
date: 2024-01-01
---
  1. フィールド型の誤り

日付形式が最も多いです。

---
title: "My Post"
date: 2024/01/01  # 正しくは 2024-01-01
---

配列を文字列で書いている例:

---
tags: javascript  # 正しくは [javascript] または ["javascript"]
---
  1. フィールド名のスペルミス

スキーマは description なのに desc と書くと、Astro は認識しません。

解決策

Step 1: スキーマ定義を確認

src/content/config.ts を開き、スキーマ定義を確認します。

import { z, defineCollection } from 'astro:content';

const blog = defineCollection({
  schema: z.object({
    title: z.string(),
    date: z.date(),
    tags: z.array(z.string()).optional(),
  }),
});

export const collections = { blog };

Step 2: エラーメッセージに沿って frontmatter を修正

どのファイルのどのフィールドかが示されます。たとえば:

blog → my-post.md frontmatter does not match collection schema.
"date" must be a valid date

なら src/content/blog/my-post.md の日付形式を直します。

---
title: "私の記事"
date: 2024-01-01  # YYYY-MM-DD 形式を確認
tags: ["astro", "blog"]
---

Step 3: 形式が乱れた旧記事には .passthrough() を使う

過去記事が大量にある場合、1 件ずつ直すのは大変です。.passthrough() で検証を緩められます。

const blog = defineCollection({
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),  // coerce で自動変換
    tags: z.array(z.string()).optional().default([]),
  }).passthrough(),  // スキーマ外のフィールドもエラーにしない
});

.passthrough() は、スキーマにないフィールドもエラーにせず通します。

Step 4: dev server を再起動

スキーマを変えたら、dev server の再起動が必要です。

# 一度停止 (Ctrl+C)
# 再起動
npm run dev

実行中なら s + Enter でコンテンツ層を同期できます。

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

典型的なシナリオ

ローカルの npm run devnpm run build は成功するのに、Vercel / Cloudflare にデプロイすると——

  • ページの表示が欠ける
  • 一部機能が動かない(コメント、API 呼び出しなど)
  • ビルドは成功するが実行時にエラー

よくある問題

  1. デプロイ先に環境変数が未設定

ローカルには .env があるが、.gitignore で除外されている(これは正しい。機密情報はコミットしない)。一方で、デプロイ先が変数の値を知らないため、ビルドまたは実行時に問題が出ます。

  1. PUBLIC_ プレフィックスの使い方

Astro の環境変数ルール:

  • クライアントから参照できる変数は PUBLIC_ で始める必要がある
  • サーバー専用の変数にはプレフィックス不要

クライアントコードで PUBLIC_ なしの変数を使うと、ビルド時に undefined になります。

例:

// .env
API_KEY=abc123
PUBLIC_SITE_URL=https://example.com

// クライアントコード
const apiKey = import.meta.env.API_KEY;  // ❌ undefined
const siteUrl = import.meta.env.PUBLIC_SITE_URL;  // ✅ 正常

解決策

デプロイ先ごとの設定方法

Vercel

  1. プロジェクト → Settings → Environment Variables
  2. 変数を追加し、適用環境を選択(Production / Preview / Development)
  3. 再デプロイ

Cloudflare Pages

  1. プロジェクト → Settings → Environment variables
  2. Production と Preview それぞれに設定
  3. 再ビルドをトリガー

Netlify

  1. Site settings → Environment variables
  2. 変数を追加
  3. 新しいデプロイをトリガー

環境変数の正しい使い方

// astro.config.mjs
export default defineConfig({
  // ここでは任意の環境変数が使える
  site: import.meta.env.PUBLIC_SITE_URL,
});

// src/pages/index.astro
---
// サーバー側コードでは任意の変数が使える
const apiKey = import.meta.env.API_KEY;
const response = await fetch(`https://api.example.com?key=${apiKey}`);
---

<script>
  // クライアント側では PUBLIC_ で始まる変数のみ
  const siteUrl = import.meta.env.PUBLIC_SITE_URL;
  console.log(siteUrl);  // 正常に表示

  const apiKey = import.meta.env.API_KEY;
  console.log(apiKey);  // undefined
</script>

セキュリティ上の注意

API キーや DB パスワードなどの機密情報を PUBLIC_ 変数に入れないでください。値はバンドル後の JS にインラインされ、誰でも見られます。

クライアントから API を呼ぶ必要があるなら、自前のバックエンド経由にし、API キーを直接露出しないのが安全です。

原因 5:設定ファイルの誤り

典型的なエラーメッセージ

明確なメッセージがなく、ビルドが止まる・無限ループ・不可解な Vite エラー、ということもあります。

頻出する問題点

  1. base パスの設定ミス(GitHub Pages デプロイ)

GitHub Pages の URL は https://username.github.io/repo-name/ 形式です。astro.config.mjsbase を設定しないと、リソースパスがすべて 404 になります。

誤った設定:

export default defineConfig({
  site: 'https://username.github.io/my-blog/',
  // base の設定を忘れた
});

正しい設定:

export default defineConfig({
  site: 'https://username.github.io',
  base: '/my-blog',  // リポジトリ名を base に
});
  1. インテグレーション(integrations)の競合

Svelte インテグレーションと content/config.ts が競合し The build was canceled になる、という報告があります。

複数の画像最適化プラグインを同時に使い、競合して 1 つ外したら直った、という経験もあります。

解決策

base パスを確認

サブパス(GitHub Pages など)にデプロイするなら、base を必ず設定します。

// astro.config.mjs
export default defineConfig({
  site: 'https://yourdomain.com',
  base: process.env.BASE_PATH || '/',  // ローカルは /、本番は実際のパス
});

CI では環境変数を設定します。

# .github/workflows/deploy.yml
env:
  BASE_PATH: /my-blog

インテグレーション競合の切り分け

特定のインテグレーションが原因か疑うときは、1 つずつコメントアウトして試します。

// astro.config.mjs
export default defineConfig({
  integrations: [
    // react(),
    // tailwind(),
    // sitemap(),
  ],
});

最小構成から始め、1 つずつ戻して、どれが原因か特定します。

原因 6:サードパーティパッケージが SSG / SSR と非互換

典型的なエラーメッセージ

ReferenceError: document is not defined
ReferenceError: window is not defined

根本原因

Astro はデフォルトでサーバー側(Node.js 環境)でページをビルドします。一方、一部の npm パッケージはブラウザ向けで、documentwindow などのブラウザ API に直接アクセスします。サーバー側ビルド時にこれらの API は存在しないため、エラーになります。

初めて遭遇したのはチャートライブラリでした。dev モードでは表示できたのに(ブラウザでレンダリングされるため)、build すると document is not defined で落ちました。

問題になりやすいパッケージ

  • DOM 操作に依存する UI コンポーネントライブラリ
  • ブラウザ検出ライブラリ(デバイス種別、ブラウザバージョンなど)
  • 古い jQuery プラグイン
  • モジュールトップレベルで window.xxx を実行するパッケージ

解決策

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

Astro に、このコンポーネントはクライアントのみでレンダリングし、サーバーでは実行しないと伝えます。

---
import ProblematicComponent from './ProblematicComponent';
---

<ProblematicComponent client:only="react" />

client:only の後にはフレームワーク名(react / vue / svelte など)を指定します。

方案 2: 動的インポート

クライアント側でパッケージを読み込みます。

---
// サーバー側ではインポートしない
---

<script>
  // クライアントで動的インポート
  const { default: MyLibrary } = await import('problematic-package');
  const instance = new MyLibrary();
</script>

方案 3: 条件付きインポート

環境を確認してから使います。

let myLib;
if (typeof window !== 'undefined') {
  myLib = await import('problematic-package');
}

方案 4: 互換性のあるパッケージに置き換える

最も単純な解決策は、パッケージを替えることです。たとえば:

  • nodejs-mysqlmysql2
  • 古いチャートライブラリ → SSR に強い chart.js
  • jQuery プラグイン → ネイティブ JS またはモダンなフレームワークコンポーネント

おすすめ

サードパーティパッケージを選ぶ前に、ドキュメントで SSR / SSG 対応の記載を確認しましょう。「works with Next.js」「SSR compatible」とあれば、多くの場合 Astro でも使えます。

原因 7:Astro バージョンアップによる Breaking Changes

典型的なシナリオ

Astro 5(または他のメジャーバージョン)に上げたあと、以前はビルドできたプロジェクトが突然——

  • ビルドが終わらない
  • 不可解なモジュール解決エラー
  • 一部 API が使えなくなる

よくある問題

  1. CommonJS モジュール解決の変更

Astro 5 ではモジュール解決ロジックが変わり、以前動いていた CommonJS パッケージが動かなくなることがあります。

  1. API の廃止・変更

メジャーバージョンごとに旧 API が廃止されます。Astro.xxx のメソッド名変更や削除などです。

  1. インテグレーションのバージョン不整合

Astro を上げたら、公式・サードパーティのインテグレーションも対応版へ上げる必要があります。

解決戦略

段階的にアップグレードし、バージョンを飛ばさない

Astro 3 から 5 へ一気に上げない。まず 4 に上げてテストし、問題なければ 5 へ。切り分けが楽になります。

# 非推奨
npm install astro@latest

# 推奨
npm install astro@^4.0.0
# テスト通過後
npm install astro@^5.0.0

Astro CLI のアップグレードツールを使う

よくある Breaking Changes を自動処理してくれるツールがあります。

npx @astrojs/upgrade

このツールは次を行います。

  • プロジェクトを分析
  • アップグレードが必要な依存を提示
  • 一部コードを自動修正(廃止 API の呼び出しなど)

関連インテグレーションもアップグレード

Astro を上げたら、公式インテグレーションも忘れずに。

npm install @astrojs/react@latest @astrojs/tailwind@latest @astrojs/sitemap@latest

Astro 5 なのに Astro 4 時代のインテグレーションのまま、という組み合わせでビルドが落ちることがあります。

三、デプロイ先ごとの特有の問題

汎用の 7 大原因のあと、デプロイ先ごとの落とし穴を整理します。プラットフォームごとの特性を知っておくと、遠回りを減らせます。

Vercel デプロイの問題

典型問題 1: ビルドタイムアウト

Vercel 無料プランにはビルド時間の上限があります。プロジェクトが大きい、依存のインストールが遅いと、タイムアウトで失敗することがあります。

対処:

  • package.json を見直し、不要な依存を削除
  • npm の代わりに pnpm を使い、インストールを高速化
  • 予算があれば Pro プランへ(任意)

典型問題 2: 出力ディレクトリの設定ミス

Vercel はビルド成果物の場所を知る必要があります。Astro のデフォルトは dist ですが、設定を変えていると見つけられません。

正しい設定:

  • Build Command: npm run build または astro build
  • Output Directory: dist(Astro デフォルト)
  • Install Command: npm install

pnpm の場合:

  • Install Command: pnpm install

Cloudflare Pages デプロイの問題

典型問題 1: Node.js バージョンが低い

Cloudflare Pages のデフォルト Node が古いことがあります。ルートに .nvmrc でバージョンを指定しましょう。

20

またはプロジェクト設定で:

Settings → Environment variables → NODE_VERSION = 20

典型問題 2: astro-compress が原因で失敗

astro-compress が Cloudflare 上でビルド失敗を起こす、特に画像最適化後、という報告が多いです。

遭遇したら:

  1. アンインストール: npm uninstall astro-compress
  2. astro.config.mjs から削除
  3. Astro 組み込みの <Image /> など別手段で画像最適化

典型問題 3: ビルドコマンドの設定

Cloudflare Pages の設定例:

  • Build command: npm run build
  • Build output directory: /dist
  • Root directory: /(monorepo の場合は調整)

Build output directory の先頭に / が必要な点に注意です。

GitHub Pages デプロイの問題

典型問題 1: 404 または真っ白なページ

最も多いのは base パスの設定ミスです。

GitHub Pages の URL は https://username.github.io/repo-name/ で、/repo-name/ が base パスです。

astro.config.mjs で必ず設定します。

export default defineConfig({
  site: 'https://username.github.io',
  base: '/your-repo-name',  // リポジトリ名
});

典型問題 2: スタイル欠落やリソース 404

ページは開くがスタイルがない、画像が読めない——これも base パスの問題です。

ブラウザの開発者ツールでリソースのリクエスト URL を確認します。https://username.github.io/style.css になっているのに、正しくは https://username.github.io/repo-name/style.css なら、base が未設定です。

四、予防的なベストプラクティス

問題の解き方がわかったら、次は同じ轍を踏まない仕組みです。

ローカル切り分けワークフローを整える

最小再現(minimal reproduction)

問題が出たら、いきなり本番プロジェクトをいじらない。まず最小構成で再現します。

npm create astro@latest test-project -- --template minimal
cd test-project
# 問題のコードや依存だけ追加

最小プロジェクトで再現できれば、特定の機能や依存が原因で、プロジェクト全体の問題ではないとわかります。切り分けが格段に速くなります。

ブラウザコンソールとビルドログを活用

開発中はブラウザコンソールを開いておきましょう。

  • Console タブ:JavaScript エラー
  • Network タブ:リソース読み込み
  • Sources タブ:コードのデバッグ

ビルド時はログを保存します。

npm run build > build.log 2>&1

ターミナルが流れても、あとから全文を確認できます。

個人用のエラー解決メモを作る

自分用の markdown に、遭遇したエラーと解決策を記録しています。形式はシンプルです。

## エラー: SyntaxError: Unexpected token 'with'

**シナリオ**: Vercel デプロイ失敗
**原因**: Node バージョンが低すぎる
**解決**: Vercel で Node 20.x を指定
**日付**: 2024-11-15

次に似たエラーが出たら、メモを見れば 5 分で済むこともあります。

プロジェクトの健全性を維持する

依存を定期的に更新

月次または四半期ごとに確認します。

# 古い依存を確認
npm outdated

# すべて最新へ(慎重に)
npm update

# または 1 つずつ
npm install astro@latest

メジャーバージョンは盲目的に上げず、CHANGELOG で Breaking Changes を確認してから。

Dependabot で依存更新を自動化

GitHub リポジトリのルートに .github/dependabot.yml を置きます。

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    open-pull-requests-limit: 5

Dependabot が更新 PR を作ってくれるので、レビューしてマージするだけで済みます。

ビルドテスト用スクリプトを追加

package.json にテスト用スクリプトを足します。

{
  "scripts": {
    "build": "astro build",
    "test:build": "npm run build && echo 'Build successful!'"
  }
}

pre-commit hook を設定

husky でコミット前に自動ビルドし、コンパイルを通すコードだけをコミットします。

npm install --save-dev husky

# husky を初期化
npx husky init

# pre-commit hook を追加
echo "npm run build" > .husky/pre-commit

コミットのたびにビルドするので少し遅くなりますが、壊れたコードのコミットを防げます。

役立つデバッグツールとリソース

Astro 公式リソース

  1. 公式トラブルシューティングガイド:まずここ
  2. エラーリファレンス:Astro エラーの詳細一覧
  3. Discord コミュニティ:難しい問題はここで質問

便利なコマンド

# Astro 設定が正しいか確認
npx astro check

# 詳細なビルド情報
npx astro build --verbose

# デバッグモードで dev 実行
DEBUG=astro:* npm run dev

コミュニティリソース

  • Astro GitHub Issues:既知の問題を検索
  • Stack Overflow:[astro] タグで検索
  • 日本語・中国語の技術フォーラムやブログ:多くの失敗談が共有されている

結論

ここまでの内容を、短く振り返ります。

Astro のビルド失敗の 90% は、次の原因に収まります。

  1. Node.js バージョンの非互換:≥18.17.1 または 20.3.0+ か確認
  2. 依存パッケージの問題:キャッシュ削除・再インストール、lock ファイルの確認
  3. Content Collections の検証失敗:frontmatter 形式の修正
  4. 環境変数の設定ミス:デプロイ先で正しく設定、PUBLIC_ プレフィックスに注意
  5. 設定ファイルの誤り:base パスの確認、インテグレーション競合の切り分け
  6. SSR 非対応のサードパーティパッケージclient:only または動的インポート
  7. バージョンアップの Breaking Changes:移行ガイドを確認し、段階的にアップグレード

5 ステップの迅速な切り分けも忘れずに。

  1. Node バージョンを確認
  2. 依存のインストールを確認
  3. キャッシュを削除して再ビルド
  4. 最近の変更を確認
  5. ローカルと本番の環境差分を比較

最も大切なのは、体系的な切り分けの考え方です。いきなり慌てず、エラーメッセージを読み、種別と位置を特定してから、原因に応じて対処しましょう。

Astro を始めた頃は、ビルドエラーで何時間もかかることもありました。この方法論を身につけてからは、だいたい 5〜10 分で特定・解決できるようになりました。この記事が、あなたの遠回りを減らす助けになれば幸いです。

最後に一点:バージョンの進化は速いです。この記事を書いたのは 2024 年末で、当時の Astro 安定版は 4.x でした。読んでいる時点で 6.0 や 7.0 になっているかもしれません。その場合は公式ドキュメントの最新説明も照合してください。API やエラーメッセージは変わることがありますが、切り分けの考え方は通用します。

新しい問題に遭遇したら、ぜひコメントで共有してください。この切り分けガイドを一緒に充実させましょう。ブックマークしておけば、次にビルドが失敗したときにすぐ照合でき、時間も手間も省けます。

Astro ビルド失敗を 5 分で切り分ける完全フロー

体系的な 5 ステップ切り分け法と、よくある 7 つのビルドエラーシナリオの具体的な解決策。問題の 90% は 5〜10 分で解決できます

⏱️ 目安時間: 10 分

  1. 1

    ステップ1: 5 ステップ迅速切り分け:エラーメッセージを読む

    エラーメッセージを読む 3 つのポイント:

    1. エラー種別の識別
    • 最初の行やキーワードを確認
    • SyntaxError:コードの構文問題
    • TypeError:型エラー
    • ReferenceError:参照エラー
    • ModuleNotFoundError:モジュールが見つからない

    2. エラー位置の特定
    • 具体的なファイルと行番号を探す
    • 多くは Error at xxx:xx 形式

    3. エラーコンテキストの分析
    • エラー前後のコードを確認
    • なぜ起きたかを理解

    5 ステップの切り分けフロー:
    1. Node.js バージョンを確認
    • Node 18.17.1+ または 20.3.0+ を使用
    • node -v で確認

    2. 依存を削除して再インストール
    • node_modules と package-lock.json を削除
    • npm install を再実行

    3. Content Collections 設定を確認
    • Markdown の frontmatter 形式が正しいか確認

    4. サードパーティパッケージの互換性を確認
    • client:only または動的インポートを使用

    5. デプロイ先の設定を確認
    • 環境変数、Node バージョン、ビルドコマンド
  2. 2

    ステップ2: よくあるビルドエラー 7 シナリオと解決策

    エラー 1:SyntaxError: Unexpected token 'with'
    • 原因:Node.js バージョンが低すぎる
    • 解決:Node 18.17.1+ または 20.3.0+ にアップグレードし、nvm で Node を管理

    エラー 2:Cannot find module / ERR_MODULE_NOT_FOUND
    • 原因:依存関係のインストール問題
    • 解決:
    - node_modules と package-lock.json を削除
    - npm install を再実行
    - package.json の依存が正しいか確認

    エラー 3:frontmatter does not match schema
    • 原因:Content Collections の検証失敗
    • 解決:Markdown の frontmatter 形式を確認し、必須フィールドが正しい形式であることを確認

    エラー 4:document is not defined / window is not defined
    • 原因:SSR 非対応のサードパーティパッケージ
    • 解決:client:only または動的インポートを使用し、コンポーネントに client:load などのディレクティブを追加

    エラー 5:The build was canceled
    • 原因:インテグレーションの競合または依存の問題
    • 解決:インテグレーションを 1 つずつコメントアウトして切り分け、依存の競合を確認

    エラー 6:ローカルは成功、本番は失敗
    • 原因:環境変数または Node バージョンの差異
    • 解決:デプロイ先の設定を確認し、環境変数と Node バージョンを揃える

    エラー 7:GitHub Pages で 404
    • 原因:base パス未設定
    • 解決:astro.config.mjs の base フィールドを設定し、パスが正しいか確認
  3. 3

    ステップ3: デプロイ先ごとの特有の落とし穴

    Vercel デプロイ:
    • Node バージョン設定を確認(package.json の engines、または Vercel プロジェクト設定)
    • 環境変数を確認(必要な変数がすべて設定されているか)
    • ビルドコマンドを確認(通常は npm run build)

    Cloudflare Pages デプロイ:
    • ビルドコマンドを確認
    • 出力ディレクトリを確認(通常は dist)
    • Node バージョンを確認(Cloudflare Pages はデフォルトで Node 18。他バージョンは設定が必要)

    GitHub Pages デプロイ:
    • base パスを確認(astro.config.mjs の base、形式は /repo-name/)
    • 静的出力モード(output: 'static')を使用
    • ビルドコマンドと出力ディレクトリを確認
  4. 4

    ステップ4: 予防的なベストプラクティス

    nvm で Node バージョンを管理
    • チーム全員が同じ Node バージョンを使う
    • バージョン不一致によるビルド問題を防ぐ

    依存を定期的に更新
    • npm outdated で古い依存を確認
    • 安定版へ定期的に更新

    TypeScript の型チェックを使う
    • ビルド前に型チェックを実行
    • 型エラーを早期に発見

    CI/CD でビルドを自動テスト
    • GitHub Actions などで自動ビルドテストを設定
    • コミットのたびにビルドチェックを実行

    Git hooks でコミット前にビルドチェック
    • pre-commit hook を設定
    • コミット前に自動でビルドチェック
    • 問題のあるコードのコミットを防ぐ

FAQ

Astro ビルド失敗で最も多い 7 つの原因は何ですか?
よくあるビルドエラー 7 つ:

1) SyntaxError: Unexpected token 'with':
• Node.js バージョンが低すぎる。Node 18.17.1+ または 20.3.0+ にアップグレード

2) Cannot find module / ERR_MODULE_NOT_FOUND:
• 依存のインストール問題。node_modules を削除して再インストール

3) frontmatter does not match schema:
• Content Collections の検証失敗。Markdown の frontmatter 形式を確認

4) document is not defined / window is not defined:
• SSR 非対応のサードパーティパッケージ。client:only または動的インポートを使用

5) The build was canceled:
• インテグレーションの競合または依存の問題。インテグレーションを 1 つずつコメントアウトして切り分け

6) ローカルは成功、本番は失敗:
• 環境変数または Node バージョンの差異。デプロイ先の設定を確認

7) GitHub Pages で 404:
• base パス未設定。astro.config.mjs の base フィールドを設定

問題の 90% は 5〜10 分で解決できます。体系的な 5 ステップ切り分け法とエラーメッセージ早見表を使えば、多くのビルド失敗を素早く特定・解決できます。
Astro ビルド失敗を素早く切り分けるには?5 ステップ切り分け法とは?
5 ステップの迅速な切り分け:

1) エラーメッセージを読む 3 つのポイント:
• エラー種別の識別
• エラー位置の特定
• エラーコンテキストの分析

2) Node.js バージョンを確認:
• Node 18.17.1+ または 20.3.0+ を使用
• node -v で確認

3) 依存を削除して再インストール:
• node_modules と package-lock.json を削除
• npm install を再実行

4) Content Collections 設定を確認:
• Markdown の frontmatter 形式が正しいか確認

5) サードパーティパッケージの互換性を確認:
• client:only または動的インポートを使用

最も大切なのは、体系的な切り分けの考え方を身につけること。いきなり慌てず、まずエラーメッセージを読み、種別と位置を特定してから、原因に応じて対処しましょう。Astro を始めた頃は、ビルドエラーで何時間もかかることもありましたが、この方法論を使うようになってからは、だいたい 5〜10 分で特定・解決できるようになりました。
デプロイ先(Vercel / Cloudflare / GitHub Pages)ごとの特有の落とし穴は?
Vercel デプロイ:
• Node バージョン設定を確認(package.json の engines、または Vercel プロジェクト設定)
• 環境変数を確認(必要な変数がすべて設定されているか)
• ビルドコマンドを確認(通常は npm run build)

Cloudflare Pages デプロイ:
• ビルドコマンドを確認
• 出力ディレクトリを確認(通常は dist)
• Node バージョンを確認(Cloudflare Pages はデフォルトで Node 18。他バージョンは設定が必要)

GitHub Pages デプロイ:
• base パスを確認(astro.config.mjs の base、形式は /repo-name/)
• 静的出力モード(output: 'static')を使用
• ビルドコマンドと出力ディレクトリを確認
Astro ビルド失敗を予防するベストプラクティスは?
予防的なベストプラクティス:
• nvm で Node バージョンを管理(チーム全員が同じバージョンを使い、不一致によるビルド問題を防ぐ)
• 依存を定期的に更新(npm outdated で古い依存を確認し、安定版へ更新)
• TypeScript の型チェックを使う(ビルド前に型チェックし、型エラーを早期発見)
• CI/CD でビルドを自動テスト(GitHub Actions などでコミットのたびにビルドチェック)
• Git hooks でコミット前にビルドチェック(pre-commit hook を設定し、問題のあるコードのコミットを防ぐ)
Astro ビルド失敗で困ったら、どこで助けを求めればいいですか?
公式リソース:
• Astro 公式ドキュメント(最新版のドキュメントと API 説明)
• Astro GitHub Issues(既知の問題を検索し、同様の事例がないか確認)
• Astro Discord コミュニティ(リアルタイムで質問でき、返信も早い)

デバッグツール:
• npx astro build --verbose で詳細なビルド情報を確認
• DEBUG=astro:* npm run dev でデバッグモード実行

コミュニティリソース:
• Stack Overflow で [astro] タグを検索
• 日本語・中国語の技術フォーラムやブログ(多くの人が失敗談を共有)

新しい問題に遭遇したら、ぜひコメントで共有してください。この切り分けガイドを一緒に充実させましょう。ブックマークしておけば、次にビルドが失敗したときにすぐ照合でき、時間も手間も省けます。

8分で読めます · 公開日: 2025年12月3日 · 更新日: 2026年6月8日

関連記事

コメント

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