Ask anything about this article
Hi! I've read this article.
What would you like to know?
@farhan
Next.js 15 represents a paradigm shift in how we build web applications. With Server Components as the default, Partial Prerendering, and Turbopack in stable, this release fundamentally changes the React ecosystem.
In Next.js 15, every component is a Server Component by default. This means your components run on the server, and only the HTML is sent to the client. No JavaScript bundle for server components.
tsx// This runs on the server - no "use client" directive needed
async function ProductPage({ params }) {
const product = await db.products.findOne({ id: params.id });
return (
<div>
<h1>{product.name}</h1>
<p>{product.description}</p>
<AddToCartButton productId={product.id} />
</div>
);
}
tsx// This runs on the client
"use client"
function AddToCartButton({ productId }) {
const [loading, setLoading] = useState(false);
return (
<button onClick={() => addToCart(productId)}>
Add to Cart
</button>
);
}
PPR is the killer feature of Next.js 15. It combines static generation with dynamic rendering at the component level:
tsxexport default async function Dashboard() {
return (
<div>
{/* This is statically generated at build time */}
<Header />
<Sidebar />
{/* This streams in dynamically */}
<Suspense fallback={<Loading />}>
<UserData /> {/* Dynamic - fetches user-specific data */}
</Suspense>
{/* Static again */}
<Footer />
</div>
);
}
The static shell loads instantly, and dynamic content streams in progressively. Users see a near-instant page load while personalized content renders seamlessly.
Turbopack is now stable and the default bundler. Written in Rust, it's dramatically faster than Webpack:
| Metric | Webpack | Turbopack |
|---|---|---|
| Cold start | 4.2s | 0.4s |
| HMR (large app) | 1.5s | 0.15s |
| Production build | 45s | 8s |
Server Actions allow you to call server-side functions directly from client components:
tsx"use server"
async function createPost(formData: FormData) {
const title = formData.get('title');
await db.posts.insert({ title, createdAt: new Date() });
revalidatePath('/blog');
}
// In your component
<form action={createPost}>
<input name="title" />
<button type="submit">Create Post</button>
</form>
No API routes needed. No fetch calls. The function runs on the server, and the page automatically updates.
npm install next@15 react@19"use client"useEffect to async Server Componentsnext.config.jsNext.js 15 isn't just an update — it's a rethinking of how React applications should work.