Next.js 15: Is It Production Ready?

👨‍💻
Karen M.
Lead EngineerDec 12, 202412 min read
#Next.js#React#Performance#Migration
AI TL;DR (Too Long; Didn't Read)
  • Partial Prerendering delivers 60% faster initial page loads on average
  • Caching semantics broke 3 of 5 apps during migration - expect a learning curve
  • Migrate if you need better streaming; wait if you're on tight deadlines

Our Next.js 15 Journey

After 3 months and 5 production deployments, we have thoughts. Strong thoughts.

The Good

Partial Prerendering

is a game-changer. Our initial page loads are now 60% faster on average. The ability to stream static shells while dynamic content loads in the background creates a perceived performance that feels instant.

React 19 Integration

brings server actions that actually work. No more API route boilerplate for simple mutations.

typescript
// Server actions are finally useful
'use server'

export async function submitForm(formData: FormData) {

const email = formData.get('email') await db.subscribers.create({ email }) revalidatePath('/subscribers') }

The Bad

Caching

is still confusing. The new caching semantics broke 3 of our 5 apps during migration. Documentation exists, but the mental model takes time to build.

Build times

increased by 40% for our monorepo. The new compiler is powerful but hungry.

"The caching changes alone cost us two sprints of debugging. Worth it in the end, but painful."

The Verdict

Migrate if:

  • You need better streaming/PPR
  • You're starting a new project
  • You have time to learn new caching patterns

Wait if:

  • Your current app is stable
  • You're on tight deadlines
  • Your team is already stretched thin

Code Examples

Here's how we're using the new after

API for non-blocking operations:

typescript
import { after } from 'next/server'

export async function POST(request: Request) {

const data = await request.json() // Do the critical work first await saveToDatabase(data) // Non-blocking analytics - runs after response after(() =

{

trackEvent('form_submission', data) notifySlack('New submission received') }) return Response.json({ success: true }) }
Need help with your Next.js migration? We've done it 5 times now.

Need this implemented in your business?

We turn these insights into production-ready systems. From AI integrations to enterprise platforms.