Routeについて
以下用語を抑える
Tree: 階層構造を視覚化するための規約。例えば、親コンポーネントと子コンポーネントから成るコンポーネントツリーやフォルダ構造などがあります。
Subtree: ツリーの一部で、新しいルート(最初)から葉(最後)までの部分です。
Root: ツリーまたはサブツリーの最初のノード、例えばルートレイアウトです。
Leaf: 子のないサブツリー内のノード、例えばURLパスの最後の Segmentです。
Segment: /で区切られたURLの一部
Path: ドメインのあとに続くURL文字列
Route Segment: 特定のpathに対応するsegment
next.jsではappディレクトリにpage.js(tsx)ファイルを配置することで簡単にページを表示できる
ナビゲーション
next.jsは画面遷移の際、変更されたRootSegmentのみが再レンダリングされる「ソフトナビゲーション」である
<Link>だけじゃないナビゲーション
useRouter Hookを使うと現在のルートに関する情報を取得したり、ユーザーの前後の履歴に遷移など、<Link>コンポーネントにできない様々なことができます
const router = useRouter()
// 現在のルートに関する情報を取得
const pathname = router.pathname
const query = router.query
const asPath = router.asPath
Server Component / Client Component
- server component: nextjsではデフォルト。サーバーサイドでのみ実行されるためコンポーネントのjsファイルがブラウザに送られることがなく、高パフォーマンス
- client component: 'use client'が宣言されたコンポーネンファイルをRootとしたSubtree全体で適用される
データ並列取得
const a = await ...
const b = await ...
↓
const [a,b] = await Promise.all([...,...])
直列より並列のほうがbetter
nextのfetch
- 動的データ:頻繁に更新されるデータ
- 静的データ:あまり更新されないデータ
静的データをキャッシュして高速にするため、next.jsのfetch関数は拡張されている。
デフォルトではキャッシュが残るので動的データにはfetchの第二引数にcache: "no-store"を指定する
静的・動的レンダリング
自動で静的レンダリングされるが、以下の条件で動的レンダリングされる
動的データ取得した場合(cache:no-cacheを適用)
動的関数の使用
→cookies()
→headers()
→searchParamsの使用
→useSearchParams()
ダイナミックルーティング
Dynamic Routes
[slug]で囲む
[...slug]で囲むとより深い階層のparamsも取れる
[[...slug]]とするとさらに囲む前のURLリクエストにも応じる
Route Groups
()でフォルダ分けする
それぞれにlayout.tsx(js)を適用できる
Parallel Routes
@folderというフォルダ名規約を使用(Slotという)
Slotはchildrenと同様にPropsとして渡される
Intercepting Routes
parallel routesで(.)(..)などのファイル規則
Routeを横取りする
ソフトナビゲーションでモーダル画面を表示するなどのUI実装で使用