Design wechseln

CF Pages Build schlägt fehl? 8 häufige Probleme und Lösungen sparen Ihnen Stunden Debug-Zeit

Cloudflare Pages Build-Log, rot „Failed”. Heute Abend der fünfte Fehlschlag, morgen früh die Kundendemo. 500 Zeilen Build-Log, npm ERR! überall – und Sie wissen nicht, wo Sie anfangen sollen. Lösungen aus dem Netz: manche wirkungslos, manche verschlimmern es.

Die meisten CF Pages Build-Fehler fallen in drei Kategorien: Umgebungsunterschiede, Abhängigkeitskonfiguration, Versionskompatibilität. Wer diese Muster kennt, löst 90 % der Probleme in 10 Minuten. Dieser Artikel erklärt die Cloudflare Pages Build-Umgebung, fasst 8 typische Fehlerszenarien zusammen (jeweils mit echten Fehlermeldungen und vollständigen Lösungsschritten) und gibt präventive Konfigurationstipps. Danach haben Sie einen klaren Troubleshooting-Ablauf.

Teil 1: Die Cloudflare Pages Build-Umgebung verstehen

Besonderheiten der Pages Build-Umgebung

Bevor Sie konkrete Probleme angehen, sollten Sie verstehen: Die Cloudflare Pages Build-Umgebung unterscheidet sich grundlegend von Ihrer lokalen Entwicklungsumgebung. Oft liegt der Fehler nicht am Code, sondern an der Umgebung.

Standard-Konfiguration:

Ubuntu 22
Betriebssystem
Build System V2
18.17.1
Node-Version
Standard relativ alt, möglicherweise inkompatibel mit neueren Paketen
20 Minuten
Build-Timeout
Harte Grenze, Überschreitung bricht ab
10 MB
Worker-Größenlimit
Limit für Functions-Bundles
  • Betriebssystem: Ubuntu (Build System V2 nutzt Ubuntu 22)
  • Node-Version: 18.17.1 (ja, relativ alt)
  • Paketmanager: standardmäßig npm clean-install, nicht npm install
  • Build-Timeout: 20 Minuten (harte Grenze)
  • Worker-Größe: 10 MB Limit

Warum ist die Node-Version so alt? Cloudflare setzt auf Stabilität. Viele neue Pakete verlangen jedoch Node >= 18.18.0 oder >= 20.0.0 – Versionskonflikte sind vorprogrammiert.

Drei zentrale Unterschiede zur lokalen Umgebung:

  1. Dateisystem unterscheidet Groß-/Kleinschreibung: Unter Windows oder Mac läuft import Header from './header' auch mit Dateiname Header.js. Unter Linux muss die Schreibweise exakt stimmen. Einer der am leichtesten übersehenen Stolpersteine.

  2. Netzwerkumgebung: Lokal nutzen Sie vielleicht einen npm-Mirror (z. B. Taobao). Pages baut direkt gegen die offizielle npm-Quelle – manchmal mit Timeouts.

  3. Unterschied beim Standard-Build-Befehl: Cloudflare führt vor Ihrem build command automatisch npm clean-install --progress=false aus. Strenger als npm install – bei Abweichung zwischen package-lock.json und package.json schlägt der Build fehl.

Schnelle Fehlerdiagnose

Wenn Pages beim Deploy fehlschlägt – wie finden Sie die eigentliche Ursache?

Schritt 1: Build-Log lesen

Build-Logs haben oft Hunderte Zeilen – entscheidend sind nur wenige Stellen:

# Letztes ERR! oder ERROR finden
npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve
# Oder Vite/Webpack-Fehler
[vite]: Rollup failed to resolve import
# Oder Git-Fehler
fatal: unable to access repository

Meine Erfahrung: Nach „ERR!” suchen (mit Ausrufezeichen) und 3–5 Zeilen nach oben lesen – dort liegt meist die Ursache. Lassen Sie sich nicht von der langen Installations-Ausgabe ablenken.

Schritt 2: Deployment ID speichern

Bei jedem fehlgeschlagenen Build erzeugt Cloudflare eine eindeutige Deployment ID – sichtbar in der Browser-Adressleiste:

https://dash.cloudflare.com/xxx/pages/view/your-project/a398d794-7322-4c97-96d9-40b5140a8d9b
                                                          ↑ Das ist die Deployment ID

Diese ID ist wichtig. Bei Support-Anfragen oder Community-Posts kann damit direkt auf Ihren Build verwiesen werden.

