next.js 13+ 的 app router 不再支持 `getserversideprops`,而是通过原生异步 server components 直接在组件内执行服务端逻辑,本文详解迁移方法、正确写法及关键注意事项。
在 Next.js 的新 App Router(即 app/ 目录结构)中,getServerSideProps、getStaticProps 和 getInitialProps 等传统数据获取函数已被完全移除。这是设计上的根本性转变:App Router 基于 React Server Components(RSC),允许你直接在默认导出的 async 页面组件中编写服务端代码,无需特殊钩子或约定函数。
✅ 正确做法:将数据获取逻辑直接写入页面组件内部,并声明组件为 async:
// app/blah/page.tsx
type Repo = {
name: string;
stargazers_count: number;
};
export default async function Page() {
try {
const res = await fetch('https://api.github.com/repos/vercel/next.js', {
// 显式标记为服务端请求(避免被客户端重用)
cache: 'no-store', // 或 'force-cache' / 'default'
next: { revalidate: 60 }, // App Router 特有:每 60 秒重新验证(仅适用于 fetch + cache: 'force-cache')
});
if (!res.ok) {
throw new Error(`HTTP ${res.status}: ${res.statusText}`);
}
const repo: Repo = await res.json();
return Stargazers: {repo.stargazers_count};
} catch (error) {
console.error('Failed to fetch repo:', error);
return ⚠️ 数据加载失败,请稍后重试;
}
}? 关键
要点说明:
⚠️ 注意事项:
简言之:App Router 的数据获取 = async page component + 内联 fetch + 类型守卫 + 错误边界。拥抱这一范式,即可获得更简洁、更可控、更符合 React 演进方向的服务端渲染体验。