Next.js 16 Preview: What Has Changed? (feat. Zero Bundle)
Analysis of key features in Next.js 16 preview released by Vercel. 'Zero Bundle' architecture that sends no JavaScript and improved Server Actions.
In December 2025, the preview version of Next.js 16 was finally released. If Next.js 15 focused on Stability, this version 16 pursues Extreme Performance.
As a Frontend Lead, I installed the beta version myself and summarized 3 key changes that can be felt in practice. In particular, I examine intensively how the concept of Zero Bundle was implemented.
1. Zero Bundle: HTML is Back
The era of downloading hundreds of kilobytes of JS files to launch a React app is over. Next.js 16 has pushed the philosophy of sending no JS to the client as much as possible to the extreme.
1.1 Server-Only State Machine
Previously, to use useState, you had to switch to a client component (use client) unconditionally. However, in Next.js 16, UI logic like simple toggles or tab switching is converted into pre-calculated CSS and HTML attributes on the server.
// Next.js 16: Tab component working without JS (Compile time optimization)
export default function Tabs() {
// Not included in client JS bundle!
// Automatically converted to pure HTML Checkbox Hack or Popover API
return (
<ServerToggle>
<Tab title="A">Content A</Tab>
<Tab title="B">Content B</Tab>
</ServerToggle>
);
}
As a result, the size of JavaScript downloaded by the browser can be 0KB. This dramatically shortens TTI (Time to Interactive).
2. Improved Server Actions: More Than Just Forms
When Server Actions first came out, they were merely for replacing API routes. But in version 16, real-time bidirectional communication has become possible.
2.1 Streaming Actions
While a server action is executing, progress can be streamed to the client.
async function processData() {
'use server';
const stream = createStream();
// 10% progress.. 50% progress..
// Transmitted via HTTP streaming without separate WebSocket server
await longRunningTask(stream);
}
Now, when processing long tasks like file uploads or AI response generation, you can implement a progress bar without complex WebSocket settings.
3. Turbopack Stable: Now It’s Truly Fast
Turbopack, which had been in beta since Next.js 13, has finally become a Stable version.
- 700x vs Webpack: It’s not an exaggeration. HMR (Hot Reloading) speed in large-scale monorepo environments has become noticeably faster.
- Memory Usage: Thanks to being written in Rust, memory usage during build has dropped to less than half. It is also a great help in reducing CI/CD pipeline costs.
4. Completion of Partial Prerendering (PPR)
The distinction between Static and Dynamic pages has disappeared. PPR (Partial Prerendering), where the header is rendered statically (build time) and the shopping cart is rendered dynamically (runtime) within a single page, is activated by Default.
Developers no longer need to worry about options like export const dynamic = 'force-dynamic'. The framework analyzes the code and automatically selects the optimal rendering strategy.
5. Conclusion: Has What We Need to Learn Decreased?
Paradoxically, Next.js 16 has evolved in a direction that reduces what developers need to know. Because the framework takes care of optimization, caching, and bundling settings.
We can now focus more on what value to give to users rather than spending time modifying next.config.js. Web development in 2026 will be more pleasant than ever.