🤖
Next.js + SWRでSSG or SSRとCSRを組み合わせて使用する
はじめに
表題通り、Next.js + SWRでSSG or SSRとCSRを組み合わせて使用する方法について書いていこうと思います。
SEOなどのためにSSG or SSRでプリレンダリングはしておきたいが、その後はCSRでデータを更新したい、といったユースケースを想定しています。
SSG/SSR/CSRについて詳しく知りたい方はこちらの記事もご一読ください。
TL;DR
getStaticProps
or getServerSideProps
で取得した値をSWRConfig
のvalue
のfallback
オプションに渡すことで、data
が空である初期表示時はgetStaticProps
or getServerSideProps
で取得した値にfallbackしてくれます。
実装例
export async function getStaticProps () {
// `getStaticProps` is executed on the server side.
const article = await getArticleFromAPI()
return {
props: {
fallback: {
'/api/article': article
}
}
}
}
function Article() {
// `data` will always be available as it's in `fallback`.
const { data } = useSWR('/api/article', fetcher)
return <h1>{data.title}</h1>
}
export default function Page({ fallback }) {
// SWR hooks inside the `SWRConfig` boundary will use those values.
return (
<SWRConfig value={{ fallback }}>
<Article />
</SWRConfig>
)
}
※こちらの実装例はSWRのドキュメントに記載されているものです。
-
getStaticProps
で値を取得し、useSWRの第一引数に渡すkey: 取得した値
の形式でfallbackオプションをPageコンポーネントに渡す - Pageコンポーネントで
SWRConfig
のvalue
に受け取ったfallbackオプションを渡す -
useSWR
の第一引数にfallbackオプションで定義したkeyを渡す
このようにすることでdata
が空である初期表示時はgetStaticProps
で取得した値にfallbackしてくれます。
ここからさらに条件付きフェッチを使用することで初期表示時はgetStaticProps
で取得した値を使用し、その後はCSRで取得した値を使用することができます。
fallbackオプションで定義するkeyにarray
やfunction
を指定したい場合はunstable_serialize
を使用します。
import useSWR, { unstable_serialize } from 'swr'
export async function getStaticProps () {
const article = await getArticleFromAPI(1)
return {
props: {
fallback: {
// unstable_serialize() array style key
[unstable_serialize(['api', 'article', 1])]: article,
}
}
}
}
function Article() {
// using an array style key.
const { data } = useSWR(['api', 'article', 1], fetcher)
return <h1>{data.title}</h1>
}
export default function Page({ fallback }) {
return (
<SWRConfig value={{ fallback }}>
<Article />
</SWRConfig>
)
}
おわりに
このようにすることでNext.js + SWRでSSG or SSRとCSRを組み合わせて使用することができます。
ユースケースはそこまで多くはないかもしれませんが、お役に立てれば幸いです。
それではよいNext.jsライフを!
Discussion