Open4
React/Next.js

React Server Components について
- React Server Components はある種の多段階計算である
- stage 0 と stage 1 が誕生
- これまではデフォルトが stage 1 だったが、stage 0 がデフォルトに
- stage 0 はステートがない (= useState が使えない)
- stage 1 のファイルには
"use client"
と記述する必要がある - サーバーとクライアントがそれぞれ何を実行するかは以下
サーバー側 | クライアント側 | |
---|---|---|
従来型(SSRなし) | - | stage 1 |
従来型(SSRあり) | stage 1 | stage 1 |
RSC(SSRなし) | stage 0 | stage 1 |
RSC(SSRあり) | stage 0 + stage 1 | stage 1 |

App Router について
-
app
ディレクトリを使う-
pages
ディレクトリと App Router を併用することも可能?未調査
-
- デフォルトは Server Component
-
useState
とかuseEffect
が使えない -
onClick
やonChange
も使えない
-
- Client Componentにしたい場合は
"use client"
と明記
Pages について
-
index.tsx
->page.tsx
に変える必要がある - このファイルはデフォルトで Server Components になるが、ファイル最上部に
use client
と記述することで Client Components に変更可能
Layouts について
- ページ間でレイアウト共有ができる
- state を持つことができ、再レンダリングしない
-
layout.tsx
というファイル名である必要がある - レイアウトファイルはデフォルトで Server Components になるが、ファイル最上部に
use client
と記述することで Client Components に変更可能 - レイアウトファイルでデータフェッチもできる
- 親レイアウトから子レイアウトにデータを渡すことは不可
- しかし、何度でも同じデータをフェッチすることは可能で、Reactはパフォーマンスに影響することなく自動でリクエストをdedupe(重複排除)してくれる
Root Layout (required)
- 最上にある Layout ファイルを
Root Layout
と呼ぶ -
app
ディレクトリにはRoot Layout
が必須 - 後述の
Route Groups
を使う場合のように、Root Layout
はapp
ディレクトリ直下に置く必要はない -
Root Layout
には<html>
タグと<body>
タグが必須
Nesting Layout
- Layout はデフォルトでネストする
- 詳細は未調査
Route Groups
-
Route Group
を使うことで、URL に反映させずにフォルダをグループ化することができる- フォルダ名を
(example)
のように()で囲む - Route Group の下に
layout.tsx
を置くことで、各グループごとにレイアウトを適用させることができる- ただし以下の画像のような構成の場合はそれぞれの
Root Layout
に<html>
と<body>
が必須
- ただし以下の画像のような構成の場合はそれぞれの
-
(marketing)/about/page.tsx
と(shop)/about/page.tsx
はどちらも/about
になるためエラーになる
- フォルダ名を
Link と useRouter について
usePathname()
-
scroll
オプションをつけることで<Link>
を押下したときやrouter.push
した際にページ位置を維持することが可能 -
useRouter()
は Client Component のみで使用可能 - 公式ドキュメントは特別な理由がない限り
useRouter
じゃなくて<Link>
を使うことを推奨Recommendation: Use the <Link> component to navigate between routes unless you have a specific requirement for using useRouter.
Dynamic Routes
generateStaticParams
-
generateStaticParams
関数を使ってfetch したデータは自動でメモ化され、Layout や Page 間でも共有される -
getStaticPath
の後継
Data fetch
-
getServerSideProps
をasync/await
に書き換える必要がある
async function getData() {
const res = await fetch('https://api.example.com/...')
// The return value is *not* serialized
// You can return Date, Map, Set, etc.
if (!res.ok) {
// This will activate the closest `error.js` Error Boundary
throw new Error('Failed to fetch data')
}
return res.json()
}
export default async function Page() {
const data = await getData()
return <main></main>
}
CSS について
- Servere Component では CSS in JS がサポートされていない
- CSS in JSが使いたければ Client Component にする必要がある
- Emotion は Client Component でもまだサポートされていない https://github.com/emotion-js/emotion/issues/2928
If you want to style Server Components, we recommend using CSS Modules or other solutions that output CSS files, like PostCSS or Tailwind CSS.
参考になった記事
- 公式ドキュメント
- Next.js 13 app directory で記事投稿サイトを作ってみよう
- Next.js App Router (app ディレクトリ) の逆引き辞典
- App Router時代のデータ取得アーキテクチャ
App Router で MSW が使えないことに関するイシュー

react-use
useGetSet
- ネストしたファンクションでうまくステートが更新されないバグを回避できる