Schritt 3: Lokal reproduzieren

Ein Schritt, den viele überspringen. Versuchen Sie, das Problem in einer Linux-Umgebung nachzustellen:

# Methode 1: Docker mit Ubuntu 22
docker run -it ubuntu:22.04 bash
# Methode 2: Strikt npm ci (wie Pages)
npm ci
# Methode 3: Node-Version mit nvm setzen
nvm use 18.17.1

Schlägt npm ci lokal fehl, liegt das Problem bei der Abhängigkeitskonfiguration. Scheitert es mit Node 18.17.1, ist es ein Versionskompatibilitätsproblem.

Teil 2: 8 typische Build-Fehlerszenarien und Lösungen

Problem 1: Abhängigkeitsinstallation fehlgeschlagen (npm install Fehler)

Typische Fehlermeldungen:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve
npm ERR! Fix the upstream dependency conflict, or retry this command
npm ERR! with --force or --legacy-peer-deps
Oder
npm ERR! code ERR_SOCKET_TIMEOUT
npm ERR! network Socket timeout

Das häufigste Szenario. Lokal funktioniert npm install, auf Pages kommt ERESOLVE. Grund: Cloudflare nutzt standardmäßig npm ci – sehr strikt.

Ursachen:

  1. npm clean-install löst peer dependency Konflikte nicht automatisch
  2. package-lock.json und package.json nicht synchron
  3. Netzwerk-Timeout (offizielle npm-Quelle nicht erreichbar)

Lösungen (nach Empfehlung):

Lösung 1: Standard-Installation überspringen, eigenen Befehl setzen

# Umgebungsvariable in Pages-Einstellungen
SKIP_DEPENDENCY_INSTALL=true
# Build command ändern zu
npm install --legacy-peer-deps && npm run build

Die direkteste Lösung – Sie übernehmen die Abhängigkeitsinstallation selbst.

Lösung 2: package-lock.json reparieren

# Lock-Datei lokal neu erzeugen
rm package-lock.json
npm install
git add package-lock.json
git commit -m "fix: regenerate package-lock.json"
git push

Manchmal ist die Lock-Datei einfach korrupt – Neu erzeugen reicht.

Lösung 3: Build über GitHub Actions

Wenn die ersten beiden nicht helfen, ist das Problem komplexer. GitHub Actions + cloudflare/pages-action geben Ihnen volle Kontrolle über die Build-Umgebung.

# .github/workflows/deploy.yml
- name: Install dependencies
  run: npm install --force
- name: Build
  run: npm run build
- name: Deploy to Cloudflare Pages
  uses: cloudflare/pages-action@v1

Prävention: Regelmäßig lokal npm ci testen, damit die Lock-Datei synchron bleibt.

Problem 2: Node-Versions-Inkompatibilität

Typische Fehlermeldungen:

ERR_PNPM_UNSUPPORTED_ENGINE Unsupported environment
This package requires Node.js version ^18.18.0 or >=20.0.0
Oder
The engine "node" is incompatible with this module.
Expected version ">=18.18.0". Got "18.17.1"

Solche Fehler bedeuten meist: Node-Version zu alt. Viele neue Pakete (TypeScript ESLint, Next.js 14+) verlangen Node >= 18.18.0, Pages-Standard ist 18.17.1.

Lösungen (eine reicht):

Lösung 1: Umgebungsvariable setzen (am empfohlensten)

In Cloudflare Pages unter Settings > Environment variables:

Variable: NODE_VERSION
Wert: 20.11.0

Offiziell empfohlene Methode – einfach und direkt.

Lösung 2: .node-version Datei hinzufügen

Im Projektroot .node-version anlegen:

echo "20.11.0" > .node-version
git add .node-version
git commit -m "chore: specify Node version for Cloudflare Pages"

Lösung 3: .nvmrc Datei verwenden

Gleiches Prinzip, anderer Dateiname:

echo "20.11.0" > .nvmrc

Best Practice: Umgebungsvariable und .node-version kombinieren – lokal und online konsistent. Kein bleeding-edge, sondern LTS (z. B. 20.11.0).

Problem 3: Build-Timeout (über 20 Minuten)

Typisches Symptom:

Build-Log läuft exakt 20 Minuten, bricht dann ohne klare Fehlermeldung ab – nur:

Build exceeded maximum time of 20 minutes

Besonders frustrierend – keine Details. Meist große Projekte oder zu viele Abhängigkeiten.

