App Router
Next.js v13.4でstableになった
docs
Special Files
fileやdirの命名によって特殊な意味を持つものが多くて難しいmrsekut.icon
Next.jsのapp/の構造を掴む
#WIP
概念多すぎて、機能一覧と3行コメント、みたいなのを作っておかないと把握できないmrsekut.icon
https://zenn.dev/akfm/books/nextjs-basic-principle
https://eh-career.com/engineerhub/entry/2023/04/18/093000
https://zenn.dev/cybozu_frontend/articles/next-caching-dedupe
https://zenn.dev/takepepe/articles/nextjs-app-router-fetch-cache
https://zenn.dev/cybozu_frontend/articles/next-caching-dedupe
https://twitter.com/koichik/status/1691615277342224895
https://eh-career.com/engineerhub/entry/2023/04/18/093000
https://zenn.dev/akfm/articles/next-app-router-navigation
積極的にprefetchされる
https://zenn.dev/akfm/articles/next-app-router-client-cache
Rea‍ct脳の恐怖 (@yuta0801_)
誰も言及していないので言うと流行りのApp Routerを使うなら bind を使うと良いですよ
https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations#passing-additional-arguments
https://zenn.dev/noko_noko/articles/3ccc64c389259c
App Routerのtest
https://github.com/vercel/next.js/pull/54989
構造的に絶対indexが必要になるのだるいな
別に問題ないが
URLとして存在pathが出てくる
従来との差異ポイント
pages/との併用はできる
だから徐々に移行することはできる
ただ、最終的には全てをapp/に移行することになりそう
以下のようなファイルも不要になる
_app.tsx
_document.tsx
ただし、Next.jsのAPI Routesは依然としてpages/api/に置くらしい
なんかキモいなmrsekut.icon
getServerSideProps、getStaticProps、getInitialPropsなどはサポートしてない
Parallel Routes
Intercepting Routes
useSelectedLayoutSegment
https://nextjs.org/docs/app/api-reference/functions/use-selected-layout-segment
useSelectedLayoutSegments
#??
「App Router」って単語はどこからどこまでを指してるの?
npm run devでは動いているのに、buildしたらerrorになるやつ多すぎる
clientかどうかの扱いが謎すぎる
use client書かずにhooks使ってもbuildはうまくいく。なぜ?
runtime errorも起きない
npm run devでは怒られる
こっちは正しいと思うmrsekut.icon
見てるところが違うのか。非常にやりづらい
挙動がズレてる
app外で書いたcomponentのserver/clientの扱い
全部client componentsになっている感じがする
いやそんなことないのか(?)
vercel/app-playgroundを触るをみると、ui/を作っている
そこで定義されたComponentにも'use client'を書いてるものと書いてないものとある
どこでprisma書けば良い年
いちいちエンドポイント用意するの面倒すぎる
getStaticProps的な
特に、clientから呼び出す系のやつ
server components
defaultでこれになる
クライアントに送信されるデータ量を減らして高速化
Static Rendering
Dynamic Rendering
app/内は全てdefaultでserver componentになる
https://beta.nextjs.org/docs/rendering/server-and-client-components#server-components
client components
ファイルの先頭'use client'を付ける
server module
Next.jsのfetch()
Reactのcache()
Preload pattern
server-only
client module
docs
Fundamentals
Fetching
Caching
Revalidating
Mutating
Streaming and Suspense
Generating Static Params
API Routes
Data Fetching
async Server Componentsとuse
Next.jsのfetch()
できるだけ、Server Components上でfetchするようにする ref
距離的に近い
access tokenやAPI keyなどの機密情報をclientに持ってくる必要がない
server上で、fetchとrenderingを完結できる
1回のround-tripでrequestを終えられる
clientでreqを送ると複数回送られるからってことか(?)
ここはいまいち何を言っているかわからん #??
reqの単位が変わるわけではないが、見た目上1回で終えられるってこと?
client-server waterfallを減らせる
https://beta.nextjs.org/docs/data-fetching/fundamentals#parallel-and-sequential-data-fetching
なんじゃそりゃmrsekut.icon
clientでfetchする場合はreact-queryなどを使うことを推奨している
ただ、useは将来的にはclientでも使えるようになる
↑これはServer Componentsに書くといいmrsekut.icon
親layoutから、子layoutにデータを渡すことは出来ない
個別にfetch処理を書けば良い
2種類のfetching
まあ別にJS知っっている人なら普通mrsekut.icon
parallel data fetching
client-server waterfallを減らせる
データの読み込みにかかる合計時間が短縮される
できるだけこちらを使う
https://beta.nextjs.org/docs/data-fetching/fetching#parallel-data-fetching
普通にpromise.allしてるだけ
code:ts
export default async function Page({ params: { username } }) {
const artistData = getArtist(username); // ここではawaitしない。Promiseを受け取る
const albumsData = getArtistAlbums(username);
// Wait for the promises to resolve
const artist, albums = await Promise.all(artistData, albumsData);
all()内の全てのpromiseが解決されてからrenderingされる
https://beta.nextjs.org/docs/data-fetching/caching#preload-pattern-with-cache
sequential data fetching
https://beta.nextjs.org/docs/data-fetching/fetching#sequential-data-fetching
あるreqに必要なデータが、他のreqに依存している場合など
watarfallができてしまう
CDN上にcacheする
server rendering中に、使えるcacheがあるならそれを使う
cacheが2種類ある
Segment-level Caching
https://beta.nextjs.org/docs/data-fetching/caching
各segmentごとにcache revalidateの時間を指定できる
すげえなmrsekut.icon
route segmentで使用されるデータをcache & revalidateできる
app/page.tsx及びlayout.tsxで
code:ts
export const revalidate = 60; // revalidate this page every 60 seconds
あるいは、Next.jsのfetch()のこれ
code:ts
const res = await fetch('https://...', { next: { revalidate: 10 } });
↑以上の3つの値の中で最も小さい数字が採用されるらしい
むじいなmrsekut.icon
https://beta.nextjs.org/docs/api-reference/segment-config#revalidate
Per-request caching
https://beta.nextjs.org/docs/data-fetching/caching#per-request-caching
requestごとのcache
Next.jsでは、普通にNext.jsのfetch()を使うと、Reactのcache()が自動で行われる
Preload pattern
これ、app/と関係なくない?
app/の中でしか使えないってこと?
Streaming
ページ全体のロードを待たずにユーザーは操作可能
ページ内のパーツごとに、ロードを終わらせる
Suspense for Data Fetchingのイメージでいい
ボディよりサイドバーの方が先にロードが終わったら、サイドバーだけ先に表示する
Suspense for Data Fetching:
useを使える
dynamic function
cookies()
headers()
https://beta.nextjs.org/docs/upgrade-guide#migrating-from-pages-to-app
移行方法
layout.tsxについてはRemixのNestedRoutingと近い機能ってことか
Remixの方をほぼ知らないが
#??
data fetchingできるのはapp/page.tsxだけ?
https://beta.nextjs.org/docs/data-fetching/fundamentals
layout.tsxもできる
getStaticPathsの代わりにgenerateStaticParamsを使う
getStaticPathsと構造が異なるの注意
基本page.tsxの中で呼ぶ?
用語
https://gyazo.com/b906918e91a0ec847ed01038bb4f7ee6 https://beta.nextjs.org/docs/routing/fundamentals
App Routerを使わない
https://beta.nextjs.org/docs/routing/pages-and-layouts
https://beta.nextjs.org/docs/routing/defining-routes#route-groups
https://gyazo.com/4f9c3f6ef86b32d8aa4aa1c6edee3c42
アプリケーション全体のstyleとかをここに置く?
ルート(routes)に対してアプリケーションのコードを、まるでコンポーネントやスタイルやテストのように簡単に設置できるようにしました。チームが(ルートに対して処理を付加する際の)独自の規約や構成を考えなくても済みます。 ref
いままでpagesには基本にはpageファイルだけで、アプリで共通の設定が_documentや_appなどでしたが、それが各ページ毎におけるようになったイメージです。ref
ほんまに?
appでネストした単位がsuspenseする単位になるってこと?
https://zenn.dev/jtakahashi64/articles/a9d2ae3285ceb6?utm_source=pocket_mylist
https://zenn.dev/uhyo/articles/react-use-rfc-2?utm_source=pocket_mylist
https://zenn.dev/nishiurahiroki/articles/7e61590892499b
https://zenn.dev/takepepe/articles/nextjs13-components-integration-test
https://zenn.dev/sora_kumo/articles/46a87f1bde207c
https://zenn.dev/saltedlemon/articles/fa4104d5041a26
https://qiita.com/p_irisawa/items/7d945ebe74b18a2cc5ee?utm_source=pocket_mylist