Notion blogのソースを見ていて、以下のような感じのコードがあったので、この「getStaticProps」っていつ実行されてるんだ?と思ったら、これはNext.js組み込みの関数のようで、ビルド時にデータを取得してくるようだ。
export async function getStaticProps({ preview }) {
const postsTable = await getBlogIndex()
const authorsToGet: Set<string> = new Set()
const posts: any[] = Object.keys(postsTable)
.map((slug) => {
const post = postsTable[slug]
// remove draft posts in production
if (!preview && !postIsPublished(post)) {
return null
}
post.Authors = post.Authors || []
for (const author of post.Authors) {
authorsToGet.add(author)
}
return post
})
.filter(Boolean)
const { users } = await getNotionUsers([...authorsToGet])
posts.map((post) => {
post.Authors = post.Authors.map((id) => users[id].full_name)
})
return {
props: {
preview: preview || false,
posts,
},
revalidate: 10,
}
}
const Index = ({ posts = [], preview }) => {
return (
<>
<Header titlePre="Blog" />
{preview && (
<div className={blogStyles.previewAlertContainer}>
<div className={blogStyles.previewAlert}>
<b>Note:</b>
{` `}Viewing in preview mode{' '}
<Link href={`/api/clear-preview`}>
<button className={blogStyles.escapePreview}>Exit Preview</button>
</Link>
</div>
</div>
)}
<div className={`${sharedStyles.layout} ${blogStyles.blogIndex}`}>
<h1>My Notion Blog</h1>
{posts.length === 0 && (
<p className={blogStyles.noPosts}>There are no posts yet</p>
)}
{posts.map((post) => {
return (
<div className={blogStyles.postPreview} key={post.Slug}>
<h3>
<span className={blogStyles.titleContainer}>
{!post.Published && (
<span className={blogStyles.draftBadge}>Draft</span>
)}
<Link href="/blog/[slug]" as={getBlogLink(post.Slug)}>
<a>{post.Page}</a>
</Link>
</span>
</h3>
{post.Authors.length > 0 && (
<div className="authors">By: {post.Authors.join(' ')}</div>
)}
{post.Date && (
<div className="posted">Posted: {getDateStr(post.Date)}</div>
)}
<p>
{(!post.preview || post.preview.length === 0) &&
'No preview available'}
{(post.preview || []).map((block, idx) =>
textBlock(block, true, `${post.Slug}${idx}`)
)}
</p>
</div>
)
})}
</div>
</>
)
}
export default Index
参考リンクより、
プリレンダリングのデータ取得に使える 3 つの特徴的な Next.js の関数についてお話します:
getStaticProps
(静的生成): ビルド時にデータ取得するgetStaticPaths
(静的生成): データに基づきプリレンダリングする動的ルートを特定するgetServerSideProps
(サーバーサイドレンダリング): リクエストごとにデータを取得する