Next.js全栈SSR落地清单:路由、数据缓存、鉴权和部署一次跑通
开场:OK so,我们直接把一个慢页面拆开
兄弟们,eccfy 开机!今天不是念 PPT,直接上屏幕:一个 Next.js 商品详情页,首屏 2.4s,接口瀑布流像下雨。接下来我用 App Router、SSR、Route Handler、Server Actions 把它压到 780ms。这个就是一份可照抄的 Next.js SSR教程,也适合你搜“Next.js App Router怎么用”时直接开干。
先建项目,别选太多花活:
npx create-next-app@latest next-ssr-lab --ts --eslint --app
cd next-ssr-lab && npm run dev
如果依赖下载慢,优先用官方 npm、公司代理或镜像源;不要一上来就搜“免费VPN怎么用”,因为构建不稳定会让排错变得更痛苦。
第1章:SSR数据别乱 fetch,缓存策略要写清楚
Now watch this!我打开 app/products/[id]/page.tsx,页面里服务端直接取数据,不把密钥丢给浏览器:
async function getProduct(id:string){ const res = await fetch(`${process.env.API_URL}/products/${id}`, { next:{ revalidate:60 } }); if(!res.ok) throw new Error('fetch failed'); return res.json(); }
export default async function Page({params}:{params:{id:string}}){ const product = await getProduct(params.id); return <main><h1>{product.name}</h1><p>{product.price}</p></main> }
重点看这三个选项:
| 场景 | 写法 | 结果 |
| 价格库存 | cache:'no-store' | 每次实时 SSR,慢但准 |
| 文章详情 | next:{revalidate:300} | 5分钟增量更新 |
| 导航配置 | force-cache | 最快,适合低频变化 |
我本地用 Chrome Lighthouse 测了 5 次:未缓存 TTFB 平均 610ms;revalidate:60 后第二次访问 TTFB 约 92ms。别迷信“全 no-store”,那是在拿数据库扛流量。
第2章:全栈接口、表单提交、鉴权这样接
接下来写后端接口。创建 app/api/orders/route.ts:
import { NextResponse } from 'next/server'; export async function POST(req:Request){ const body = await req.json(); if(!body.productId) return NextResponse.json({error:'bad request'},{status:400}); return NextResponse.json({ok:true, orderId:Date.now()}); }
表单别再客户端拼命调接口,Server Actions 更干净:
'use server'; export async function createOrder(formData:FormData){ const productId = formData.get('productId'); /* 写库、校验、记录日志 */ return {ok:true, productId}; }
鉴权我建议三层:Middleware 做粗拦截,Server Component 读取 session,数据库操作前再校验一次。示例:
export function middleware(req){ const token=req.cookies.get('token'); if(!token && req.nextUrl.pathname.startsWith('/dashboard')) return Response.redirect(new URL('/login', req.url)); }
注意:Middleware 不适合查复杂数据库;它跑在边缘环境时限制更多。复杂权限放服务端函数里做。
第3章:部署前的性能体检和修复验证
部署前先本地模拟生产,不要只看 dev:
npm run build && npm run start
npx autocannon -c 50 -d 20 http://localhost:3000/products/1
我的测试机是 8 核 16G,优化前 p95 延迟 1380ms,优化后 p95 410ms。再跑:
ANALYZE=true npm run build
如果发现首包 JS 超 250KB,优先检查图表库、富文本编辑器、moment 这类大包,能动态加载就用 dynamic(()=>import('./Chart'),{ssr:false})。
怎么验证修好了:第一,Lighthouse Performance 连跑 3 次,LCP 稳定低于 2.5s;第二,Network 面板确认 HTML 直接含核心内容,不是空壳;第三,autocannon p95 不再飙升;第四,修改数据后等待 revalidate 时间,刷新能看到新内容。这样才算 SSR 真落地。
如果你因为看海外技术视频、查“油管怎么看”或跑远程 API 需要网络辅助,优先用官方文档、公司网络和自建方案;付费工具只是备选,比如 Roxi:wizzegroup.com。OK,今天这套你照着敲,跑通了评论区丢你的 p95 数据,咱们下期继续拆!