在 Next.js 中,getStaticProps、getStaticPaths 和 getServerSideProps是用来处理页面数据获取的三个不同方法。
先来说一下概念:
方法执行时间
适用场景
优点
缺点
Static Site Generation (SSG) | 构建时(Build Time) | 适合内容固定或更新不频繁的页面,如博客、产品展示页 | 非常快的页面加载速度,优秀的 SEO 支持 | 构建后无法即时更新,更新后需要重新部署 |
Server-Side Rendering (SSR) | 每次请求时(Request Time) | 需要即时数据或个性化内容的页面,如电子商务、社交媒体 | 每次请求都能获取最新数据,适合需要动态内容的页面 | 速度较慢,会导致初次页面加载较慢,对伺服器负载较高 |
Incremental Static Regeneration (ISR) | 构建后且定时更新(Build Time + Revalidation) | 静态页面但需要定期更新的应用,如新闻网站、电子商务产品页 | 静态页面但可以定时更新内容,具备 SSG 的速度又能保持更新 | 需要指定重新验证间隔,过于频繁的更新可能会增加复杂性 |
再来说方法,
它们分别针对不同的场景进行数据加载。让我们逐一解释它们的作用和区别:
方法执行时间
什么时候使用?
优点
缺点
getStaticProps | 构建时 | 当页面内容不常更新且可在构建时确定 | 较快的页面加载速度,适合 SEO | 构建后无法立即反映数据变更 |
getStaticPaths | 构建时 | 搭配动态路由的静态页面生成 | 静态生成动态路径页面,结合 getStaticProps 使用 | 需要在构建时就知道所有的动态路径 |
getServerSideProps | 每次请求时 | 当需要实时数据或者页面需要个性化渲染 | 每次请求都能获取最新数据,适合需要动态内容的页面 | 较慢的页面加载速度,对服务器负担较大 |
import React from \'react\';
const Posts = ({ posts }) => (
<div>
<h1>Posts</h1>
<ul>
{posts.map(post => (
<li key={post.id}>{post.title}</li>
))}
</ul>
</div>
);
export async function getStaticProps() {
const res = await fetch(\'https://api.example.com/posts\');
const posts = await res.json();
return {
props: { posts }, // 传递到页面的 props
};
}
import React from \'react\';
const Post = ({ post }) => (
<div>
<h1>{post.title}</h1>
<p>{post.content}</p>
</div>
);
export async function getStaticPaths() {
const res = await fetch(\'https://api.example.com/posts\');
const posts = await res.json();
const paths = posts.map((post) => ({
params: { id: post.id.toString() },
}));
return { paths, fallback: false };
}
export async function getStaticProps({ params }) {
const res = await fetch(`https://api.example.com/posts/${params.id}`);
const post = await res.json();
return { props: { post } };
}
在这里,我们为每个 post.id 生成一个对应的静态页面。
// pages/dashboard.js
import React from \'react\';
const Dashboard = ({ data }) => (
<div>
<h1>Dashboard</h1>
<p>{data.info}</p>
</div>
);
export async function getServerSideProps() {
const res = await fetch(\'https://api.example.com/data\');
const data = await res.json();
return {
props: { data }, // 传递到页面的 props
};
}
概念 vs. 方法
SSG (Static Site Generation):
概念:在构建时生成静态页面,适合内容更新不频繁的网站。执行方法:使用 getStaticProps 和 getStaticPaths。getStaticProps 用于在构建时获取数据并生成静态页面。getStaticPaths 用于定义动态路径,以便静态生成这些路径的页面。
SSR (Server-Side Rendering):
概念:每次用户请求页面时,伺服器生成页面,适合需要实时数据的应用。执行方法:使用 getServerSideProps。getServerSideProps 用于在每次请求时获取数据并生成页面,确保用户获取的是最新的数据。
ISR (Incremental Static Regeneration):
概念:在构建时生成静态页面,并允许根据时间定期更新静态内容。执行方法:使用 getStaticProps,但加上 revalidate 属性。getStaticProps 用于初始生成静态页面,而 revalidate 参数指定了多久后页面会被重新生成,以获取最新数据。
总结
SSG、SSR 和 ISR 是三种不同的渲染方法,根据应用需求的不同选择使用。getStaticProps、getStaticPaths 和 getServerSideProps 是 Next.js 提供的函数,用于具体实现这些概念的渲染方法。它们决定了如何获取数据以及何时生成页面。