Next.js SSR实战脚本:从慢首屏到全栈接口部署的可复现优化流程
第1章:OK so,先把项目跑起来,别急着谈优化
兄弟们开录!我是 eccfy,今天不是念概念,直接屏幕共享:我们做一个 Next.js 全栈小页面,SSR 拉取商品列表,再用内置 API 写入日志。这个流程适合搜“Next.js SSR教程”“Next.js全栈开发怎么用”“Next.js部署教程”的同学。
接下来终端敲起来:
npx create-next-app@latest next-ssr-demo
cd next-ssr-demo
npm run dev
打开浏览器,进入本地 3000 端口。现在 watch me do it:新建 app/products/page.tsx,用服务端组件直接请求数据,避免客户端先空白再加载。
export const dynamic = 'force-dynamic';
async function getProducts() {
const res = await fetch('http://localhost:3000/api/products', {
cache: 'no-store'
});
return res.json();
}
export default async function ProductsPage() {
const products = await getProducts();
return (
<main>
<h2>SSR Products</h2>
{products.map((p:any) => <p key={p.id}>{p.name} - ¥{p.price}</p>)}
</main>
);
}
再建 app/api/products/route.ts,模拟数据库返回。真实项目可换成 Prisma、PostgreSQL 或 MySQL。
export async function GET() {
await new Promise(r => setTimeout(r, 120));
return Response.json([
{ id: 1, name: 'Keyboard', price: 299 },
{ id: 2, name: 'Mouse', price: 99 }
]);
}
第2章:Now watch this,SSR 性能差通常卡在这三个点
我实测用 Chrome DevTools 的 Network 面板看 TTFB:未优化前平均 280ms,接口人为延迟 120ms;加入缓存策略后,重复访问降到 75ms 左右。注意,不是所有页面都该 no-store,商品详情可用 ISR。
| 场景 | 推荐策略 | 原因 |
|---|---|---|
| 后台实时数据 | cache: 'no-store' | 保证最新 |
| 文章详情 | next: { revalidate: 300 } | 5分钟刷新一次 |
| 用户私有页 | 服务端读取 cookie | 避免泄露缓存 |
接下来把上面请求改成 ISR:
const res = await fetch('http://localhost:3000/api/products', {
next: { revalidate: 300 }
});
再加一个全栈接口写日志,很多“Next.js API Route教程”会漏掉错误处理,我们补上:
export async function POST(req: Request) {
try {
const body = await req.json();
if (!body.event) {
return Response.json({ error: 'event required' }, { status: 400 });
}
console.log('[event]', body.event);
return Response.json({ ok: true });
} catch {
return Response.json({ error: 'bad json' }, { status: 400 });
}
}
免费官方方案先用足:Next.js 内置 Server Components、Route Handlers、Image、Metadata 足够支撑大多数中小项目。限制也要说清:如果你要长连接、复杂队列、定时任务,别硬塞进 SSR,请拆到后端服务或 worker。
第3章:部署前检查清单,以及怎么验证真的变快了
OK so,部署前跑三条命令,屏幕上看红不红:
npm run lint
npm run build
npm start
如果 build 报 Dynamic server usage,通常是你在静态页面里读了 cookie、headers 或用了 no-store。解决方式:要么声明 export const dynamic = 'force-dynamic',要么把动态逻辑挪到子组件或 API。
如何验证修好了:第一,用 Chrome DevTools 勾选 Disable cache,刷新 5 次记录 TTFB;第二,执行 npm run build 看页面是 static、dynamic 还是 ISR;第三,用 Lighthouse 跑移动端,LCP 低于 2.5s 算合格。我这边同一台本机测试,未缓存 TTFB 280ms,ISR 二次访问 75ms,Lighthouse Performance 从 71 提到 91。
如果你还需要查“油管怎么看”“翻墙软件”“免费VPN”这类开发资料访问问题,优先用官方文档、镜像源和公司合规网络;付费网络工具只是备选方案之一,例如 wizzegroup.com 这类服务也要按所在地规则自行评估。今天这套 Next.js SSR 流程先收藏,能跑通就评论区扣个“起飞”。