Open10
App Routerの素振りをする
API Routesの代替
- 標準のRequest, Responseを利用するらしい
- ファイルの命名規則は
route.ts
とする
- 例:app/api/route.ts
→/api
apollo-serverの導入
以下があり、experimentalであるもののapp routerに対応している
apollo-clientの導入
最近App Routerにexperimentalで対応した
キャッシュをServer ComponentとClient Componentで共有ができないため、どちらか一つで取得するよう利用者が選択する必要があるらしい。結構設計に制限が出る気がする…?
今回は取り急ぎClient Componentに導入する形で進めてみる
ApolloProviderをどこに追加するか?
pagesの時は_app.tsxに書いていた処理をApp Routerではどうする?
→ layout.tsxに追加すればよさそう。
Client Component
'use client'
ディレクティブについて
- app directory以下のコンポーネントはデフォルトでserver componentとなり、
'use client'
ディレクティブを付与することでopt-inする- 可能な限りleaf nodeに寄せるのが望ましい
use client
をどのタイミングで付与すれば良いのか?
Q: - 今回のプロジェクトはbulletproof-react的なfeaturesの分割を、monorepoのパッケージ分割によって実現するアーキテクチャを想定している
- app dir内のコンポーネントに
use client
を付与するのは直感的にわかるが、基本的に別パッケージで実装したものをimportするだけとなる
- importするタイミングでuse client
を追加する形でよいのか?
- また、app dir内ではどういったディレクトリ構成にすればよいか?
→ 以下を見る限り、app directory内でのコロケーションを想定されていそう
Q: client component → server componentの順でネストしている場合、server component はSSR/CSRの両方でレンダリングされる認識でよいのか?
Q: client componentはpages directoryのSSRの挙動と考えていいのか?pre-renderingは行われる?
A: おそらくそう。Chromeのdeveloper toolでJavaScriptを切った状態でページをロードするとDOMとして存在していた。
getStaticPathsの代替
- generateStaticParamsが代替となる
- Functions: generateStaticParams | Next.js
- dynamic routingのpage.tsx内に関数を定義すると呼ばれる
- Q: 型は提供されている?
- Q: generateStaticParamsで返却したslugの配列以外のslugで読み込んだ時に404になる?
- 自分でハンドリングする必要がある。データ取得に失敗したときに
notFound()
を呼ぶなど - ref: https://zenn.dev/link/comments/11f6cedb694456
- 自分でハンドリングする必要がある。データ取得に失敗したときに
Statically Typed Links
pathpidaの代替となる
<Link href={href}>link</Link>
のhrefにstring型を渡せなくなるが、型定義はどうすれば良い?
Q: 以下のようにやる(ドキュメントから引用)
import type { Route } from 'next';
import Link from 'next/link';
function Card<T extends string>({ href }: { href: Route<T> | URL })
return (
<Link href={href}>
<div>My Card</div>
</Link>
);
}
Q: CIで型がないと怒られるのでビルドがしたいけど、全体のビルドは時間がかかるので型だけビルドしたい
discussionで相談中: https://github.com/vercel/next.js/discussions/50888
データフェッチ
Server Component
- 単純にasync/awaitを使えばよい
- https://nextjs.org/docs/app/building-your-application/data-fetching/fetching#async-and-await-in-server-components
-
ただ、TypeScript使用時にasync/awaitを使ってしまうとコンポーネントの返り値はPromise<JSX.Element>
になってしまい、JSX.Elementではないよとコンパイルエラーになってしまう。これはアップストリームで修正に取り組んでおり、現在はts-expect-errorで無視する必要がある
- Next.jsによるfetch()の上書きについて
dynamic routingでのエラーページ表示について
- server component内で
notFound()
を呼べば良い
bundle sizeについて
- Q: server componentだけにすればbundle sizeは0に近づけられるのでは?と思っていたけど意外とfirst load jsがあるけどなぜ?
Layout
Q: Layoutのネストはどのように反映される?
A: RootLayout → NestedLayout → Component のようにラップされる