Ursachen:

  • Zu viele Abhängigkeiten – npm install allein dauert 15 Minuten
  • Build-Skript mit vielen redundanten Operationen
  • Build-Cache nicht genutzt

Lösungen:

Lösung 1: Build-Cache leeren

Manchmal wird der Cache zur Last. In Pages:

Settings > Builds & deployments > Clear build cache

Danach neu bauen – hat bei mir mehrfach geholfen.

Lösung 2: Abhängigkeiten analysieren und optimieren

Bundle Analyzer für große Pakete:

# Next.js Projekt
npm install --save-dev @next/bundle-analyzer
# In next.config.js aktivieren
const withBundleAnalyzer = require('@next/bundle-analyzer')({
  enabled: process.env.ANALYZE === 'true',
})
module.exports = withBundleAnalyzer({
  // Ihre Konfiguration
})

Einmal ANALYZE=true npm run build ausführen und große Pakete identifizieren. Ich habe einmal die gesamte moment.js eingebunden – Wechsel zu day.js sparte 3 Minuten Build-Zeit.

Lösung 3: Teile der Pipeline in CI verlagern

typecheck, lint in GitHub Actions – Pages nur für den Build:

// package.json
{
  "scripts": {
    "build": "next build",  // Nur Build, keine Checks
    "build:full": "npm run typecheck && npm run lint && npm run build"  // Vollständiger Ablauf für CI
  }
}

Lösung 4: pnpm nutzen

pnpm installiert Abhängigkeiten deutlich schneller. In Pages:

Build command: pnpm install && pnpm run build

Problem 4: Modulauflösungsfehler (Module not found)

Typische Fehlermeldungen:

Module not found: Error: Can't resolve './App' in '/opt/buildhome/repo/src'
Did you mean 'App.js'?
Oder
[vite]: Rollup failed to resolve import '/src/components/Snackbar'
from '/opt/buildhome/repo/src/pages/Login.jsx'

Sehr tückisch. Lokal läuft alles, auf Pages fehlt das Modul. In 99 % der Fälle: Groß-/Kleinschreibung.

Ursache:

Linux unterscheidet strikt zwischen Groß- und Kleinschreibung, Windows und macOS standardmäßig nicht. import App from './app' mit Datei App.js – Windows ok, Linux Fehler.

Lösungen:

Lösung 1: Alle Import-Pfade korrigieren

Die grundlegendste Lösung. Jeden Import prüfen, Groß-/Kleinschreibung exakt an Dateinamen anpassen:

// ❌ Falsch
import Header from './header';  // Dateiname ist Header.jsx
// ✅ Richtig
import Header from './Header';

Manuell prüfen ist mühsam. ESLint-Regel empfohlen:

// .eslintrc.js
module.exports = {
  rules: {
    'import/no-unresolved': 'error',  // Nicht auflösbare Imports erkennen
  }
}

Lösung 2: Pfad-Aliase nutzen

Absolute Pfade oder Aliase vermeiden viele Probleme:

// vite.config.js
export default {
  resolve: {
    alias: {
      '@': '/src',
      '@components': '/src/components'
    }
  }
}
// Import mit Alias
import Header from '@components/Header';  // Klar und eindeutig

Lösung 3: Community-Workaround

Ein Nutzer berichtete von einem merkwürdigen, aber wirksamen Trick: Ordner umbenennen, committen, wieder zurückbenennen – und es funktionierte. Vermutlich Cache-bezogen. Wenn nichts anderes hilft, können Sie es versuchen.

Problem 5: Umgebungsvariablen falsch konfiguriert

Typisches Symptom:

console.log(process.env.API_KEY); // undefined

Oder Build-Fehler wegen fehlender Umgebungsvariable.

Ursache:

Build-Zeit- und Laufzeit-Variablen werden oft verwechselt. Außerdem hat jedes Framework eigene Namenskonventionen.

Wichtig zu verstehen:

Cloudflare Pages unterscheidet zwei Typen:

  1. Build-Zeit-Variablen: bei npm run build verfügbar, werden in den Code kompiliert
  2. Laufzeit-Variablen: nur in Functions (Edge Functions)

Bei rein statischen Sites (HTML/JS) sind Laufzeit-Variablen nicht verfügbar – nur Build-Zeit-Variablen.

Lösungen:

Lösung 1: Variablentyp korrekt konfigurieren

