getStaticPaths
是Next.js的一个静态生成API,它用于在构建时确定哪些页面需要被预渲染。它需要返回一个包含params
属性的对象数组,其中每个对象都代表一个路径参数集合,可以被预渲染为一个静态页面。如果所有参数都已知,它们将被硬编码到页面中,否则Next.js将根据路径参数动态生成HTML页面。
fallback
属性用于控制在未预渲染页面时的行为。它有三个可能的值:
-
true
:表示所有未定义的页面将在第一次访问时被预渲染,此时页面的Props中可能不包含任何数据。同时Next.js将生成一个"fallback"版本的页面作为占位符,一旦数据可用,将自动替换为实际的预渲染版本。此选项适用于具有大量静态页面的站点,并且可以提高构建性能和页面访问速度。 -
false
:表示如果页面未预渲染,则显示404页面。此选项适用于需要确保所有页面都是预渲染的站点。“
blocking
”:表示如果页面未预渲染,则在服务端预渲染所有页面后才返回响应。此选项适用于具有大量页面的站点,并且在访问这些页面时无法使用客户端预渲染(SSR)。请注意,
fallback
属性的默认值为false
,这意味着如果未提供任何值,则不允许未预渲染的页面。因此,如果您需要使用fallback,则必须显式设置该值为true
或"blocking
"。
总之,getStaticPaths
允许您确定哪些页面需要在构建时进行预渲染,而fallback
允许您控制在第一次访问时未预渲染页面的行为。这些函数可以一起使用来构建一个强大的静态站点,同时提高性能和用户体验。
incremental static regeneration (ISR)
Incremental Static Regeneration (ISR)
是 Next.js 的一项功能,它允许你在不重新生成整个页面的情况下更新部分页面内容。与传统的静态生成方式不同,ISR 可以为你的应用程序带来更快的响应速度和更好的用户体验,同时还可以减少服务器的负载。
使用 ISR 的步骤如下:
- 在页面组件中使用 getStaticProps 函数来获取页面的数据,并将其传递给页面组件进行渲染。在 getStaticProps 中,你需要指定页面的
revalidate
参数来启用ISR
,这个参数定义了页面在被重新生成之前需要等待多长时间,单位为秒。例如,如果你将revalidate
设置为10
,那么 Next.js 将在页面被请求后的 10 秒内重新生成页面。
export const getStaticProps = async () => {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return {
props: {
data,
},
revalidate: 10, // 页面将在 10 秒后被重新生成
};
};
- 在页面组件中,使用
fallback: true
参数指定该页面是动态生成的,并且需要在第一次访问时生成。如果你有很多页面需要动态生成,可以使用fallback: 'blocking'
参数指定页面是以阻塞方式生成的,这意味着在第一次访问时,页面将等待生成完成后再显示。这种方式可以避免在多个并发请求下同时生成页面的问题。
export const getStaticPaths = async () => {
const res = await fetch('https://api.example.com/slugs');
const slugs = await res.json();
const paths = slugs.map((slug) => ({
params: {
slug,
},
}));
return {
paths,
fallback: true, // 页面将在第一次访问时生成
};
};
- 在 Next.js 中,你可以使用
getStaticProps
和getStaticPaths
函数来实现动态路由和 ISR。这两个函数可以为每个页面提供静态生成和数据获取的能力,而且它们非常易于使用和配置。