Skip to content

Kapitel 15: Häufige Fehler & Interviewfragen

📖 Lernziele

In diesem Kapitel lernen Sie:

  • ✅ Häufige Anfängerfehler vermeiden
  • ✅ Typische Fehlermeldungen verstehen und lösen
  • ✅ Next.js Kernkonzepte für Interviews beherrschen
  • ✅ Praxisnahe Interviewfragen beantworten
  • ✅ Interview-Tipps für Next.js Entwickler

15.1 Häufige Anfängerfehler

❌ Fehler 1: 'use client' Directive vergessen

Problem:

jsx
// ❌ Falsch (Fehlermeldung: Hooks can only be used in Client Components)
import { useState } from 'react';

export default function Counter() {
  const [count, setCount] = useState(0); // Fehler!
}

Lösung:

jsx
// ✅ Richtig
'use client'; // ⚠️ WICHTIG: Muss ganz oben stehen!

import { useState } from 'react';

export default function Counter() {
  const [count, setCount] = useState(0); // Funktioniert!
}

❌ Fehler 2: Falsche Verzeichnisstruktur (App Router)

Problem:

app/
├── home/
│   └── page.js     → /home (Nicht /)
└── about/
    └── page.js   → /about

Lösung (Startseite):

app/
├── page.js           → / (Startseite!)
└── about/
    └── page.js   → /about

❌ Fehler 3: Daten direkt in Client Component abfragen (ohne useEffect)

Problem:

jsx
'use client';

export default function Posts() {
  // ❌ Falsch: Direkter await in Client Component (funktioniert nicht!)
  const res = await fetch('https://api.example.com/posts');
  const posts = await res.json();
}

Lösung (Server Component verwenden):

