Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【2025年新卒研修】 React・Next.js は何であるのか

Avatar for Jeongmin LEE Jeongmin LEE
June 02, 2025
89

【2025年新卒研修】 React・Next.js は何であるのか

2025年度の React、Next.js 新卒研修資料です

Avatar for Jeongmin LEE

Jeongmin LEE

June 02, 2025
Tweet

Transcript

  1. 今回の GOAL ➔ React と Next.js がどういう課題を解決しているか理解できる ➔ React と

    Next.js のメインコンセプトを理解できる 予想聴者 ➔ React とか Next.js とか WEB とか全然わからない人
  2. 今回話すこと ➔ React と Next.js が登場するまでの経緯 ➔ React と Next.js

    のメインコンセプト 今回話さないこと ➔ React と Next.js の具体的な文法・書き方など ➔ 2016~2017年以降から登場した技術の話(時間の関係で省略します)
  3. 今回話すこと ➔ React と Next.js が登場するまでの経緯 ➔ React と Next.js

    のメインコンセプト 今回話さないこと 以外にここらへんって自分で調べたりしない限り あまり知る機会がないので、今回詳しく話したい ➔ React と Next.js の具体的な文法・書き方など ➔ 2016~2017年以降から登場した技術の話(時間の関係で省略します)
  4. MPA(Multi-Page Application) (1) リクエスト (2) HTML 生成 複数ページのアプリケーション… ってどういうこと? (3)

    HTML 送信 このように動く WEB アプリケーションを、MPA(Multi-Page Application) と呼んでた
  5. (1) Aページ開く (2) Aページ表示 (4) Bページ表示 (6) Cページ表示 (8) Dページ表示

    (10) Eページ表示 (3) Bページ開く (5) Cページ開く (7) Dページ開く (9) Eページ開く
  6. (1) Aページ開く (2) Aページ表示 (4) Bページ表示 (6) Cページ表示 (8) Dページ表示

    (10) Eページ表示 (3) Bページ開く (5) Cページ開く (7) Dページ開く (9) Eページ開く ページ遷移する度に新たに HTMLを 生成して送る
  7. 当時主流の動的 MPA の多くは SSR する SSR とは、Server side rendering (=

    サーバー側のレンダリング) の略称。 (1) リクエスト (2) HTML 生成 PHP、Java などがよく使われていた クライアントはもらった HTMLを表示するだけ (3) HTML 送信
  8. 整理 • 1990年初期に WEB 技術が誕生する • 初期の WEB は MPA(Multi-Page

    Application)だった ◦ MPA → サーバーが HTML を生成、クライアントに送信して表示するアプリケーション • 当時の MPA は SSR(Server side rendering)方式だった ◦ SSR → リクエスト時にサーバーサイドでHTMLを生成する手法 • 当時の MPA は画面遷移や画面の一部だけ更新するとき、フルリロードが必要で UX が良くなかった
  9. 補足)同期・非同期処理とは 同期処理 ➔ タスクを順番に処理する(= 前のタスクが終了するまで待つ) 作業1 作業2 作業3 Time 非同期処理

    ➔ 現在タスクが実行中でも、次のタスクを実行する(= 前のタスクが終了することを待たない) 作業1 作業2 作業3 Time
  10. Ajax(Asynchronous JavaScript And XML) 非同期 JavaScript サーバーとデータをやり取りするための技術 (今はあまり使われないけど…) JavaScript が非同期でサーバーとデータをやり取りする技術

    = サーバーが返すレスポンスを待たずに画面の色んな操作ができる(ページの応答性が向上) Google Map をドラッグしたらその部分だけ読み込むあれ
  11. 補足)言語?ライブラリー?フレームワーク? 言語 コンピュータに命令を書くための道具 ライブラリー 言語を書くための便利ツール。自由度↑ フレームワーク 言語を書くための便利ツール。自由度↓ ライブラリー: 便利ツールがあるので好きな時に好きなように使ってください エンジニア:

    はい! フレームワーク: 便利ツールがあるので必ずこのガイドラインに従って使ってください エンジニア: はい! ちなみに何のライブラリーもフレームワークもない 素の JavaScript を Vanilla JavaScript と言う
  12. JavaScript の HTML 操作 HTML を DOM に変換したら JavaScript が

    HTML を操作できるようになる ボタンクリックしたらテキスト追加する、 などの動的な動きが実装できる
  13. DOM 操作: Vanilla JS vs jQuery (2000年代初期) 要件 ボタンをクリックすると <div

    id="content"> に新しい <p> 要素を追加する(テキストは "こんにちは" ) 実装 Vanilla JS jQuery
  14. 永遠はないのだ…、jQuery の限界 (2) クロスサイトスクリプティングのリスクがある クロスサイトスクリプティング(Cross-site scripting、XSS) : 悪意あるコードをウェブサイトに挿入するセキュリティ攻撃 悪い人: ククッ…ここに

    JavaScript コードを入力してやる 悪い人が入れたコードが実行されちゃう! エスケープ処理したら(= ただの文字列と して扱うようにしたら)安全だけど、わす れたりミスったりしたらやられる
  15. 永遠はないのだ…、jQuery の限界 (3) 状態がどんどん増えて複雑になる 状態(UIの情報)を追跡し、DOMがその状態を正しく反映させる手作業がとても手間 こんなUIを考えてみましょう: - 商品一覧が表示されていて - 「お気に入り」ボタンを押すとアイコンが変わる

    - 「表示モード(一覧 / グリッド)」でレイアウトが変わる - 商品の在庫がなくなると、自動的に「売り切れ」表示になる 大体これより状態全然多い・複雑なので 実装・メンテがとても大変 しかも状態が JS の方にあったり HTML タグの方に あったりしてもうよくわからない
  16. 補足)jQuery の人気が落ちが他の理由 (1) モダンブラウザの進化 jQuery 登場当時はブラウザ同士互換性がよくなかったけど、モダンブラウザ同士の互換性が改善されて 互換性対応がやりやすくなり、jQuery の存在意義が薄くなった (2) JavaScript

    の進化 jQuery 登場当時は Vanilla JS を書くことが大変だったけど、JavaScript 自体もどんどん改善を重ねて今は Vanilla JS でも分かりやすくきれいなコードが書けるようになった 2006年の Vanilla JS 2017年ぐらいの Vanilla JS
  17. 整理 • Ajax の登場でで UX が向上した ◦ Ajax(Asynchronous JavaScript And

    XML): 画面遷移せず画面の一部だけを更新できる技術 • 2000年代の JavaScript は使い心地がとてもよくなかった • jQuery の登場で クロスブラウザ対応、Ajax、DOM 操作などが簡単に実現できるようになった • jQuery の DOM を直接操作する方式は以下の限界があった ◦ パフォーマンス悪化(DOM が変更される度にレイアウトを再計算・再描画する) ◦ セキュリティ的なリスク(XSS のリスクあり) ◦ 状態とか、そもそも WEB が複雑化(なのに構造はちゃんと整備されず)
  18. SPA の動作 サーバーが HTML を生成して送信するのではなくクライアント側で Javascript が HTML を生成する (1)

    ページリクエスト (2) データリクエスト (3) JSON 返す (5) 空の HTML に JS で画面を描画する JSON → データフォーマット (4) アプリケーションに必要な  すべてのJS と空の HTML 返す
  19. (1) Aページ開く (4) Aページ表示 (6) Bページ表示 (8) Cページ表示 (10) Dページ表示

    (5) Bページ開く (7) Cページ開く (9) Dページ開く (2) Aページ表示 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 (3) Bページ開く JSON JSON データリクエスト
  20. (1) Aページ開く (4) Aページ表示 (6) Bページ表示 (8) Cページ表示 (10) Dページ表示

    (5) Bページ開く (7) Cページ開く (9) Dページ開く (2) Aページ表示 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 *この時点でアプリケーション全体に必要な  すべてのJSをクライアントに送信する (3) Bページ開く JSON JSON データリクエスト
  21. (1) Aページ開く (4) Aページ表示 (6) Bページ表示 (8) Cページ表示 (10) Dページ表示

    (5) Bページ開く (7) Cページ開く (9) Dページ開く (2) Aページ表示 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 *サーバーにリクエスト送らない (3) Bページ開く JSON JSON データリクエスト
  22. (1) Aページ開く (4) Aページ表示 (6) Bページ表示 (8) Cページ表示 (10) Dページ表示

    (5) Bページ開く (7) Cページ開く (9) Dページ開く (2) Aページ表示 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 *サーバーにリクエスト送らない (3) Bページ開く JSON JSON データリクエスト
  23. (1) Aページ開く (4) Aページ表示 (6) Bページ表示 (8) Cページ表示 (10) Dページ表示

    (5) Bページ開く (7) Cページ開く (9) Dページ開く (2) Aページ表示 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 *追加データが必要な  場合はリクエスト送る (3) Bページ開く JSON JSON データリクエスト
  24. (1) Aページ開く (4) Aページ表示 (6) Bページ表示 (8) Cページ表示 (10) Dページ表示

    (5) Bページ開く (7) Cページ開く (9) Dページ開く (2) Aページ表示 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 *受け取ったデータでクライアント側の JS が画面描画 (3) Bページ開く JSON JSON データリクエスト
  25. (1) Aページ開く (4) Aページ表示 (6) Bページ表示 (8) Cページ表示 (10) Dページ表示

    (5) Bページ開く (7) Cページ開く (9) Dページ開く (2) Aページ表示 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 クライアントのJSが 新しい画面描画 (3) Bページ開く JSON JSON データリクエスト WEBアプリケーションに初めて アクセスしたときだけ HTML を返す = HTML が1つ(単一ページアプリケーション)
  26. 初期の SPA は基本的に CSR CSR とは、Client side rendering (= クライアント側のレンダリング)

    の略称。 (1) ページリクエスト (2) データリクエスト (3) JSON 返す (4) アプリケーションに必要な  すべてのJS と空の HTML 返す (5) 空の HTML に JS で画面を描画する 画面を描画するのはクライアントで 読み込まれたJavascript
  27. SPA を実現するためのフレームワーク & ライブラリーの登場 React (2013) Vue.js (2014) Angular (現行版

    2016) 各技術はそれぞれ違うやり方でコードの構造化や状態管理の難しさという課題を解決している
  28. 整理 • 複雑・大規模なWeb構築の需要が高まる中、SPA(Single-Page Application)が登場 ◦ SPA → 初期アクセス時に空のHTMLとJSを受け取り、JS画面を描画するアプリケーション • 当時の

    SPA 基本 CSR(Client side rendering)方式だった ◦ CSR → クライアントサイドでDOMを更新する手法 • SPA はスムーズな操作体験ができることが良い • SPA を実現するためによく使われる技術は React、Vue.js、Angular などがある
  29. React のメインコンセプト (1) コンポーネントベースアーキテクチャ (Component-Based Architecture) 複雑なUIを「コンポーネント」と呼ばれる小さく、独立し、再利用可能な部品に分割して構築する考え方 image from https://react.dev/learn/thinking-in-react

    それぞれのコンポーネントは、 自分自身の見た目や動作のロジックを持っている メリット (1) 複雑なUIも管理しやすくなる (2) コンポーネントの再利用ができる
  30. React のメインコンセプト (2) 宣言的UI(Declarative UI) UIがどのようになってほしいかを React に伝えるだけで実装できる 命令的な jQuery

    宣言的な React fruits 配列定義して、 <ul>タグ取得して、 <li> タグ生成して(テキストは配列の要素にする) 取得した <ul> に作った <li> 足して 「どう作るか」の手順を全部書く 作りたいこと↓
  31. React のメインコンセプト (2) 宣言的UI(Declarative UI) UIがどのようになってほしいかを React に伝えるだけで実装できる 命令的な jQuery

    宣言的な React fruits 配列定義して、 こういう見た目で出して 手順じゃなくて、あるべきをそのままかく (UIの構造がそのままコードの形になる) 作りたいこと↓
  32. React のメインコンセプト (2) 宣言的UI(Declarative UI) UIがどのようになってほしいかを React に伝えるだけで実装できる 宣言的な React

    もし状態に変化があったら React が勝手に 探知してUIをアップデートしくれる (className や id などで DOM を取得する必要がない) 後でログイン状態が変わっても React が出し分けしてくれる メリット (1) よりシンプルで予測可能なコード (2) 状態管理がやりやすくなった
  33. Like ボタンを押す前の Virtual DOM 仮想 DOM の動き Like ボタンを押した後の Virtual

    DOM 比較 (reconciliation) 差分はここだけだから最小限の 範囲だけDOM操作しよう!
  34. DOM 直接操作 vs 仮想 DOM DOM 直接操作 jQuery などで直接DOM操作すると、書きと読みを同タスクで混在しやすくなる そのため無駄に再計算・再描画が多発することがある

    仮想 DOM DOMを直接操作する前に仮想DOMで差分を探知して、まとめて1回だけ直接 DOM 操作する その後ブラウザが再計算・再描画をを1回走らせれば済むので、ムダが激減 ブラウザ: DOMが変わったから最初から計算しないと、、 え、また変わった?じゃまた最初から計算しないと (これをムダにいっぱいやる) React: (仮想DOMで差分をまとめる) この部分だけ変更されたので反映してください。 読みは反映終わった後に実行されるので気にせず。 ブラウザ: はい!再計算・再描画しました!(終了) (最適化しようとしたらできるけど手動でやるのが大変に)
  35. しかし、SPA には課題があった (1) 初回ロードが遅い 初アクセス (空の)HTML ダウンロード Javascript ダウンロード Javascript

    実行 APIデータ フェッチ 1番時間かかる (アプリ全体のコードをこのときダウンロードするから&JSは重いから) 初アクセス *MPAの場合 HTML ダウンロード
  36. しかし、SPA には課題があった (2) SEO に弱い 初アクセス (空の)HTML ダウンロード Javascript ダウンロード

    Javascript 実行 APIデータ フェッチ クローラーは判断する 「このページは中身がないからSEO点数低くていいっしょ」 クローラー: Webサイトの情報を収集し、自動的にデータベース化するプログラム *現在はCSRも対応できるクローラーもある
  37. 整理 • React はUI を構築するための JavaScript ライブラリ • React のメインコンセプト

    ◦ コンポーネントベースアーキテクチャ(Component-Based Architecture) ◦ 宣言的UI(Declarative UI) ◦ 仮想DOM(Virtual DOM) • ただ、SPA の課題感が高まる ◦ 初回ロードが遅い ◦ SEO に弱い
  38. SPA に SSR を! SPA の限界克服のために、SPA にも SSR 導入しよう!という流れが生まれる (1)

    ページリクエスト (2) データリクエスト (3) JSON 返す (4) アプリケーションに必要な  すべてのJS と空の HTML 返す リクエスト時にサーバーサイドでHTMLを生成する手法 SPA SSR(Server-side rendering) +
  39. SPA に SSR を! SPA の限界克服のために、SPA にも SSR 導入しよう!という流れが生まれる (1)

    ページリクエスト (2) データリクエスト (3) JSON 返す (4) アプリケーションに必要な  すべてのJS と空の HTML 返す リクエスト時にサーバーサイドでHTMLを生成する手法 SPA SSR(Server-side rendering) + 🤔
  40. SPA + SSR の動き (1) ページリクエスト (2) データリクエスト (3) JSON

    返す (1)から(3)までは初期SPAと同じなので、  のところを詳しく見ていく
  41. SPA + SSR の動き (3) JSON 返す (4) HTML を作る

    (5) HTML、JS送信 (7) JS実行 (6) HTML表示 空のHTMLではなく、 ページ表示に必要な HTML を作る この時点では JS が実行されてない ので、インタラクティブではない ここでインタラクティブになる EX) ボタン押してもなにも起きない SPAだけど、サーバーでHTMLを作成してクライアントに送信する
  42. (3) JSON 返す (4) 空のHTML、 JS送信 (6) JS実行 (5) 空のHTML表示

    SSR がない場合(素の SPA) (3) JSON 返す (4) HTML を作る (5) HTML、JS送信 (7) JS実行 (6) HTML表示 SSR がある場合
  43. 補足)Hydration という概念 (5) HTML、JS送信 (7) JS実行 (6) HTML表示 Javascript を実行してページをインタラク

    ティブにすることを Hydration と言う *Hydration は水分供給という意味 (ドライな HTML に水分を供給する、で覚えたらいいかもしれない) (3) JSON 送信 (4) HTML を作る
  44. SPA + SSR が解決した課題 初アクセス (空の)HTML ダウンロード Javascript ダウンロード Javascript

    実行 APIデータ フェッチ 初アクセス HTML ダウンロード Javascript ダウンロード Javascript 実行 APIデータ フェッチ *SSR のない SPA この時点でページのコンテンツが見れる (1) 初期表示速度の改善
  45. SPA + SSR が解決した課題 (2) SEO改善 初アクセス (空の)HTML ダウンロード Javascript

    ダウンロード Javascript 実行 APIデータ フェッチ 初アクセス HTML ダウンロード Javascript ダウンロード Javascript 実行 APIデータ フェッチ *SSR のない SPA 空のHTMLではないので、クローラーが ちゃんとクローリングできる
  46. 各技術はそれぞれ違うやり方でSPAの課題を解決している React Framework React Framework React Framework Vue.js Framework やっと

    Next.js の話ができる SPA + SSR を実現できるフレームワーク & ライブラリー
  47. Next.js のメインコンセプト (2) ファイルシステムベースのルーティング ファイル名とディレクトリ構造に基づいて自動的にルーティングを設定 ディレクトリ URL ルーティング(Routing): URLに応じて、どのページやコンテンツを表示するかを決める仕組み React

    はルーティング機能がないのでルーティングの ためのライブラリー入れて自分で実装する必要がある (以下は React Router の実装例) ルーティングのためだけに Next.js つかいたいという声もある
  48. Next.js の Pre-rendering Next.js は基本的にすべてのページを Pre-rendering する = クライエント側の JS

    がレンダリングする代わりに、各ページに対して HTML を予め作っておく *pre = 事前に
  49. SG(Static Generation、静的生成) HTML がビルド時に生成され、ずっと同じHTMLが配信される リクエスト レスポンス ビルド サーバーにアップ (デプロイ) この時点でもうHTMLが完成していて、

    変わることはない こういう時に適切: - ページに必要なデータがビルド時点で揃っている場合 - ページが頻繁に更新されない場合 例)ニュースページ、FAQページなど </> </> </>
  50. SG(Static Generation、静的生成) HTML がビルド時に生成され、ずっと同じHTMLが配信される リクエスト レスポンス ビルド サーバーにアップ (デプロイ) この時点でもうHTMLが完成していて、

    変わることはない こういう時に適切: - ページに必要なデータがビルド時点で揃っている場合 - ページが頻繁に更新されない場合 例)ニュースページ、FAQページなど </> </> </> 後発で ISR(Incremental Static Regeneration) という更新される SG も登場する
  51. SSR(Server-side Rendering、サーバー側のレンダリング) HTML が各リクエストの度に生成され、毎回新しく生成したHTMLが配信される リクエスト レスポンス ビルド サーバーにアップ (デプロイ) リクエストが来る度に

    HTML 生成 こういう時に適切: - リクエスト時にしかわからない情報に依存するページの場合 - ページが頻繁に更新され、常に最新の情報を表示する場合 例)ログイン後のマイページ、検索結果ページなど </> </> </>
  52. SSR(Server-side Rendering、サーバー側のレンダリング) HTML が各リクエストの度に生成され、毎回新しく生成したHTMLが配信される リクエスト レスポンス ビルド サーバーにアップ (デプロイ) リクエストが来る度に

    HTML 生成 こういう時に適切: - リクエスト時にしかわからない情報に依存するページの場合 - ページが頻繁に更新され、常に最新の情報を表示する場合 例)ログイン後のマイページ、検索結果ページなど MPA の SSR と完全に同じではない (こっちはサーバー側Reactコンポーネントをでレンダリングし、 クライアント側でHydrationを行う) React のための SSR という感じ </> </> </>
  53. もちろん、SPA + SSR にも課題がある (1) HTML作るに時間かかる & サーバーに負荷かかる サービスの規模が大きいほど課題感がたかまる *ここで必要なデータをフェッチして、

     それをもとにHTMLをつくる リクエストの度にHTML作る = HTML作ってる間は画面が表示されない = サーバーが重労働
  54. もちろん、SPA + SSR にも課題がある (2) HTML 描画から Javascript 実行まで時間かかる 見えてるけど押せないんだが?の時間がある

    HTML表示 インタラクティブになる コンテンツが見えるまでは早くなったけど、 TTI (Time to interactive) になるまで時間かかる
  55. 整理 • WEB アプリケーション構築のための React フレームワーク • Next.js のメインコンセプト ◦

    ゼロコンフィグ (Zero Config) ◦ ファイルシステムベースのルーティング ◦ 多様なレンダリング戦略 ▪ SG(Static Generation)→ ビルド時に HTML 生成 ▪ SSR(Server-side Rendering)→ リクエスト時に HTML 生成 • SPA + SSR にも課題がある ◦ HTML作るに時間かかる & サーバーに負荷かかる ◦ HTML 描画から Javascript 実行まで時間かかる
  56. - wikipedia, 「JavaScript」, https://ja.wikipedia.org/wiki/JavaScript - zenn, 「【レンダリング大全】CSR, SSR, SPA, MPA,

    PPRの意味、そもそもレンダリングとは【2025 年始】」, https://zenn.dev/txxm/articles/f04b21949ddab3 - Tejas Kumar, 『Fluent React』, O’Reilly , 2024 - 大岡由佳, 『りあクト! TypeScriptで始めるつらくないReact開発【② React基礎編】』、2025 参考資料 ChatGPT と Gemini にサンプルコード作ってもらいました