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 schema | Content Collections の検証失敗 | Markdown の frontmatter 形式を確認 |
document is not defined / window is not defined | SSR 非対応のサードパーティパッケージ | client:only または動的インポートを使用 |
The build was canceled | インテグレーションの競合または依存の問題 | インテグレーションを 1 つずつコメントアウトして切り分け |
| ローカルは成功、本番は失敗 | 環境変数または Node バージョンの差異 | デプロイ先の設定を確認 |
| GitHub Pages で 404 | base パス未設定 | astro.config.mjs の base フィールドを設定 |
一、迅速な診断フレームワーク:5 分で問題を特定する
エラーメッセージを読む 3 つのポイント
エラーを見て慌てる人は多いですが、答えはすでにメッセージの中にあります。素早く読み解く 3 つのポイントを紹介します。
1. エラー種別の識別
最初の行やキーワードを確認します。
SyntaxError:コードの構文問題ModuleNotFoundErrorまたはCannot find module:依存が見つからないValidationError:データ検証の失敗(多くは Content Collections の frontmatter)ENOENT:ファイルまたはディレクトリが存在しないis not defined(document/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 DEPENDENCY や missing があれば、依存が揃っていません。
package.json と package-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 パターンです。
- ローカルでは Node を上げたが、デプロイ先は古いまま
- チーム開発で、メンバーごとに 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
よくあるシナリオ:
この種の問題には何度も遭遇しました。典型的には次のような状況です。
- パッケージマネージャーの互換性
Astro 4.11.2 以降、Bun と pnpm のサポートが調整され、一部プロジェクトで突然依存が入らなくなることがありました。4.11.1 から 4.11.2 に上げたとき、pnpm でエラーが出た経験があります(のちに Astro チームが修正)。
- lock ファイルと node_modules の不整合
package.json だけ変えて lock を更新し忘れた、または逆に、他人の lock を pull したのにローカルで依存を入れ直していない、といったパターンです。
- そもそも Astro 環境で問題になりやすいパッケージ
たとえば次のような報告があります。
astro-compress:ビルド失敗の報告が多い@supercharge/strings:is not a functionの報告ありnodejs-mysql:mysql2への置き換えを推奨(互換性がよい)
解決策:
定番の 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*
最小再現での切り分け:
特定の依存が原因か疑うときは、次の手順が有効です。
- まっさらな Astro プロジェクトを作成:
npm create astro@latest minimal-test -- --template minimal
-
問題の依存だけ追加し、再現するか確認
-
再現できれば 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-01 と 2024/01/01 が混在し、必須フィールドの欠落もありました。Content Collections を有効にした瞬間、一斉にエラーになった経験があります。
頻出するエラー種別:
- 必須フィールドの欠落
スキーマで title が必須なのに、書き忘れ:
---
# title を書き忘れた
date: 2024-01-01
---
- フィールド型の誤り
日付形式が最も多いです。
---
title: "My Post"
date: 2024/01/01 # 正しくは 2024-01-01
---
配列を文字列で書いている例:
---
tags: javascript # 正しくは [javascript] または ["javascript"]
---
- フィールド名のスペルミス
スキーマは 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 dev と npm run build は成功するのに、Vercel / Cloudflare にデプロイすると——
- ページの表示が欠ける
- 一部機能が動かない(コメント、API 呼び出しなど)
- ビルドは成功するが実行時にエラー
よくある問題:
- デプロイ先に環境変数が未設定
ローカルには .env があるが、.gitignore で除外されている(これは正しい。機密情報はコミットしない)。一方で、デプロイ先が変数の値を知らないため、ビルドまたは実行時に問題が出ます。
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:
- プロジェクト → Settings → Environment Variables
- 変数を追加し、適用環境を選択(Production / Preview / Development)
- 再デプロイ
Cloudflare Pages:
- プロジェクト → Settings → Environment variables
- Production と Preview それぞれに設定
- 再ビルドをトリガー
Netlify:
- Site settings → Environment variables
- 変数を追加
- 新しいデプロイをトリガー
環境変数の正しい使い方:
// 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 エラー、ということもあります。
頻出する問題点:
- base パスの設定ミス(GitHub Pages デプロイ)
GitHub Pages の URL は https://username.github.io/repo-name/ 形式です。astro.config.mjs で base を設定しないと、リソースパスがすべて 404 になります。
誤った設定:
export default defineConfig({
site: 'https://username.github.io/my-blog/',
// base の設定を忘れた
});
正しい設定:
export default defineConfig({
site: 'https://username.github.io',
base: '/my-blog', // リポジトリ名を base に
});
- インテグレーション(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 パッケージはブラウザ向けで、document や window などのブラウザ 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-mysql→mysql2- 古いチャートライブラリ → SSR に強い
chart.js - jQuery プラグイン → ネイティブ JS またはモダンなフレームワークコンポーネント
おすすめ:
サードパーティパッケージを選ぶ前に、ドキュメントで SSR / SSG 対応の記載を確認しましょう。「works with Next.js」「SSR compatible」とあれば、多くの場合 Astro でも使えます。
原因 7:Astro バージョンアップによる Breaking Changes
典型的なシナリオ:
Astro 5(または他のメジャーバージョン)に上げたあと、以前はビルドできたプロジェクトが突然——
- ビルドが終わらない
- 不可解なモジュール解決エラー
- 一部 API が使えなくなる
よくある問題:
- CommonJS モジュール解決の変更
Astro 5 ではモジュール解決ロジックが変わり、以前動いていた CommonJS パッケージが動かなくなることがあります。
- API の廃止・変更
メジャーバージョンごとに旧 API が廃止されます。Astro.xxx のメソッド名変更や削除などです。
- インテグレーションのバージョン不整合
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 上でビルド失敗を起こす、特に画像最適化後、という報告が多いです。
遭遇したら:
- アンインストール:
npm uninstall astro-compress astro.config.mjsから削除- 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 公式リソース:
- 公式トラブルシューティングガイド:まずここ
- エラーリファレンス:Astro エラーの詳細一覧
- Discord コミュニティ:難しい問題はここで質問
便利なコマンド:
# Astro 設定が正しいか確認
npx astro check
# 詳細なビルド情報
npx astro build --verbose
# デバッグモードで dev 実行
DEBUG=astro:* npm run dev
コミュニティリソース:
- Astro GitHub Issues:既知の問題を検索
- Stack Overflow:
[astro]タグで検索 - 日本語・中国語の技術フォーラムやブログ:多くの失敗談が共有されている
結論
ここまでの内容を、短く振り返ります。
Astro のビルド失敗の 90% は、次の原因に収まります。
- Node.js バージョンの非互換:≥18.17.1 または 20.3.0+ か確認
- 依存パッケージの問題:キャッシュ削除・再インストール、lock ファイルの確認
- Content Collections の検証失敗:frontmatter 形式の修正
- 環境変数の設定ミス:デプロイ先で正しく設定、
PUBLIC_プレフィックスに注意 - 設定ファイルの誤り:base パスの確認、インテグレーション競合の切り分け
- SSR 非対応のサードパーティパッケージ:
client:onlyまたは動的インポート - バージョンアップの Breaking Changes:移行ガイドを確認し、段階的にアップグレード
5 ステップの迅速な切り分けも忘れずに。
- Node バージョンを確認
- 依存のインストールを確認
- キャッシュを削除して再ビルド
- 最近の変更を確認
- ローカルと本番の環境差分を比較
最も大切なのは、体系的な切り分けの考え方です。いきなり慌てず、エラーメッセージを読み、種別と位置を特定してから、原因に応じて対処しましょう。
Astro を始めた頃は、ビルドエラーで何時間もかかることもありました。この方法論を身につけてからは、だいたい 5〜10 分で特定・解決できるようになりました。この記事が、あなたの遠回りを減らす助けになれば幸いです。
最後に一点:バージョンの進化は速いです。この記事を書いたのは 2024 年末で、当時の Astro 安定版は 4.x でした。読んでいる時点で 6.0 や 7.0 になっているかもしれません。その場合は公式ドキュメントの最新説明も照合してください。API やエラーメッセージは変わることがありますが、切り分けの考え方は通用します。
新しい問題に遭遇したら、ぜひコメントで共有してください。この切り分けガイドを一緒に充実させましょう。ブックマークしておけば、次にビルドが失敗したときにすぐ照合でき、時間も手間も省けます。
Astro ビルド失敗を 5 分で切り分ける完全フロー
体系的な 5 ステップ切り分け法と、よくある 7 つのビルドエラーシナリオの具体的な解決策。問題の 90% は 5〜10 分で解決できます
⏱️ 目安時間: 10 分
- 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: よくあるビルドエラー 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: デプロイ先ごとの特有の落とし穴
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: 予防的なベストプラクティス
nvm で Node バージョンを管理
• チーム全員が同じ Node バージョンを使う
• バージョン不一致によるビルド問題を防ぐ
依存を定期的に更新
• npm outdated で古い依存を確認
• 安定版へ定期的に更新
TypeScript の型チェックを使う
• ビルド前に型チェックを実行
• 型エラーを早期に発見
CI/CD でビルドを自動テスト
• GitHub Actions などで自動ビルドテストを設定
• コミットのたびにビルドチェックを実行
Git hooks でコミット前にビルドチェック
• pre-commit hook を設定
• コミット前に自動でビルドチェック
• 問題のあるコードのコミットを防ぐ
FAQ
Astro ビルド失敗で最も多い 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 ステップ切り分け法とは?
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)ごとの特有の落とし穴は?
• 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日
Astro 完全ガイド
検索からこのページに来た場合は、前後の記事もあわせて読むと同じテーマの理解がかなり早く深まります。
前の記事
Astro ブログ完全ガイド:0 から始める長期運用のデジタル資産
Astro で高性能ブログを構築する完全ガイド。技術選定、プロジェクト構成、SEO、コンテンツ運用までを網羅し、ブログが途中で止まる問題を解決して、持続可能なデジタル資産を育てます。
第 13 / 18 記事
次の記事
Astro画像最適化完全ガイド:サイト読み込みを50%速くする5つの実践テクニック
Astro画像最適化を実践で徹底解説。Imageコンポーネントの設定、WebP/AVIFフォーマットの選び方、遅延読み込み戦略、Cloudflare CDN連携まで。コード例付きで、ファーストビュー読み込みを6秒から1.8秒へ、Lighthouseスコアを95点まで引き上げた手順を公開します。
第 15 / 18 記事
関連記事
Astro とは?3 分でわかるゼロ JS・アイランドアーキテクチャ・コンテンツ優先の本当の意味
Astro とは?3 分でわかるゼロ JS・アイランドアーキテクチャ・コンテンツ優先の本当の意味
ゼロから Astro ブログを構築:1 時間でトップページからデプロイまで
ゼロから Astro ブログを構築:1 時間でトップページからデプロイまで
Astro Content Collections 完全ガイド:概念から Schema 検証の実践まで
コメント
GitHubアカウントでログインしてコメントできます