jsx
// ✅ Richtig: Server Component (Standard)
export default async function Posts() {
  const res = await fetch('https://api.example.com/posts');
  const posts = await res.json();
  
  return (
    <ul>
      {posts.map(post => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  );
}

Oder mit useEffect (Client Component):

jsx
'use client';

import { useState, useEffect } from 'react';

export default function Posts() {
  const [posts, setPosts] = useState([]);
  
  useEffect(() => {
    async function loadPosts() {
      const res = await fetch('https://api.example.com/posts');
      const data = await res.json();
      setPosts(data);
    }
    loadPosts();
  }, []);
  
  return (
    <ul>
      {posts.map(post => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  );
}

❌ Fehler 4: className statt class verwenden

Problem:

jsx
// ❌ Falsch
<div class="container">Hallo</div>

Lösung:

jsx
// ✅ Richtig
<div className="container">Hallo</div>

❌ Fehler 5: Lokale Bilder falsch importieren

Problem:

jsx
// ❌ Falsch
<img src="/images/logo.png" alt="Logo" />

Lösung (mit next/image):

jsx
// ✅ Richtig
import Image from 'next/image';
import logo from '@/public/logo.png';

export default function Header() {
  return (
    <Image 
      src={logo} 
      alt="Logo" 
      width={100} 
      height={50} 
    />
  );
}

15.2 Typische Fehlermeldungen

⚠️ Fehler 1: Hydration failed

Fehlermeldung:

Error: Hydration failed.

Ursache: Server-HTML stimmt nicht mit Client-HTML überein.

Lösung:

jsx
'use client';

import { useEffect, useState } from 'react';

export default function ClientOnlyComponent() {
  const [isClient, setIsClient] = useState(false);
  
  useEffect(() => {
    setIsClient(true);
  }, []);
  
  if (!isClient) return null; // ⚠️ Verhindert Hydration-Fehler
  
  return <div>Nur auf Client sichtbar</div>;
}

⚠️ Fehler 2: Module not found

Fehlermeldung:

Error: Cannot find module '@/components/Button'

Ursache: Falscher Import-Pfad oder fehlende jsconfig.json Konfiguration.

Lösung (jsconfig.json):

json
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["./*"]
    }
  }
}

⚠️ Fehler 3: 404 Page not found

Fehlermeldung:

404 - This page could not be found.

Ursache: Keine page.js Datei im entsprechenden Verzeichnis.

Lösung:

app/
└── blog/
    └── page.js   ← Diese Datei muss existieren!

15.3 Next.js Kernkonzepte für Interviews

🎯 Frage 1: Was ist der Unterschied zwischen App Router und Pages Router?

Antwort:

  • App Router: Neuer Ansatz (Next.js 13+), verwendet app/-Verzeichnis, unterstützt Server Components.
  • Pages Router: Älterer Ansatz, verwendet pages/-Verzeichnis.

Beispiel:

App Router:    app/about/page.js        → /about
Pages Router:  pages/about.js            → /about

🎯 Frage 2: Was sind Server Components und warum sind sie nützlich?

Antwort:

  • Server Components werden auf dem Server gerendert.
  • Vorteile: Kleinere Bundle-Größe, direkter Datenbankzugriff, bessere SEO.

Beispiel:

jsx
// Server Component (Standard)
export default async function Posts() {
  const posts = await fetch('https://api.example.com/posts').then(r => r.json());
  return <ul>{posts.map(p => <li key={p.id}>{p.title}</li>)}</ul>;
}

🎯 Frage 3: Was ist der Unterschied zwischen SSG, SSR und ISR?

ModusBedeutungVerwendung
SSG (Static Site Generation)HTML wird zur Build-Zeit generiertBlog, Dokumentation
SSR (Server-Side Rendering)HTML wird bei jeder Anfrage generiertE-Commerce, Suche
ISR (Incremental Static Regeneration)SSG + automatische AktualisierungBlog mit regelmäßigen Updates

Beispiel (ISR):

jsx
export default async function Page() {
  const res = await fetch('https://api.example.com/posts', {
    next: { revalidate: 60 } // Alle 60 Sekunden aktualisieren
  });
  const posts = await res.json();
  return <PostList posts={posts} />;
}

🎯 Frage 4: Wie funktioniert Datenabfrage in Next.js?

Antwort:

  • Server Components: Direkt mit async/await und fetch().
  • Client Components: Mit useEffect oder Bibliotheken wie SWR/React Query.

Beispiel (Server Component):

jsx
export default async function Page() {
  const posts = await fetch('https://api.example.com/posts').then(r => r.json());
  return <PostList posts={posts} />;
}

Beispiel (Client Component mit SWR):

jsx
'use client';

import useSWR from 'swr';

export default function Page() {
  const { data, error, isLoading } = useSWR('https://api.example.com/posts', url => fetch(url).then(r => r.json()));
  
  if (isLoading) return <p>Lädt...</p>;
  if (error) return <p>Fehler</p>;
  
  return <PostList posts={data} />;
}

15.4 Praxisnahe Interviewfragen

🎯 Frage 1: Erklären Sie das Routing-System von Next.js 14.

Antwort: Next.js 14 verwendet App Router (dateisystem-basiert). Jede page.js Datei erstellt eine Route.

Beispiel:

app/
├── page.js         → /
├── about/page.js   → /about
└── blog/
    └── [slug]/
        └── page.js → /blog/[slug]

🎯 Frage 2: Wie verwalten Sie den State in einer Next.js Anwendung?

Antwort:

  • Lokaler State: useState, useReducer
  • Globaler State: Context API, Zustand, Redux Toolkit
  • Server-State: SWR oder React Query

Beispiel (Zustand):

javascript
// store/useStore.js
import { create } from 'zustand';

const useStore = create((set) => ({
  count: 0,
  increment: () => set((state) => ({ count: state.count + 1 })),
}));

export default useStore;

🎯 Frage 3: Wie optimieren Sie die Performance einer Next.js Anwendung?

Antwort:

  • Bildoptimierung: next/image verwenden
  • Code-Splitting: Automatisch durch Next.js
  • ISG/SSR: Richtigen Rendering-Modus wählen
  • Lazy Loading: next/dynamic verwenden

Beispiel (Lazy Loading):

jsx
import dynamic from 'next/dynamic';

const DynamicComponent = dynamic(() => import('@/components/HeavyComponent'), {
  loading: () => <p>Lädt...</p>,
});

export default function Page() {
  return (
    <div>
      <DynamicComponent />
    </div>
  );
}

15.5 Interview-Tipps für Next.js Entwickler

🎯 Tipp 1: Verstehen Sie die Architektur

  • App Router vs Pages Router
  • Server Components vs Client Components
  • Rendering-Modi (SSG, SSR, ISR)

🎯 Tipp 2: Praktische Erfahrung

  • ✅ Erstellen Sie ein Portfolio-Projekt (Blog, E-Commerce)
  • ✅ Verwenden Sie echte APIs (z.B. JSONPlaceholder)
  • ✅ Deployen Sie auf Vercel

🎯 Tipp 3: Wichtige Bibliotheken kennen

BibliothekZweck
SWRDatenabfrage (Caching, Revalidierung)
ZustandState Management (einfach)
Tailwind CSSStyling (schnell)
TypeScriptTypensicherheit

📝 Zusammenfassung

In diesem Kapitel haben Sie gelernt:

KonzeptErklärung
Häufige Fehleruse client Directive, falsche Verzeichnisstruktur, Hydration-Fehler
FehlermeldungenHydration failed, Module not found, 404
InterviewfragenApp Router vs Pages Router, Server Components, SSG/SSR/ISR
TippsArchitektur verstehen, praktische Erfahrung sammeln

✅ Nächste Schritte

  1. Übung: Beheben Sie absichtlich Fehler in einem Next.js-Projekt
  2. Übung: Beantworten Sie die Interviewfragen laut
  3. Weiter geht's: Kapitel 16 - Erweiterte Lernrichtungen

🎯 Selbsttest

Frage 1: Was macht die 'use client' Directive?

Antwort anzeigen Sie macht eine Komponente zur Client Component (ermöglicht Hooks wie `useState`).

Frage 2: Was ist der Unterschied zwischen SSG und SSR?

Antwort anzeigen SSG generiert HTML zur Build-Zeit (schneller), SSR generiert HTML bei jeder Anfrage (immer aktuell).

Frage 3: Wie vermeidet man Hydration-Fehler?

Antwort anzeigen Durch `useEffect` für client-seitige Inhalte oder `next/dynamic` für Lazy Loading.

🚀 Weiter zu Kapitel 16: Erweiterte Lernrichtungen

Frei für alle Anfänger