Next.js 13〜のLayoutとStreaming SSRについて、機能の概要と、実現している仕組みを解説します。 App Directory前提となります。
※ こちらは、 「1/28(土)【LT&交流会 @渋谷】Developers Guild」 で発表させていただいた内容を、シェアするために微調整したものです。
Next.js 13Layout / Streaming SSR仕組み解説@sumiren_t
View Slide
目次● Next.js 13 Layout / Streaming SSR 概要● Next.js 13 Layout / Streaming SSR 仕組み● まとめ
Next.js 13 App Directory 主要機能● Layout● Streaming SSR● Server Components● Routing / Data Fetching / Rendering の 刷新● Suspense サポート● etc…App Directoryが提供する機能は色々あります!
Next.js 13 App Directory 主要機能● Layout● Streaming SSR● Server Components● Routing / Data Fetching / Rendering の 刷新● Suspense サポート● etc…今回紹介するのは、以下の 2つです。
Next.js 13 LayoutLayoutは、今まで自前で実装していたLayoutを、ファイルの配置方法だけで簡単に実現できます。推しポイントは、next/link(preload含む)の通信量とハイドレーション処理量が最小限になることです。決まったファイル名で配置するだけでレイアウトが有効になるフォルダ構成ベースでネストも可能URL階層が同じなら、遷移してもヘッダは再レンダリングされない・通信に含まれておらず通信量が少ない・ハイドレーションも走らない→効率が良い
Next.js 13 Streaming SSRStreaming SSRは、SSRにおけるサーバーサイド fetchでもSuspenseが有効となります。「同期レンダリングが遅い」という SSR最大の弱点(筆者の主観です)を解決する機能です。Next.jsServerBackend30ms 150ms初期描画開始まで 180 ms従来のSSRNext.jsServerBackend30ms 150ms初期描画開始まで 30 msStreaming SSRサーバーサイド Fetchが終わってからSSRし、フロントに全部まとめてレスポンス サーバーサイド Fetch中はfallbackをレンダリングしてレスポンスFetchが終わったらその部分だけ遅れてレスポンス※数値は例となります。
Next.js 13 機能の仕組みこれらの機能は、魔法のように見える部分もあると思います。どうやって実現されているのか、 Layout・Streaming SSRの順に簡単に解説します。● 画面の一部だけをNext.js サーバーから取得して上書きなんてできるの?● 画面の一部だけ遅れてレスポンスするなんて、HTTP(S)でできるの?● etc…
Next.js 13 Layoutの仕組みNext.jsでは、next/linkで遷移するとき、非同期通信によりページを取得しブラウザでレンダリングしています。App Directoryでは、React Server Componentsが導入されたことで、通信形式が変わり、 Layoutの部分レンダリング機能が可能になっています。【next/linkで遷移時の通信内容】1. next/linkによる非同期リクエストに対し、サーバーは画面のコンポーネントとcssやjsの名前のマッピングを返すようになった参考:https://beta.nextjs.org/docs/routing/fundamentals#server-centric-routing-with-client-side-navigation2. URL階層的にレイアウトは更新不要と分かるため、Layoutに関するデータは fetchしない。1.で得られたマッピングから、 Pageに関する部分だけをfetch結果的に、Pageに関連するファイルだけfetchされ、そのJSが実行される
Next.js 13 Streaming SSRの仕組みApp Directoryでは、ページの同期的な取得は Transfer-Encoding: chunkedとなっており、またReact18のアーキテクチャであるSelective Hydrationが機能しています。これらが Streaming SSRを可能にしています。【Streaming SSRのページ リロード時の通信内容】参考:https://github.com/reactwg/react-18/discussions/371. Transfer-Encoding: chunkedにより、レスポンスは何回かに分けて時間をかけて返ってくる2. Selective Hydration(+ Streaming HTML)により、Transfer-Encoding:chunkedで後からscriptタグが継ぎ足しで返ってきても対応でき、できるところからハイドレーションする仕組みになっている。この仕組みで、後から画面の一部を差し替えている
まとめ参考:https://github.com/reactwg/react-18/discussions/37● LayoutもStreaming SSRも、ページをより高速に表示できる素敵な機能● 仕組みを見てみると、上手いこと設計されてて感心(Next.jsというより、半分くらいは React18の世界かもしれないが)