Beim Anlegen in Pages beachten:

  • „Production” und „Preview” für die jeweilige Umgebung wählen
  • Option „Build” muss aktiviert sein, wenn die Variable beim Build benötigt wird

Lösung 2: Framework-Namenskonventionen beachten

Unterschiedliche Anforderungen je Framework:

# Vite: Präfix VITE_
VITE_API_KEY=xxx
# Next.js öffentliche Variablen: NEXT_PUBLIC_
NEXT_PUBLIC_API_KEY=xxx
# Nuxt: runtimeConfig in nuxt.config.js

Lösung 3: Sensible Daten als Secret

In Pages gibt es zwei Variablentypen:

  • Text: Wert sichtbar
  • Secret: Wert verschlüsselt, nicht sichtbar

API Keys und Passwörter unbedingt als Secret speichern.

Best Practice:

  1. Lokal .env.local nutzen (in .gitignore eintragen)
  2. Online Cloudflare Pages Umgebungsvariablen
  3. Unterschiedliche Werte für Preview (Test-API) und Production (Live-API)

Problem 6: Git-Integrationsprobleme

Typische Symptome:

  • Keine Autorisierung für das Repository
  • Fehler: „This repository is already in use by another Pages project”
  • Push löst keinen automatischen Build aus

Ursache:

Meist GitHub/GitLab-Autorisierung oder Cloudflare-Limits (ein Repository nicht in mehreren Accounts).

Lösungen:

Lösung 1: GitHub App neu autorisieren

In GitHub:

Settings > Applications > Cloudflare Pages > Configure > Uninstall

Deinstallieren, dann in Cloudflare Dashboard Repository erneut verbinden – löst Neu-Autorisierung aus.

Lösung 2: Repository-Nutzung prüfen

Bei „already in use”: Prüfen, ob dasselbe Repo in mehreren Cloudflare-Accounts genutzt wird. Nicht erlaubt – Pages-Projekt in anderen Accounts löschen.

Lösung 3: GitHub-Berechtigungen prüfen

Mindestens Maintainer-Rechte im Repository nötig. Contributor reicht nicht.

Lösung 4: Sonderzeichen vermeiden

Commit Messages ohne Emojis oder Sonderzeichen – kann Build-Trigger verhindern. GitHub erlaubt es, Cloudflare parst es manchmal nicht korrekt.

Bekannte Einschränkung: PRs von Fork-Repositories lösen keine Preview-Deployments aus. Cloudflare plant Unterstützung, aktuell noch nicht verfügbar.

Problem 7: Functions-Deployment fehlgeschlagen

Typische Symptome:

Build erfolgreich, Deployment-Phase schlägt fehl – wenig aussagekräftige Logs. Oder:

Build failed: Functions bundle size exceeding limit

Ursachen:

  • Worker-Bundle über 10 MB Limit
  • Functions Bindings (KV, D1, R2) falsch konfiguriert
  • Node.js-spezifische APIs in Edge-Umgebung

Lösungen:

Lösung 1: Functions-Bundle-Größe analysieren

Bundle Analyzer – was macht das Bundle so groß?

npm install --save-dev @next/bundle-analyzer

Oft fehlendes Tree Shaking – ganze Bibliothek eingebunden.

Lösung 2: Astro/SvelteKit Adapter optimieren

Bei Astro oder SvelteKit Cloudflare Adapter korrekt konfigurieren:

// astro.config.mjs
import cloudflare from '@astrojs/cloudflare';
export default {
  output: 'hybrid',  // oder 'server'
  adapter: cloudflare({
    mode: 'directory',  // Wichtig: unnötige Daten vorgerenderter Seiten entfernen
  }),
};

Astro packt standardmäßig auch vorgerenderte Seiten in Functions – das bläht das Bundle auf. mode: 'directory' behebt das.

Lösung 3: Bindings prüfen

In Pages:

Settings > Functions > Bindings

KV, D1, R2 aus dem Code müssen konfiguriert sein.

Lösung 4: Keine Node.js-spezifischen APIs

Cloudflare Workers = V8, kein vollständiges Node.js. Diese APIs sind nicht verfügbar:

  • fs (Dateisystem)
  • path (teilweise)
  • child_process
  • net / http (stattdessen fetch)

Logik ggf. in die Build-Phase verlagern.

Problem 8: Cache und Custom Domain

Typische Symptome:

  • Deploy erfolgreich, Website zeigt noch alten Inhalt
  • Custom Domain 404, .pages.dev funktioniert
  • Startseite zeigt 404 Not Found

