Next.js 静态生成时怎么处理动态路由的数据获取?
我在用 Next.js 做一个博客,文章页是动态路由 /posts/[id].js,想用 SSG 静态生成,但不知道怎么在 getStaticProps 里拿到具体的 id。文档说要配合 getStaticPaths,但我试了还是报错。
我之前用 Vue 写类似功能是这样处理的:
<template>
<div>{{ post.title }}</div>
</template>
<script>
export default {
async asyncData({ params }) {
const post = await fetchPost(params.id)
return { post }
}
}
</script>
Next.js 里是不是也得提前把所有 id 列出来?那如果文章很多岂不是每次构建都要拉全量数据?
首先你得在动态路由页面里同时用
getStaticPaths和getStaticProps。重点来了:1.
getStaticPaths要返回所有可能的id列表,比如:2. 然后在
getStaticProps里就能拿到这个id了:你担心的问题确实存在 - 如果文章很多,构建时会拉取所有数据。有两个解决办法:
1) 如果内容不常更新,用增量静态生成(ISR),加个
revalidate参数2) 或者用
fallback: true,首次访问时才生成页面我上次项目用ISR解决的,这样构建时不用拉全部数据:
说实话Next.js这套API设计比Nuxt的
asyncData复杂点,但用习惯了还行。