getStaticProps
如果你从页面导出一个名为 getStaticProps(静态站点生成)的函数,Next.js 将在构建时使用 getStaticProps 返回的 props 预渲染此页面。
- TypeScript
- JavaScript
pages/index.tsx
import type { InferGetStaticPropsType, GetStaticProps } from 'next'
type Repo = {
name: string
stargazers_count: number
}
export const getStaticProps = (async (context) => {
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const repo = await res.json()
return { props: { repo } }
}) satisfies GetStaticProps<{
repo: Repo
}>
export default function Page({
repo,
}: InferGetStaticPropsType<typeof getStaticProps>) {
return repo.stargazers_count
}
pages/index.js
export async function getStaticProps() {
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const repo = await res.json()
return { props: { repo } }
}
export default function Page({ repo }) {
return repo.stargazers_count
}
请注意,无论渲染类型如何,任何
props都将传递给页面组件,并且可以在初始 HTML 中在客户端查看。这是为了允许页面正确水合。确保你不要在props中传递任何不应在客户端可用的敏感信息。
getStaticProps API 参考涵盖了可以与 getStaticProps 一起使用的所有参数和 props。
何时应该使用 getStaticProps?
在以下情况下你应该使用 getStaticProps:
- 渲染页面所需的数据在构建时在用户请求之前就可用
- 数据来自无头 CMS
- 页面必须预渲染(用于 SEO)并且要非常快 ——
getStaticProps生成HTML和JSON文件,两者都可以被 CDN 缓存以提升性能 - 数据可以公开缓存(不是特定于用户的)。在某些特定情况下,可以通过使用中间件重写路径来绕过此条件。
getStaticProps 何时运行
getStaticProps 始终在服务器上运行,永远不会在客户端运行。你可以使用这个工具验证 getStaticProps 内编写的代码是否从客户端打包中移除。
getStaticProps始终在next build期间运行- 使用
fallback: true时,getStaticProps在后台运行 - 使用
fallback: blocking时,getStaticProps在初始渲染之前被调用 - 使用
revalidate时,getStaticProps在后台运行 - 使用
revalidate()时,getStaticProps在后台按需运行
当与增量静态再生成结合使用时,getStaticProps 将在后台运行,同时重新验证旧页面,并向浏览器提供新页面。
getStaticProps 无法访问传入的请求(例如查询参数或 HTTP 头),因为它生成静态 HTML。如果你需要为页面访问请求,请考虑在 getStaticProps 之外使用中间件。
使用 getStaticProps 从 CMS 获取数据
以下示例展示了如何从 CMS 获取博客文章列表。
- TypeScript
- JavaScript
pages/blog.tsx
// posts 将在构建时由 getStaticProps() 填充
export default function Blog({ posts }) {
return (
<ul>
{posts.map((post) => (
<li>{post.title}</li>
))}
</ul>
)
}
// 此函数在构建时在服务端被调用。
// 它不会在客户端被调用,因此你甚至可以执行
// 直接的数据库查询。
export async function getStaticProps() {
// 调用外部 API 端点来获取文章。
// 你可以使用任何数据获取库
const res = await fetch('https://.../posts')
const posts = await res.json()
// 通过返回 { props: { posts } },Blog 组件
// 将在构建时接收 `posts` 作为 prop
return {
props: {
posts,
},
}
}
pages/blog.js
// posts 将在构建时由 getStaticProps() 填充
export default function Blog({ posts }) {
return (
<ul>
{posts.map((post) => (
<li>{post.title}</li>
))}
</ul>
)
}
// 此函数在构建时在服务端被调用。
// 它不会在客户端被调用,因此你甚至可以执行
// 直接的数据库查询。
export async function getStaticProps() {
// 调用外部 API 端点来获取文章。
// 你可以使用任何数据获取库
const res = await fetch('https://.../posts')
const posts = await res.json()
// 通过返回 { props: { posts } },Blog 组件
// 将在构建时接收 `posts` 作为 prop
return {
props: {
posts,
},
}
}
getStaticProps API 参考涵盖了可以与 getStaticProps 一起使用的所有参数和 props。