Ursachen:

  • Page Rules stören Pages-Cache
  • DNS der Custom Domain falsch konfiguriert
  • Keine index.html im Build-Output

Lösungen:

Lösung 1: Cache Everything Page Rule entfernen

Bei Proxied Custom Domain (orange Wolke) beeinflussen Zone-Einstellungen Pages. Prüfen:

Rules > Page Rules

„Cache Everything”-Regel gefunden? Löschen. Pages hat eigenes Caching – Page Rule nicht nötig.

Lösung 2: Custom Domain auf DNS Only setzen

Wenn das nicht hilft: DNS-Eintrag auf graue Wolke (DNS Only):

DNS > Records > Eintrag wählen > DNS Only

Kein Cloudflare-Proxy mehr – direkte Verbindung zu Pages.

Lösung 3: index.html sicherstellen

404 auf Root (yourdomain.com/)? Build-Output auf index.html prüfen. Viele Frameworks liefern dist/index.html – „Build output directory” in Pages muss stimmen.

Lösung 4: Cache manuell leeren

Wenn neuer Inhalt nicht erscheint:

Caching > Configuration > Purge Everything

Achtung: Leert den gesamten Zone-Cache – mit Bedacht nutzen.

Teil 3: Präventive Best Practices

Build-Konfiguration

Lieber von Anfang an richtig konfigurieren als später reparieren:

1. Node-Version explizit angeben

Nicht auf Standard verlassen:

# .node-version Datei
20.11.0
# Gleichzeitig in Cloudflare Pages Umgebungsvariablen
NODE_VERSION=20.11.0

2. Unterschiedliche Build-Befehle pro Branch

Mit CF_PAGES_BRANCH Umgebungsvariable:

// package.json
{
  "scripts": {
    "build": "node scripts/build.js",
    "build:production": "next build",
    "build:preview": "next build && next export"
  }
}
// scripts/build.js
const branch = process.env.CF_PAGES_BRANCH || 'main';
const command = branch === 'main' ? 'build:production' : 'build:preview';
// Entsprechenden Befehl ausführen

3. Bei Monorepos das richtige Root-Verzeichnis setzen

Bei pnpm workspace oder Turborepo in Pages das Root directory angeben:

Root directory: apps/web
Build command: pnpm run build

Kontinuierliches Monitoring und Debugging

1. Lokale Debug-Umgebung aufbauen

Docker simuliert Pages-Umgebung:

# Dockerfile
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y nodejs npm
RUN node -v  # Sollte ca. 18.17.1 sein
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

2. Cloudflare Status im Blick behalten

Manchmal liegt der Fehler bei Cloudflare selbst. Bei unerklärlichen Fehlern zuerst prüfen:

https://www.cloudflarestatus.com/

Pages-Störung? Abwarten statt blind debuggen.

3. Wann Cloudflare Support kontaktieren

Wenn Sie:

  • alle Lösungen ausprobiert haben
  • einen Plattform-Bug vermuten
  • höhere Build-Limits brauchen (Paid-Pläne können anfragen)

Dann Support kontaktieren – mit Deployment ID und detailliertem Fehlerlog.

Fazit

CF Pages Build-Fehler lassen sich auf wenige Kategorien reduzieren. In 90 % der Fälle: Umgebungsunterschiede (Node-Version, Dateisystem-Groß-/Kleinschreibung), Abhängigkeitskonfiguration (package-lock.json, peer dependencies) oder Missverständnisse über Pages (Umgebungsvariablen, Cache).

Systematisches Vorgehen:

  1. Build-Log lesen, echte Fehlermeldung finden
  2. Problemkategorie bestimmen (Abhängigkeit, Version, Pfad, Konfiguration)
  3. Lokal reproduzieren
  4. Passende Lösung anwenden
  5. Präventiv konfigurieren, um Wiederholungen zu vermeiden

Bewahren Sie diesen Artikel als Troubleshooting-Handbuch auf. Beim nächsten Build-Fehler: diesem Ablauf folgen – in den meisten Fällen ist das Problem in 10 Minuten gelöst. Wenn das grüne „✓ Deployed” erscheint, ist die Erleichterung unschätzbar.

Weitere Cloudflare Pages Probleme? Teilen Sie sie gerne in den Kommentaren – vielleicht hilft es anderen.

Vollständiger Troubleshooting-Ablauf für fehlgeschlagene Cloudflare Pages Builds

