目次
はじめに
ミーハーなので Next.js の versino13 を触って microCMS で Jamstack サイトを実装しているのですが、その中でいつも通りgetStaticProps
の中でデータを取得しようとした時にこんなエラーが出てしまいました。
./src/app/page.tsx
ReactServerComponentsError:
"getStaticProps" is not supported in app/. Read more: https://beta.nextjs.org/docs/data-fetching/fundamentals
まあ、エラーの文言通りでgetStaticProps
が app ディレクトリではサポートされていないんだな。ということがわかると思います。
では、app ディレクトリではどうやってデータを取得したらよいのでしょうか?
その辺りについて、今回の記事では解説していこうと思います!
結論から
それでは今回問題となっているNext.js の公式ドキュメントでgetStaticProps
について見てみましょう。
すると、こんなことが書いてありました。
コンポーネント レベルで同じ場所に配置されたデータフェッチをサポートしています。
なるほど。これまでは page ディレクトリ内でgetStaticProps
を使ってデータを取得していましたが、app ディレクトリを使うとコンポーネント単位でデータフェッチができるようになるみたいですね。
なので、結論としては page ディレクトリ内のgetStaticProps
ではなく各コンポーネント単位でデータを取得するようにしましょう。ということでした。
実際に使ってみると
今回は Jamstack のブログサイトでヘッダーに microCMS で設定したカテゴリーを一覧でメニューとして並べてみたいと思います!
import Link from 'next/link'
import { client } from 'src/lib/microcms/apis'
/**
* ここでmicroCMSからのデータを取得してきます
* */
const getData = async () => {
const res = await client.getList({ endpoint: 'categories' })
return res
}
/**
* ここで先ほどのgetDataを使ってメニューとして展開していきましょう
* */
export const Header = async () => {
const data = await getData()
const { contents } = data
return (
<header className={style.container}>
<nav>
<ul>
{contents.map((content) => (
<li key={content.id}>
<Link href={content.id}>{content.name}</Link>
</li>
))}
</ul>
</nav>
</header>
)
}
まあ、コードの通りではあるのですが、getData
でデータを取得してきてそれをコンポーネント内で使っていくという形になります。
あと、今回の本題ではないですが、13 になってから Link タグの下に a タグをつけなくてよくなりましたね。
app ディレクトリの今後
バックエンドエンジニアが Next.js の App Directory に夢を見るという記事でもお話されているように、これまでのようにコンポーネントが CSR であることがネックとなっていたところが、今回の app ディレクトリの採用によって SSR がデフォルトになるということで開発の生産性が上がったりもするのするのかな?というところで今後が楽しみになっています。
参考
- https://nextjs.org/docs/api-reference/data-fetching/get-static-props
- https://beta.nextjs.org/docs/data-fetching/fetching
- https://zenn.dev/karibash/articles/eaba1b51fc757e#data-fetching
- https://zenn.dev/nishiurahiroki/articles/7e61590892499b
- https://beta.nextjs.org/docs/data-fetching/caching
- https://blog.p1ass.com/posts/next-app-directory/
さいごに
React の Server Components によって、Next.js のバージョン 13 でのもデータの扱い方が変わったなんて話はバージョンがアップデートされた時に真っ先にみて『ふーーーん』なんて思った気がしたのですが、実際に触ってみないとわからないものですね。
今回の件で app ディレクトリのおもしろさに気が付くことができたので、今後のフレームワークの進化に期待しながら理解も深めていきたいなと思いました。