「React のフレームワークって何?」と感じた違和感の正体
React と Next.js について調べると、よく次のように説明されます。
- React は JavaScript のライブラリ
- Next.js は React のフレームワーク
ここまでは理解できていました。
しかし、この関係性がどうにもピンときませんでした。
フレームワークとライブラリの一般的な理解
まず、自分の中では次のように整理していました。
-
フレームワーク
アプリ全体の骨組みや流れを提供し、その決められた枠(ホットスポット)にコードを書いていくもの -
ライブラリ
必要な機能を、必要なタイミングで呼び出して使う部品集
つまり、
フレームワークを使ってアプリを構築し、その中で必要に応じてライブラリを使う
というイメージです。
これは多くのフレームワークで当てはまると思います。
そこで生まれた違和感
この一般論に当てはめると、次の疑問が生まれました。
- Next.js を使ってアプリを作る
- その中でライブラリを使う
- だったら React もその「使われるライブラリの一つ」なのでは?
しかし実際には、
- Next.js は「React のフレームワーク」と呼ばれる
- React は必須で、外せない存在
ここがどうしても腑に落ちませんでした。
さらに言うと、
- JavaScript という言語があり
- TypeScript はその別言語として並んでいて
- その上に React があり
- さらにその上に Next.js がある
このような階層構造に見えてしまい、
「React がフレームワークの一部、という説明は矛盾していないか?」
と感じていました。
理解の転換点:React は「UI に特化したライブラリ」
整理して分かったのは、React がかなり特殊な立ち位置にいるということです。
React は、
- ルーティングを持たない
- データ取得の仕組みを持たない
- ビルドや実行の方法を定義しない
React が担当しているのは、ほぼ UI レイヤーだけです。
- 状態をどう持つか
- UI をどう再描画するか
- コンポーネントをどう組み立てるか
つまり、React 単体では「アプリ」になりません。
Next.js の役割がはっきりした
一方で Next.js は、
- ルーティング
- ビルド・実行環境
- SSR / SSG / ISR
- データ取得の流れ
- ディレクトリ構成
といった、アプリとして成立させるための枠組みを提供します。
重要なのは、
Next.js は「React を使うことを前提に作られたフレームワーク」
だという点です。
Next.js の内部では React が使われており、
React は 差し替えられない前提技術になっています。
関係性を図にすると
理解後は、次の構造として捉えるとしっくりきました。
Next.js(フレームワーク)
└── React(UIライブラリ・必須)
└── 自分が書くコンポーネント
- Next.js は React を内包する
- React は Next.js なしでも使える
- 主導権(制御権)は Next.js 側にある
この上下関係がポイントでした。
なぜ React がややこしく見えるのか
React が「フレームワークっぽく」見える理由は、
- Hooks による強い設計思想
- コンポーネント中心の考え方
- アプリ全体の書き方に大きく影響する点
にあります。
しかし、アプリ全体の流れを支配しているわけではないため、
分類としてはあくまでライブラリです。
ただし、普通のライブラリよりも影響範囲が圧倒的に広い。
ここが混乱の原因だったと感じています。
まとめ
- React は「UI を作るためのライブラリ」
- Next.js は「React を使ってアプリを作るためのフレームワーク」
- React はフレームワークとライブラリの中間のような、特殊な存在
- 違和感を持ったのは自然で、むしろ正しい疑問だった