CoachnestCoachnest
Sign InGet Started
Back to course

Next.js 16: The Complete Developer Guide

…
—
Contents
1

What's New in Next.js 16

Reading14mFree
2

Installation, CLI & Your First Project

Reading12mFree
3

Project Structure & Conventions Deep Dive

Reading16m
4

Turbopack — The New Default Bundler

Video18m
5

Configuring TypeScript, ESLint & next.config.ts

Reading14m
6

Chapter 1 — Quiz

Quiz10m
7

App Router Fundamentals

Reading16m
8

Dynamic Routes, Catch-Alls & Type-Safe Params

Reading14m
9

Route Groups & Parallel Routes

Reading16m
10

Intercepting Routes & Modal Patterns

Reading12m
11

Loading, Error & Not-Found UI

Reading12m
12

Chapter 2 — Routing Quiz

Quiz12m
13

Understanding the Server/Client Boundary

Reading18m
14

Choosing When to use "use client"

Reading14m

Composing Server & Client Components

Reading14m
16

server-only, client-only & Code Splitting

Reading12m
17

Chapter 3 — Quiz

Quiz10m
18

Fetching Data in Server Components

Reading14m
19

The Next.js 16 Cache Model

Reading16m
20

Revalidation: revalidateTag, revalidatePath & On-Demand

Reading12m
21

Cache Components — Building Reusable Cached Functions

Reading14m
22

Search Params, Cookies & Dynamic APIs

Reading12m
23

Chapter 4 — Quiz

Quiz12m
24

Server Actions From First Principles

Reading16m
25

Forms with useActionState & Progressive Enhancement

Reading14m
26

Optimistic UI with useOptimistic

Reading12m
27

Validation with Zod + Server Actions

Reading12m
28

Chapter 5 — Quiz

Quiz10m
29

Static vs Dynamic vs Streaming

Reading14m
30

generateStaticParams & Pre-Rendering Dynamic Routes

Reading12m
31

Incremental Static Regeneration (ISR)

Reading12m
32

Partial Prerendering (PPR)

Reading16m
33

Edge Runtime vs Node.js Runtime

Reading12m
34

Rendering Strategies Deep Dive

Video22m
35

Chapter 6 — Quiz

Quiz12m
36

Tailwind CSS v4 with Next.js 16

Reading14m
37

CSS Modules, Global Styles & Scoped CSS

Reading10m
38

next/image — Smart, Fast Images

Reading14m
39

Fonts, Icons & Metadata

Reading12m
40

Chapter 7 — Quiz

Quiz10m
41

Middleware Fundamentals

Reading14m
42

Sessions, JWTs & Cookies

Reading16m
43

Protecting Server Components & Server Actions

Reading12m
44

Chapter 8 — Quiz

Quiz10m
45

Prisma with Next.js — The Production Setup

Reading14m
46

Mutations: Server Actions + Database Writes

Reading12m
47

Route Handlers & REST APIs

Reading12m
48

Chapter 9 — Quiz

Quiz10m
49

Unit & Component Testing with Vitest

Reading12m
50

End-to-End Testing with Playwright

Reading14m
51

Deploying to Vercel

Reading12m
52

Self-Hosting with Docker

Reading14m
53

Production Performance Checklist

Reading12m
54

Final Assessment — Next.js 16 Mastery

Quiz20m
←→navigate lessons
Chapter 3 of 10·Chapter 3 — Server Components & Client Components
Lesson 15 of 54Reading14 min

Composing Server & Client Components

#Composing Server & Client Components¶

The Rules of Composition¶

  1. 1Server can render Client.
  2. 2Client cannot render Server — but it can render Server Components passed in as children or props.
  3. 3Props passed across the boundary must be serializable: strings, numbers, booleans, arrays, plain objects, Dates, JSX. Not functions, class instances, Maps, Sets, Symbols.

Pattern: Server Component as a Child of a Client Component¶

Want a client-side interactive shell (tab switcher, accordion, modal) with server-rendered content inside? Pass the content as children.

tsx
17 lines
1// components/Tabs.tsx — Client
2"use client";
3import { useState } from "react";
4
5export function Tabs({ labels, children }: { labels: string[]; children: React.ReactNode[] }) {
6  const [active, setActive] = useState(0);
7  return (
8    <div>
9      <nav>{labels.map((l, i) => (
10        <button key={l} onClick={() => setActive(i)} className={active === i ? "font-bold" : ""}>
11          {l}
12        </button>
13      ))}</nav>
14      <section>{children[active]}</section>
15    </div>
16  );
17}
tsx
13 lines
1// app/dashboard/page.tsx — Server
2import { Tabs } from "@/components/Tabs";
3import { Earnings } from "./Earnings";      // Server Component
4import { Students } from "./Students";       // Server Component, async + DB
5
6export default function Dashboard() {
7  return (
8    <Tabs labels={["Earnings", "Students"]}>
9      <Earnings />
10      <Students />
11    </Tabs>
12  );
13}

The Tabs shell is interactive. The slot contents are still rendered on the server with full access to the DB. The bundle ships only Tabs to the client — not Earnings or Students.

Pattern: Server-Fetched Data as a Prop¶

tsx
16 lines
1// app/profile/page.tsx — Server
2import { ProfileForm } from "./ProfileForm";
3
4export default async function Profile() {
5  const user = await getCurrentUser();
6  return <ProfileForm initialValues={{ name: user.name, email: user.email }} />;
7}
8
9// ./ProfileForm.tsx — Client
10"use client";
11import { useState } from "react";
12
13export function ProfileForm({ initialValues }: { initialValues: { name: string; email: string } }) {
14  const [v, setV] = useState(initialValues);
15  // …
16}

What Cannot Cross The Boundary¶

tsx
2 lines
1// ❌ Will fail
2<MyClient onSave={async (data) => db.user.update(data)} />

Pass a Server Action instead — it serializes to a reference, not a function body.

tsx
3 lines
1// ✅
2import { saveUser } from "./actions";
3<MyClient onSave={saveUser} />

server-only and client-only Packages¶

To prevent accidental bundle leaks, use these tiny marker packages:

bash
1 line
1npm i server-only client-only
ts
4 lines
1// lib/db.ts
2import "server-only";
3import { PrismaClient } from "@prisma/client";
4export const db = new PrismaClient();

If anything imports lib/db.ts from a client component, the build will fail with a clear error.

ts
4 lines
1// lib/analytics.ts
2import "client-only";
3import posthog from "posthog-js";
4posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY!);

Practical Architecture¶

A real Next.js app typically splits like this:

LayerComponentsRoughly % of LOC
Pages & layoutsServer30%
Domain components (Cards, Lists, Details)Server40%
Interactive shells (Tabs, Modals, Forms)Client20%
Primitives (Button, Input, Dialog)Mostly Client10%

Server Components dominate the line count. Client Components stay narrow.

Previous

Choosing When to use "use client"

Next

server-only, client-only & Code Splitting

Use ← → arrow keys to navigate between lessons