Systematische Methode von der Build-Umgebung bis zu 8 typischen Problemen – 90 % lösbar in 10 Minuten

Estimated time: PT10M

  1. 1

    Step 1: Besonderheiten der Cloudflare Pages Build-Umgebung verstehen

    Standard-Konfiguration:
  2. 2

    Step 2: Schnelle Fehlerdiagnose: Build-Log lesen und Deployment ID speichern

    Build-Log lesen:
  3. 3

    Step 3: Lokal reproduzieren und Abhängigkeitsfehler beheben

    Lokal reproduzieren:
  4. 4

    Step 4: Node-Versions-Inkompatibilität und Build-Timeout lösen

    Node-Versions-Inkompatibilität:
  5. 5

    Step 5: Modulauflösungsfehler und Umgebungsvariablen beheben

    Modulauflösungsfehler:
  6. 6

    Step 6: Git-Integration und Functions-Deployment beheben

    Git-Integration:

FAQ

Was ist die Standard-Konfiguration der Cloudflare Pages Build-Umgebung? Worin unterscheidet sie sich von der lokalen Umgebung?
Standard-Konfiguration:
• Betriebssystem: Ubuntu 22 (Build System V2)
• Node-Version: 18.17.1 (relativ alt, möglicherweise inkompatibel mit neueren Paketen)
• Paketmanager: standardmäßig npm clean-install, nicht npm install
• Build-Timeout: 20 Minuten (harte Grenze)
• Worker-Größe: 10 MB Limit

Drei zentrale Unterschiede zur lokalen Umgebung:
1) Dateisystem unterscheidet Groß-/Kleinschreibung:
• Linux ist strikt, Windows/Mac standardmäßig nicht
• import Header from './header' schlägt auf Linux fehl, auch wenn die Datei Header.js heißt
• Einer der am leichtesten übersehenen Stolpersteine

2) Netzwerkumgebung:
• Lokal nutzen Sie vielleicht einen npm-Mirror (z. B. Taobao)
• Pages baut direkt gegen die offizielle npm-Quelle – manchmal mit Timeouts

3) Unterschied beim Standard-Build-Befehl:
• Cloudflare führt vor Ihrem build command automatisch npm clean-install --progress=false aus
• Strenger als npm install – bei Abweichung zwischen package-lock.json und package.json schlägt der Build fehl

Warum ist die Node-Version so alt? Cloudflare setzt auf Stabilität. Viele neue Pakete verlangen jedoch Node >= 18.18.0 oder >= 20.0.0 – das führt zu Versionskonflikten.
Wie finde ich schnell die Ursache eines fehlgeschlagenen Cloudflare Pages Builds?
Schritt 1: Build-Log lesen
Build-Logs haben oft Hunderte Zeilen – entscheidend sind nur wenige Stellen:
• Letztes ERR! oder ERROR finden (npm ERR! code ERESOLVE, npm ERR! ERESOLVE could not resolve)
• Oder Vite/Webpack-Fehler ([vite]: Rollup failed to resolve import)
• Oder Git-Fehler (fatal: unable to access repository)

Meine Erfahrung: Nach „ERR!“ suchen (mit Ausrufezeichen) und 3–5 Zeilen nach oben lesen – dort liegt meist die Ursache. Lassen Sie sich nicht von der langen Installations-Ausgabe ablenken.

Schritt 2: Deployment ID speichern
Bei jedem fehlgeschlagenen Build erzeugt Cloudflare eine eindeutige Deployment ID – sichtbar in der Browser-Adressleiste:
https://dash.cloudflare.com/xxx/pages/view/your-project/a398d794-7322-4c97-96d9-40b5140a8d9b

Diese ID ist wichtig: Bei Support-Anfragen oder Community-Posts kann damit direkt auf Ihren Build verwiesen werden.

Schritt 3: Lokal reproduzieren
Versuchen Sie, das Problem in einer Linux-Umgebung nachzustellen:
• Docker mit Ubuntu 22: docker run -it ubuntu:22.04 bash
• Strikt npm ci verwenden (wie Pages)
• Node-Version mit nvm setzen: nvm use 18.17.1

Schlägt npm ci lokal fehl, liegt das Problem bei der Abhängigkeitskonfiguration.
Scheitert es mit Node 18.17.1, ist es ein Versionskompatibilitätsproblem.
Wie behebe ich fehlgeschlagene Abhängigkeitsinstallation (npm install Fehler)?
Typische Fehlermeldungen:
• npm ERR! code ERESOLVE
• npm ERR! ERESOLVE could not resolve
• npm ERR! Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps
• Oder npm ERR! code ERR_SOCKET_TIMEOUT, npm ERR! network Socket timeout

