Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
新卒研修でNext.js AppRouterを導入した 学びと反省
Search
井内 将俊
September 12, 2023
Programming
3
1.9k
新卒研修でNext.js AppRouterを導入した 学びと反省
2023年9月12日に登壇したThink! FRONTEND by DMM.comにて発表した資料です。
井内 将俊
September 12, 2023
Tweet
Share
More Decks by 井内 将俊
See All by 井内 将俊
業務に役立つ! ブラウザデベロッパーツールの機能紹介と活用例
iuchimasatoshi
0
11
ReactメインのチームにNext.jsを導入した道のり
iuchimasatoshi
1
2.5k
Next.js 採用の説得材料を考える
iuchimasatoshi
0
110
Other Decks in Programming
See All in Programming
DevFest Tokyo 2025 - Flutter のアプリアーキテクチャ現在地点
wasabeef
5
900
プロダクトの品質に コミットする / Commit to Product Quality
pekepek
2
770
フロントエンドのディレクトリ構成どうしてる? Feature-Sliced Design 導入体験談
osakatechlab
8
4.1k
From Translations to Multi Dimension Entities
alexanderschranz
2
130
良いユニットテストを書こう
mototakatsu
5
2k
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
710
クリエイティブコーディングとRuby学習 / Creative Coding and Learning Ruby
chobishiba
0
3.9k
선언형 UI에서의 상태관리
l2hyunwoo
0
150
Recoilを剥がしている話
kirik
5
6.6k
採用事例の少ないSvelteを選んだ理由と それを正解にするためにやっていること
oekazuma
2
1k
Monixと常駐プログラムの勘どころ / Scalaわいわい勉強会 #4
stoneream
0
270
Refactor your code - refactor yourself
xosofox
1
260
Featured
See All Featured
The Invisible Side of Design
smashingmag
298
50k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
It's Worth the Effort
3n
183
28k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Side Projects
sachag
452
42k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
How to Ace a Technical Interview
jacobian
276
23k
Into the Great Unknown - MozCon
thekraken
33
1.5k
Speed Design
sergeychernyshev
25
670
Optimising Largest Contentful Paint
csswizardry
33
3k
A Tale of Four Properties
chriscoyier
157
23k
Transcript
新卒研修でNext.js AppRouterを導⼊した 学びと反省 井内 将俊
© DMM.com プロフィール ❏ 所属 ❏ LC開発部 VC-グロースグループ (2023年4月新卒入社) ❏
最近のお仕事 ❏ ライブコミュニケーションサービスの配信画面UIの開発 ❏ 領域:フロントエンド ❏ 趣味:お絵描き 井内 将俊(いうち まさとし) バーチャルライブチャット配信キャラクター 2
© DMM.com イントロ ダクション 3 ❏ 新卒研修のチーム開発 ❏ 開発したアプリの簡単な説明 ❏
AppRouterと周辺技術(SSR/Next.js/RCS)の ざっくり説明 ❏ チーム開発でAppRouterを導入した反省点 ❏ ユーザーIDの保管場所 ❏ 動的ルートの静的ページ生成 ❏ まとめ・所感
© DMM.com イントロ ダクション 4 ❏ 新卒研修のチーム開発 ❏ 開発したアプリの簡単な説明 ❏
AppRouterと周辺技術(SSR/Next.js/RCS)の ざっくり説明 ❏ チーム開発でAppRouterを導入した反省点 ❏ ユーザーIDの保管場所 ❏ 動的ルートの静的ページ生成 ❏ まとめ・所感
© DMM.com 新卒研修のチーム開発 - フロントエンド - バックエンド - ネイティブアプリ -
機械学習 - ブロックチェーン - スクラム - etc… 3ヶ月以上の修行を経て.... 「Amazon Web Services、“Powered by AWS”ロゴ、[およびかかる資料で使用されるその他のAWS商標] は、米国その他の諸国に おける、Amazon.com , Inc.またはその関連会社の商標です。」 5
© DMM.com 新卒研修のチーム開発 - フロントエンド - バックエンド - ネイティブアプリ -
機械学習 - ブロックチェーン - スクラム - etc… チームを組んでアプリを開発!💪🔥 3ヶ月以上の修行を経て.... 6
© DMM.com 新卒研修のチーム開発 - 異なる技術領域が得意な4~5名の新卒チームで2.5週間かけて アプリを開発 - アプリ内容、技術選定 完全自由 7
チーム開発
© DMM.com 新卒研修のチーム開発 - 異なる技術領域が得意な4~5名の新卒チームで2.5週間かけて アプリを開発 - アプリ内容、技術選定 完全自由 -
Next.jsの新機能(AppRouter)を使ってみよう! 8 チーム開発
© DMM.com イントロ ダクション 9 ❏ 新卒研修のチーム開発 ❏ 開発したアプリの簡単な説明 ❏
AppRouterと周辺技術(SSR/Next.js/RCS)の ざっくり説明 ❏ チーム開発でAppRouterを導入した反省点 ❏ ユーザーIDの保管場所 ❏ 動的ルートの静的ページ生成 ❏ まとめ・所感
© DMM.com 開発したアプリ 社内イベントの開催/参加を一元管理することで 社内交流を促進するイベント管理アプリ 10
© DMM.com 開発したアプリ 11 手描きした マスコットキャラクター 社内イベントの開催/参加を一元管理することで 社内交流を促進するイベント管理アプリ
© DMM.com イントロ ダクション ❏ 新卒研修のチーム開発 ❏ 開発したアプリの簡単な説明 ❏ AppRouterと周辺技術(SSR/Next.js/RCS)の
ざっくり説明 ❏ チーム開発でAppRouterを導入した反省点 ❏ ユーザーIDの保管場所 ❏ 動的ルートの静的ページ生成 ❏ まとめ・所感 12
© DMM.com AppRouterとは?🤔 Next.js 13で追加された、RSCを利用した新しいルータ実装 - Next.js とは?🤔 - SSR等の多機能を簡単に実行可能にするReactのフレームワーク
- RCSとは?🤔 - React Server Components の略称 SSR(とCSR)、既存のNext.js、RSC を理解せずにAppRouterを学ぶと大 混乱... 13
© DMM.com CSRとSSR CSR:Client Side Rendering(SPA) クライアント(ブラウザ) APIサーバ - 初回に一括で取得
- クライアントのみでレンダリング - データ取得もクライアント ホスティングサーバ 14
© DMM.com CSRとSSR CSR:Client Side Rendering(SPA) クライアント(ブラウザ) APIサーバ - 初回に一括で取得
- クライアントのみでレンダリング - データ取得もクライアント - 初回読み込みが遅い... - SEOに弱い.... ホスティングサーバ 15
© DMM.com CSRとSSR SSR(Next.js) - サーバー側でも一部レンダリング - サーバー側でもデータ取得 Node.jsサーバ クライアントに任せっきりにしない!
こっちも頑張る 16 クライアント(ブラウザ) APIサーバ
© DMM.com Next.js(Pages Router)によるSSR SSR(Next.js)の例 SSRを行うには 専用の関数を用いる 17
© DMM.com RSC(React Server Components) - サーバー上でレンダリングされる新種のReactコンポーネント - useState等の状態管理やWebAPIへのアクセスはできない 18
クライアントコンポーネント - これまで通りクライアントでレンダリングされるコンポーネント 現在alpha版
© DMM.com ここまでAppRouterの前知識 19
© DMM.com AppRouterとは? • Next 13で追加された新しいルーター実装 • 今年5月に安定版になった • React
Server Component (RSC) 上に構築される • デフォルトでは全てRSC • つまり全てサーバー側でレンダリングされる これまでの(Pages Router)では基本クライアント側で レンダリングされていた RSCの概念を理解していないと大きく混乱... 20
© DMM.com サーバーコンポーネント/クライアントコンポーネント AppRouter(RSC)ではコンポーネント単位でレンダリング場所を 指定可能 サーバー側でレンダリングされる →サーバーコンポーネント (従来通り)クライアント側でレンダリングされる →クライアントコンポーネント 21
デフォルトでは全てサーバーコンポーネント
© DMM.com サーバーコンポーネント/クライアントコンポーネント AppRouter(RSC)ではコンポーネント単位でレンダリング場所を 指定可能 サーバー側でレンダリングされる →サーバーコンポーネント クライアント側でレンダリングされる →クライアントコンポーネント 22
デフォルトでは全てサーバーコンポーネント サーバーコンポーネント クライアントコンポーネント
© DMM.com サーバーコンポーネントのメリット - サーバーコンポーネントを増やせばクライアントへ送られるバンドルサ イズが削減できる - サーバーコンポーネントでデータ取得を行えば、データが埋め込まれた HTMLをクライアントへ送られデータ表示が高速になる -
クライアントのCPU使用量削減 23
© DMM.com 可能な限り サーバーコンポーネントを使うぞ!😆 24
© DMM.com クライアントコンポーネントだらけ...😨 AppRouterの機能も活用しきれてない😭 25
© DMM.com イントロ ダクション ❏ 新卒研修のチーム開発 ❏ 開発したアプリの簡単な説明 ❏ AppRouterと周辺技術(SSR/Next.js/RCS)の
ざっくり説明 ❏ チーム開発でAppRouterを導入した反省点(改善点) ❏ ユーザーIDの保管場所 ❏ 動的ルートの静的ページ生成 ❏ まとめ・所感 26
© DMM.com AppRouter導入反省点 - ユーザーIDをクライアントの状態管理のみで保管してしまった - GenerateStaticParamsの機能を利用できてなかった 27
© DMM.com AppRouter導入反省点 - ユーザーIDをクライアントの状態管理のみで保管してしまった - GenerateStaticParamsの機能を利用できてなかった 28
© DMM.com ユーザーIDの保管 ・ユーザーID ログインしているユーザーのID ・Jotai 状態管理ライブラリ Jotaiを用いてユーザーIDを保管し、何処のコンポーネントでも ユーザーIDを用いてユーザー固有のデータを取得できるように実装 29
© DMM.com ユーザーIDの保管 ・ユーザーID ログインしているユーザーのID ・Jotai 状態管理ライブラリ Jotaiを用いてユーザーIDを保管し、何処のコンポーネントでも ユーザーIDを用いてユーザー固有のデータを取得できるように実装 30
Jotaiを使わずにCookieに保存していればもっと サーバー側で取得可能なデータを増やせたのに....😭
© DMM.com クライアントでの状態管理とcookie クライアントの状態管理(Redux, Recoil, Jotai, localStorage) - サーバーコンポーネントでは値が読み取れない... Cookie
- ブラウザに保存されるデータ - cookieリクエスト毎にサーバーに送られる - サーバーコンポーネントでも値が読み取れる! 31
© DMM.com クライアントでの状態管理とcookie クライアントの状態管理(Redux, Recoil, Jotai, localStorage) - サーバーコンポーネントでは値が読み取れない... Cookie
- ブラウザに保存されるデータ - cookieリクエスト毎にサーバーに送られる - サーバーコンポーネントでも値が読み取れる! 32 Next.jsでも全く同様 △ AppRouter導入の反省 ⭕ SSR導入の反省
© DMM.com サーバーコンポーネントで ユーザーIdが取得できて嬉しい例 33
© DMM.com cookieによるユーザーID取得のメリット サーバーコンポーネントで取得できるデータが増える 34
© DMM.com cookieによるユーザーID取得のメリット 35
© DMM.com cookieによるユーザーID取得のメリット 誰が取得しても同じ (サーバー側で取得) ユーザーIDを用いてユーザーに紐 づいたイベントを取得 (クライアント側で取得) 36
© DMM.com cookieによるユーザーID取得のメリット 誰が取得しても同じ (サーバー側で取得) ユーザーIDを用いてユーザーに紐 づいたイベントを取得 (クライアント側で取得) CookieにユーザーIdを入れれば全てサーバー側で取得可能 37
© DMM.com cookieを用いていない挙動 38
© DMM.com cookieを用いていない挙動 39
© DMM.com cookieを用いていない挙動 40
© DMM.com cookieでユーザーIDを管理した挙動 41 初回表示から全データ取得できてる...!
© DMM.com cookieでユーザーIDを管理した挙動 42 Cookieの仕組みを ちゃんと理解していれば...😭
© DMM.com AppRouter導入反省点 - ユーザーIDをクライアントの状態管理のみで保管してしまった - GenerateStaticParamsの機能を利用できてなかった 43
© DMM.com GenerateStaticParams - "動的”ルーティングを使用し、ビルド時に”静的”なルートを生成 - Pages RouterのgetStaticParamsに近い機能 - getStaticParams:ビルド時にページを作成するSSGを行う機能
- つまりSSG(Static Site Generation)ができる機能! 44
© DMM.com GenerateStaticParams - パス部分が動的に変化する ルーティング 45 アクセスを検知したら、パスから固有のデータ を取得しサーバー側でレンダリング
© DMM.com GenerateStaticParams - パス部分が動的に変化する ルーティング 46 アクセスを検知したら、パスから固有のデータ を取得しサーバー側でレンダリング ビルド時に静的レンダリング(SSG)
GenerateStaticParams
© DMM.com 使ってなかった場合 47 - パス情報からイベント詳細を取得するAPIを叩き、 取得したイベントデータを使用してページを表示
© DMM.com 使ってなかった場合 48 - パス情報からイベント詳細を取得するAPIを叩き、 取得したイベントデータを使用してページを表示
© DMM.com 使ってなかった場合 49 - パス情報からイベント詳細を取得するAPIを叩き、 取得したイベントデータを使用してページを表示
© DMM.com 使ってた場合 50 事前にイベントデータを取得
© DMM.com 使ってた場合 51 事前にイベントデータを取得
© DMM.com 使ってた場合 52 事前にイベントデータを取得 こんなに簡単にSSGができたのに 勿体無い😭
© DMM.com その他の反省 - OGP - AppRouterのgenerateMetadataを用いて動的OGPを実装したが、 そもそも本アプリはVPN接続してないと中身が見れないので OGPは不可能 -
ファイル構成 - featuresディレクトリで機能ごとに分割 - 構成の理解不足からファイル分割(コンポーネント分割)に支障が出て、 クライアントコンポーネントが増えた - UIライブラリ選定 - TailwindメインのUIにすればよりサーバーコンポーネント増やせた etc… 53
© DMM.com 反省点しかない...?🤔 54
© DMM.com 褒めたい点 55 - ちゃんと仕様通りに動くアプリが作れた - 技術的挑戦ができた - 多くの学びを得られた
(これはあくまで新卒技術研修のチーム開発)
© DMM.com まとめ・所管 新卒技術研修のチーム開発にAppRouterを導入 SSR,RSC,Cookie等の前提知識の不足から十分に活用できなかった 56 サーバーコンポーネント/SSG は目的ではなく手段 フロントのパフォーマンス向上が目的 -
パフォーマンス測定の理解 - Cache機能の理解
© DMM.com おわり 57