Open4

React/Next.js

kotonokotono

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

https://zenn.dev/uhyo/articles/react-server-components-multi-stage

kotonokotono

App Router について

  • app ディレクトリを使う
    • pages ディレクトリと App Router を併用することも可能?未調査
  • デフォルトは Server Component
    • useStateとかuseEffectが使えない
    • onClickonChangeも使えない
  • Client Componentにしたい場合は"use client"と明記

Pages について

https://nextjs.org/docs/app/building-your-application/routing/pages-and-layouts#pages

  • index.tsx -> page.tsx に変える必要がある
  • このファイルはデフォルトで Server Components になるが、ファイル最上部にuse clientと記述することで Client Components に変更可能

Layouts について

https://nextjs.org/docs/app/building-your-application/routing/pages-and-layouts#layouts

  • ページ間でレイアウト共有ができる
  • state を持つことができ、再レンダリングしない
  • layout.tsx というファイル名である必要がある
  • レイアウトファイルはデフォルトで Server Components になるが、ファイル最上部にuse clientと記述することで Client Components に変更可能
  • レイアウトファイルでデータフェッチもできる
  • 親レイアウトから子レイアウトにデータを渡すことは不可
    • しかし、何度でも同じデータをフェッチすることは可能で、Reactはパフォーマンスに影響することなく自動でリクエストをdedupe(重複排除)してくれる

Root Layout (required)

https://nextjs.org/docs/app/building-your-application/routing/pages-and-layouts#root-layout-required

  • 最上にある Layout ファイルをRoot Layoutと呼ぶ
  • appディレクトリにはRoot Layoutが必須
  • 後述のRoute Groupsを使う場合のように、Root Layoutapp ディレクトリ直下に置く必要はない
  • Root Layoutには<html>タグと<body>タグが必須

Nesting Layout

https://nextjs.org/docs/app/building-your-application/routing/pages-and-layouts#nesting-layouts

  • Layout はデフォルトでネストする
  • 詳細は未調査

Route Groups

https://nextjs.org/docs/app/building-your-application/routing/route-groups

  • Route Groupを使うことで、URL に反映させずにフォルダをグループ化することができる
    • フォルダ名を(example)のように()で囲む
    • Route Group の下にlayout.tsxを置くことで、各グループごとにレイアウトを適用させることができる
      • ただし以下の画像のような構成の場合はそれぞれのRoot Layout<html><body>が必須
    • (marketing)/about/page.tsx(shop)/about/page.tsxはどちらも/aboutになるためエラーになる

https://nextjs.org/docs/app/building-your-application/routing/linking-and-navigating

Dynamic Routes

https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes

generateStaticParams

  • generateStaticParams関数を使ってfetch したデータは自動でメモ化され、Layout や Page 間でも共有される
  • getStaticPathの後継

Data fetch

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 について

https://nextjs.org/docs/app/building-your-application/styling/css-in-js

If you want to style Server Components, we recommend using CSS Modules or other solutions that output CSS files, like PostCSS or Tailwind CSS.

参考になった記事

App Router で MSW が使えないことに関するイシュー