Das häufigste Szenario: lokal funktioniert npm install, auf Pages kommt ERESOLVE. Grund: Cloudflare nutzt standardmäßig npm ci – sehr strikt.

Ursachen:
• npm clean-install löst peer dependency Konflikte nicht automatisch
• package-lock.json und package.json nicht synchron
• Netzwerk-Timeout (offizielle npm-Quelle nicht erreichbar)

Lösungen (nach Empfehlung):

Lösung 1: Standard-Installation überspringen, eigenen Befehl setzen
• Umgebungsvariable SKIP_DEPENDENCY_INSTALL=true in Pages-Einstellungen
• Build command ändern zu: npm install --legacy-peer-deps && npm run build
• Direkteste Lösung – Sie übernehmen die Abhängigkeitsinstallation selbst

Lösung 2: package-lock.json reparieren
• Lock-Datei lokal neu erzeugen:
rm package-lock.json
npm install
git add package-lock.json
git commit -m "fix: regenerate package-lock.json"
git push
• Manchmal ist die Lock-Datei einfach korrupt

Lösung 3: Build über GitHub Actions
• Wenn die ersten beiden nicht helfen, ist das Problem komplexer
• GitHub Actions + cloudflare/pages-action für vollständige Kontrolle über die Build-Umgebung

Prävention: Regelmäßig lokal npm ci testen, damit die Lock-Datei synchron bleibt.
Wie löse ich Node-Versions-Inkompatibilität? Was tun bei Build-Timeout?
Node-Versions-Inkompatibilität:

Typische Fehlermeldungen:
• ERR_PNPM_UNSUPPORTED_ENGINE Unsupported environment
• This package requires Node.js version ^18.18.0 or >=20.0.0
• Oder The engine "node" is incompatible with this module. Expected version ">=18.18.0". Got "18.17.1"

Solche Fehler bedeuten meist: Node-Version zu alt. Viele neue Pakete (TypeScript ESLint, Next.js 14+) verlangen Node >= 18.18.0, Pages-Standard ist 18.17.1.

Lösungen:

Lösung 1: Umgebungsvariable setzen (empfohlen)
• In Cloudflare Pages: Settings > Environment variables
• Variable: NODE_VERSION
• Wert: 20.11.0
• Offiziell empfohlene Methode

Lösung 2: .node-version Datei hinzufügen
• Im Projektroot: echo "20.11.0" > .node-version

Lösung 3: .nvmrc Datei verwenden
• Gleiches Prinzip, anderer Dateiname: echo "20.11.0" > .nvmrc

Best Practice:
Umgebungsvariable und .node-version kombinieren – lokal und online konsistent. Kein bleeding-edge, sondern LTS (z. B. 20.11.0).

Build-Timeout:

Typisches Symptom:
Build-Log läuft exakt 20 Minuten, bricht dann ohne klare Fehlermeldung ab – nur: Build exceeded maximum time of 20 minutes.

Lösungen:

Lösung 1: Build-Cache leeren
• Pages: Settings > Builds & deployments > Clear build cache
• Danach neu bauen – hat bei mir mehrfach geholfen

Lösung 2: Abhängigkeiten analysieren und optimieren
• Bundle Analyzer für große Pakete
• Ich habe einmal die gesamte moment.js eingebunden – Wechsel zu day.js sparte 3 Minuten Build-Zeit

Lösung 3: Teile der Pipeline in CI verlagern
• typecheck, lint in GitHub Actions
• Pages nur für den Build

Lösung 4: pnpm nutzen
• pnpm installiert Abhängigkeiten deutlich schneller
• In Pages: Build command: pnpm install && pnpm run build
Wie behebe ich Modulauflösungsfehler (Module not found)? Was bei falschen Umgebungsvariablen?
Modulauflösungsfehler:

Typische Fehlermeldungen:
• Module not found: Error: Can't resolve './App' in '/opt/buildhome/repo/src'
• Did you mean 'App.js'?
• Oder [vite]: Rollup failed to resolve import '/src/components/Snackbar' from '/opt/buildhome/repo/src/pages/Login.jsx'

Sehr tückisch: lokal läuft alles, auf Pages fehlt das Modul. In 99 % der Fälle: Groß-/Kleinschreibung.

