Open10

App Routerの素振りをする

Hirotaka MiyagiHirotaka Miyagi

apollo-clientの導入

最近App Routerにexperimentalで対応した

https://www.apollographql.com/blog/announcement/frontend/using-apollo-client-with-next-js-13-releasing-an-official-library-to-support-the-app-router/

キャッシュをServer ComponentとClient Componentで共有ができないため、どちらか一つで取得するよう利用者が選択する必要があるらしい。結構設計に制限が出る気がする…?

今回は取り急ぎClient Componentに導入する形で進めてみる

ApolloProviderをどこに追加するか?

pagesの時は_app.tsxに書いていた処理をApp Routerではどうする?

→ layout.tsxに追加すればよさそう。

https://nextjs.org/docs/pages/building-your-application/upgrading/app-router-migration#migrating-_documentjs-and-_appjs

Hirotaka MiyagiHirotaka Miyagi

Client Component

'use client' ディレクティブについて

  • app directory以下のコンポーネントはデフォルトでserver componentとなり、 'use client' ディレクティブを付与することでopt-inする
    • 可能な限りleaf nodeに寄せるのが望ましい

Q: use client をどのタイミングで付与すれば良いのか?

  • 今回のプロジェクトはbulletproof-react的なfeaturesの分割を、monorepoのパッケージ分割によって実現するアーキテクチャを想定している
  • app dir内のコンポーネントに use client を付与するのは直感的にわかるが、基本的に別パッケージで実装したものをimportするだけとなる
    - importするタイミングで use client を追加する形でよいのか?
    - また、app dir内ではどういったディレクトリ構成にすればよいか?

→ 以下を見る限り、app directory内でのコロケーションを想定されていそう

https://twitter.com/d151005/status/1659359491551547392?t=D0KrQpXr9r29k-Vc6YA0UA&s=19

Q: client component → server componentの順でネストしている場合、server component はSSR/CSRの両方でレンダリングされる認識でよいのか?

Q: client componentはpages directoryのSSRの挙動と考えていいのか?pre-renderingは行われる?

A: おそらくそう。Chromeのdeveloper toolでJavaScriptを切った状態でページをロードするとDOMとして存在していた。

Hirotaka MiyagiHirotaka Miyagi

getStaticPathsの代替

Hirotaka MiyagiHirotaka Miyagi

pathpidaの代替となる

https://nextjs.org/docs/app/building-your-application/configuring/typescript#statically-typed-links

以下のようにやる(ドキュメントから引用)

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

Hirotaka MiyagiHirotaka Miyagi

データフェッチ

Server Component

Hirotaka MiyagiHirotaka Miyagi

bundle sizeについて

  • Q: server componentだけにすればbundle sizeは0に近づけられるのでは?と思っていたけど意外とfirst load jsがあるけどなぜ?
Hirotaka MiyagiHirotaka Miyagi

Layout

Q: Layoutのネストはどのように反映される?

A: RootLayout → NestedLayout → Component のようにラップされる