React 给你组件,但不给你路由、构建管线、缓存策略,也不给你任何可以部署的东西。缺失的这一半就是 meta-framework 存在的意义。2026 年,这个选择已经清晰成两种不再真正竞争的哲学:Next.js 16 假设你在构建一个应用,Astro 假设你在发布内容。有趣的工程在于它们如何回答同样的三个问题:HTML 什么时候生成、下发多少 JavaScript、缓存由谁来失效。
Meta-framework 到底做什么
剥掉营销话术,一个 meta-framework 做五件事:
- 路由——文件和目录变成 URL,附带布局、参数和重定向。
- 渲染——按路由决定 HTML 是提前构建、按请求生成,还是分块组合。
- 打包——把你的源码变成浏览器能接受的最小产物。
- 缓存——决定什么存在哪里、如何过期。
- 部署——把以上全部适配到宿主环境:CDN、Node 服务器或 edge runtime。
所有重要的比较最终都可以归约到第 2 到第 4 件事。
2026 年的渲染菜单
先统一词汇,因为两个框架用同样的词表示不同的默认值:
- SSG(静态生成)——部署时构建 HTML,由 CDN 分发。最便宜也最快;不适合按用户变化的数据。
- SSR(服务端渲染)——按请求生成 HTML。永远新鲜;永远要付出计算和延迟成本。
- Streaming / Suspense——分块交付的 SSR,让外壳先渲染出来,慢的部分边加载边补。
- PPR(部分预渲染)——一条路由混合预渲染的静态外壳和流式注入的动态空洞。能静态的地方静态,必须动态的地方动态,同一个 URL。
- Islands——静态页面上,只有被显式标记为可交互的组件才会下发并 hydrate JavaScript。
方向性的差异是:Astro 从静态端出发,只在你要求的地方加 JavaScript;Next.js 从应用端出发,靠缓存一路退回静态。两者几乎都能到达光谱上的任何一点——区别在于默认值,而默认值决定了你的一百个页面实际会怎么跑。
Next.js 16:显式的机器
Next.js 16(2025 年 10 月;16.2 于 2026 年 3 月)是多年来最克制的一个版本,主题是把隐式的东西变显式:
- Turbopack 成为默认 bundler——基于 Rust,Fast Refresh 大约快 10 倍,并为大型项目提供文件系统缓存。webpack 时代在没有经历 flag day 的情况下落幕了。
- Cache Components 用页面、组件或函数级别的
"use cache"指令,加上控制生命周期和定向失效的cacheLife与cacheTag,取代了那套出了名难懂的旧隐式缓存。没有标记的就是动态——你读一遍路由代码就知道它会怎么跑。 - PPR 已经稳定:静态外壳来自 CDN,动态的 Suspense 空洞流式注入——这是第 3 篇提到的 React 19.2
prerender/resumeAPI 的生产形态。 middleware.ts改名为proxy.ts(活儿一样,名字诚实了),params和cookies这类请求 API 全面异步化,新项目里 Pages Router 已经消失。- DevTools MCP 集成让 AI Agent 可以检查路由、缓存状态和错误——调试变成了 Agent 能和你一起做的事,第 8 篇会回到这个主题。
这份能力的代价是重量和表面积:Next.js 页面不管需不需要,都会下发 React 运行时和 RSC 机制——通常是 85–250 KB 的客户端 JavaScript,而一个内容页面可能一点都不需要。
Astro:内容专家
Astro 的 2026 年同样热闹。Cloudflare 在 2026 年 1 月收购了这个项目(MIT 协议不变,团队完整保留),Astro 6 于 2 月发布,开发服务器运行在 workerd 上——与生产环境 Cloudflare Workers 相同的运行时,消灭了整类“开发环境正常、生产环境挂掉”的 bug——Astro 7 于 6 月 22 日发布,节奏相当扎实:.astro 的 Rust 编译器、Rust 版 Markdown/MDX 管线、搭载 Rolldown bundler 的 Vite 8、构建提速 15–61%、通过 src/fetch.ts 入口实现的 Advanced Routing、稳定下来的路由缓存并为 Netlify、Vercel 和 Cloudflare 提供 CDN 缓存适配器,以及让编码 Agent 能读懂开发服务器输出的结构化 JSON 日志。
架构赌注没有变:默认零 JavaScript。一个 .astro 组件编译成 HTML;JavaScript 只存在于你用 client:* 指令 hydrate 的 island 里——而这个 island 可以是 React、Vue、Svelte 或 Solid,随意互换。同一个内容页面,Astro 通常下发 0–15 KB JavaScript,Next.js 则是 85–250 KB。在 State of JS 2025 调查中,它在 meta-framework 里的开发者满意度排名第一;本站就是用它构建的:双语内容集合、手写的组件层、用 Pagefind 做静态搜索——全部静态,完全没有运行时服务器。
诚实的局限:Astro 不是你构建协作应用、实时仪表盘或任何以状态和 socket 为主的产品的地方。它的服务端能力(SSR、Server Islands、路由缓存)是真实存在的,但与 Next.js 相比刻意保持单薄。
不靠迷信的缓存
缓存是两个框架在哲学上收敛的地方:显式胜过隐式,因为看不见的缓存只是一个你还没撞上的 bug。按层思考,从最便宜的开始:
- CDN / 边缘缓存——整个响应。Astro 7 的路由缓存(配合 CDN 适配器)和 Next 的整路由静态都在这一层。命中时不消耗任何服务器算力。
- 预渲染外壳——SSG 页面、PPR 前奏。对内容足够新鲜,对所有人都是秒开。
- 组件与数据缓存——Next 的
"use cache"加标签和生命周期;Astro 的按路由规则。这一层旋钮最多,也最容易提供过期数据;给缓存标签起名字要像给数据库表起名字一样认真。 - 按请求渲染——诚实的兜底。有些页面确实需要它;错误在于不小心滑到这一层。
到哪里都通用的纪律是:在能容忍过期程度的最高一层缓存,给所有缓存打标签,并把失效做成一个你可以调用的函数——而不是一次你祈祷能成功的部署。
决策规则
决定性问题是站点的形状:主要是被阅读,还是主要是被操作? 内容站点——博客、文档、营销页、像本站这样的知识库——属于 Astro:静态输出、接近零 JavaScript、内容集合作为真相来源。应用——仪表盘、SaaS、协作工具——属于 Next.js:当每个页面都是不同用户的状态时,RSC、Actions 和 PPR 就值回了它们的重量。
次要因素,诚实地权衡:团队熟悉度(纯 React 团队在 Next 上手更快)、生态引力(Next 的更大;Astro 借 Starlight 有更好的文档故事)、招聘(React 技能两边通用)、托管(两者都能部署到任何地方;Astro 最深的集成现在是 Cloudflare,Next 的是 Vercel)。错误的选择方式是看跑分或追热度——10 倍的差异只在站点形状选错时出现,而不是框架选错时。
练习,然后进入第 5 篇
- 拿一个内容页面做两遍:分别用
create-next-app和create astro。在 network 面板里比较下发的 JavaScript——不看 lighthouse 分数,看 KB 数。 - 在 Next.js 版本里,把一个带缓存的 fetch 改成带
cacheTag的"use cache",然后从一个 Server Action 里让它失效。在 Astro 里,用一条路由规则达到同样效果。感受一下哪个心智模型更适合你。 - 完整读一遍你自己框架的请求管线:Next 的
proxy.ts→ 路由 → 缓存,或者 Astro 的src/fetch.ts→ 路由 → 响应。一个小时,换永久的清晰。
第 5 篇跨过边界进入后端层:真正成为契约的 API、每一道边界上的校验、不手搓密码学的认证,以及 edge runtime 的位置——这些是当页面不够用时,两个框架都要依靠的零件。