Ursache:
Linux unterscheidet strikt zwischen Groß- und Kleinschreibung, Windows und macOS standardmäßig nicht. import App from './app' mit Datei App.js – Windows ok, Linux Fehler.

Lösungen:

Lösung 1: Alle Import-Pfade korrigieren
• Jeden Import prüfen, Groß-/Kleinschreibung exakt an Dateinamen anpassen
• ESLint-Regel empfohlen: in .eslintrc.js
rules: { 'import/no-unresolved': 'error' }

Lösung 2: Pfad-Aliase nutzen
• Absolute Pfade oder Aliase vermeiden viele Probleme
• In vite.config.js resolve.alias konfigurieren
• Import: import Header from '@components/Header'

Umgebungsvariablen-Fehler:

Cloudflare Pages unterscheidet zwei Typen:
• Build-Zeit-Variablen: bei npm run build verfügbar, werden in den Code kompiliert
• Laufzeit-Variablen: nur in Functions (Edge Functions)

Bei rein statischen Sites (HTML/JS) sind Laufzeit-Variablen nicht verfügbar – nur Build-Zeit-Variablen.

Lösungen:

Lösung 1: Variablentyp korrekt konfigurieren
• Beim Anlegen in Pages: Production und Preview wählen
• Option Build muss aktiviert sein, wenn die Variable beim Build benötigt wird

Lösung 2: Framework-Namenskonventionen beachten
• Vite: Präfix VITE_
• Next.js öffentliche Variablen: NEXT_PUBLIC_
• Nuxt: runtimeConfig in nuxt.config.js

Lösung 3: Sensible Daten als Secret
• API Keys, Passwörter unbedingt als Secret-Typ speichern
Wie löse ich Git-Integrationsprobleme und fehlgeschlagene Functions-Deployments?
Git-Integrationsprobleme:

Typische Symptome:
• Keine Autorisierung für das Repository – Fehler: This repository is already in use by another Pages project
• Push löst keinen automatischen Build aus

Ursachen: GitHub/GitLab-Autorisierung oder Cloudflare-Limits (ein Repository nicht in mehreren Accounts).

Lösungen:

Lösung 1: GitHub App neu autorisieren
• GitHub: Settings > Applications > Cloudflare Pages > Configure > Uninstall
• In Cloudflare Dashboard Repository erneut verbinden

Lösung 2: Repository-Nutzung prüfen
• Fehlermeldung „already in use“: gleiches Repo in mehreren Cloudflare-Accounts?
• Nicht erlaubt – Pages-Projekt in anderen Accounts löschen

Lösung 3: GitHub-Berechtigungen prüfen
• Mindestens Maintainer-Rechte im Repository nötig
• Contributor reicht nicht

Lösung 4: Sonderzeichen vermeiden
• Keine Emojis oder Sonderzeichen in Commit Messages
• GitHub erlaubt es, Cloudflare parst es manchmal nicht korrekt

Functions-Deployment fehlgeschlagen:

Typische Symptome:
• Build erfolgreich, Deployment-Phase schlägt fehl
• Wenig aussagekräftige Logs
• Oder: Build failed: Functions bundle size exceeding limit

Ursachen:
• Worker-Bundle über 10 MB
• Functions Bindings (KV, D1, R2) falsch konfiguriert
• Node.js-spezifische APIs in Edge-Umgebung

Lösungen:

Lösung 1: Functions-Bundle-Größe analysieren
• Bundle Analyzer – was macht das Bundle so groß?
• Oft fehlendes Tree Shaking, ganze Bibliothek eingebunden

Lösung 2: Astro/SvelteKit Adapter optimieren
• Cloudflare Adapter korrekt konfigurieren
• Astro packt standardmäßig auch vorgerenderte Seiten in Functions – mode: 'directory' hilft

Lösung 3: Bindings prüfen
• Pages: Settings > Functions > Bindings
• KV, D1, R2 aus dem Code müssen konfiguriert sein

Lösung 4: Keine Node.js-spezifischen APIs
• Cloudflare Workers = V8, kein vollständiges Node.js
• fs, path (teilweise), child_process, net/http nicht verfügbar
• Logik ggf. in die Build-Phase verlagern

11 Min. Lesezeit · Veröffentlicht am: 1. Dez. 2025 · Aktualisiert am: 4. Juli 2026

Ähnliche Beiträge

Kommentare

Melde dich mit GitHub an, um einen Kommentar zu hinterlassen

Easton BlogEaston Blog