ライブラリとフレームワークの違いについてまとめてみる

「ライブラリ」と「フレームワーク」という言葉を耳にして説明できますか？

私はReactはライブラリだけどLaravelはフレームワークと書いてあって「？？？」となったりしていました。
どちらも便利な関数がパッケージになっているものだと認識してそのまま放置しておりました。

最近もライブラリだフレームワークだと言葉が出てきたので調べておくことにしました。

# ライブラリとは
特定の機能を簡単に実現するために用意された再利用可能なコードの集まり。

もともと英語で「図書館」や「書庫」という意味。

便利な部品が収められた箱みたいなもの。

ライブラリには関数やクラスがたくさん用意されている。
開発者は呼び出して使うことで、一から機能を実装する手間を省くことができる。

例えばJavaScriptの有名なライブラリjQuery。
HTML要素を選択して非表示にしたりといった処理を簡単なコードで呼び出すことが可能になる。


```javascript

<script src="https://code.jquery.com/jquery-3.x.y.min.js"></script>
<script>
  // ボタンがクリックされたらメッセージを表示する（jQueryの$を使用）
  $('#myButton').on('click', () => {
    $('#message').text('ボタンがクリックされました！');
  });
</script>

```

必要なときに自分でライブラリの関数を呼ぶ
これがライブラリの使い方。
ライブラリはそれ単体で動作するものではなく、コードに組み込まれてはじめて機能する。


Reactもライブラリの一種。
ユーザーインターフェース構築のためのJavaScriptライブラリ。

Reactには画面UIを構築するための関数やコンポーネントの仕組みが用意されている。
開発者はReactの機能を呼び出してWebアプリの画面部分を作ることができる。

ただ、Reactは画面構築に特化したライブラリ。
なのでアプリ全体の構造（ページ遷移の方法やデータの保存先など）は開発者が決める必要がある。

使うも使わないも自由で、使うタイミングや方法も開発者が決める。
言い換えると、アプリ全体の主導権は開発者側にある。
「この場面でこのライブラリのこの機能を使おう」とこちらから能動的に呼び出す形になるのがライブラリだ。

# フレームワークとは

アプリ全体の骨組みや基本構造を提供。
その上で動くコードを作成できるようにするための土台・枠組みを作る。

英語では「枠組み」「骨組み」といった意味になる。
アプリの基本的な流れや構造があらかじめ用意されているのが特徴。

開発者はフレームワークが用意したルールや流れに沿って、自分の書きたい処理（部品）を追加していくことでアプリを完成させていく。

例えばPHPにはLaravelという有名なフレームワークがある。

Laravelを使うとプロジェクトを新規作成した瞬間に基本的なフォルダ構成や設定、Webアプリとして動くための最低限の仕組みがひな形として出来上がる。

開発者はLaravelが用意した決まり（ファイルの置き場所や命名規則、処理の流れ）に従って、自分の作りたい機能をコントローラやモデルといったパーツとして書いていく。

Webリクエストが来たら、
Laravelの決められたルーティング処理が動き、適切なコントローラが呼ばれといった形でアプリ全体の流れをLaravel（フレームワーク）が管理している。

その中で、開発者が書いたコードが必要なタイミングでフレームワーク側から呼び出されて実行されていく。

よく耳にするRubyのRuby on RailsもWebアプリケーション用フレームワークの代表例らしい。

Railsも新規プロジェクト作成時に一通りのひな形が生成され、開発者は「約束事」に従ってファイルを作成・編集していけば、ユーザー登録機能やデータベース操作など典型的な処理をゼロから実装せずに済む。

フレームワークには認証機能やデータベース接続、画面テンプレートなどアプリ開発に必要なものが最初から一式揃っている場合が多い。

「調理器具や調味料が全部揃ったキッチン」を提供してくれるイメージっぽい。
開発者はそのキッチンでレシピ（コード）を追加し、料理（アプリ）を完成させていく。

フレームワークは枠組みとなる基本機能や流れを持っている。
そして主導権はフレームワーク側にある。
開発者はフレームワークが呼び出すポイント（決められた関数やクラスの形）に沿って自分のコードを書いていく。

フレームワークのおかげでゼロから全部作らなくて済む。
が、その代わりフレームワークのルールに従って開発を進める必要がある。

# ライブラリとフレームワークの主な違い

## プログラムの主導権（制御の所在）が誰にあるか

### ライブラリ
プログラム全体の流れ（実行の順序やタイミング）は開発者がコントロール。
必要に応じて自分でライブラリの関数を呼び出し使う。

### フレームワーク
基本的な流れはフレームワーク側があらかじめ用意している。
開発者の書いたコードは決められたポイントでフレームワークから呼び出される形になる。

この考え方は「制御の反転 (Inversion of Control)」と呼ばれることがみたい。
ライブラリとフレームワークを分ける技術的な概念のようだ。

簡単に言うと「ライブラリは開発者が呼び出すが、フレームワークは開発者のコードを呼び出す」という逆転現象が起きている。


## 提供する範囲と目的の違い
### ライブラリ
主に特定の機能に焦点を当てている。
例えば「画面描画を便利にするライブラリ」「データ解析用のライブラリ」「ネット通信を簡単にするライブラリ」など。

なのでライブラリはいくつも組み合わせて使うことがある。

### フレームワーク
アプリケーション全体を構築するための土台なので、広範囲に機能が揃っていることが多い。

特にWebアプリ用フレームワークなら、画面表示からデータベース連携、エラーハンドリングまで含まれている。

フレームワーク1つ導入すれば開発に必要な機能が一通り手に入る反面、そのフレームワークの範囲外のことをしようとすると相性を考える必要が出てくる。


## 開発の自由度

### ライブラリ
基本的に好きなところで好きなように使える。
自作のプロジェクトに後から追加したり、必要な部分だけ利用することができる。

極端な話、全く規約に縛られず関数一つだけ呼んで終わり、なんて使い方も可能になる。

### フレームワーク
一定の規約（コーディング規則やファイル構成、命名ルールなど）に従う必要がある。

プロジェクト開始時からフレームワークありきで進めることが多い。
「このフォルダにこのファイルを書けば自動的に読み込まれる」といった決まりに沿って作業をする。

不自由ではあるが、統一された構造で開発できる安心感や、誰かが後から見ても理解しやすい一貫性が得られる。




まとめると、ライブラリは開発者の**道具**であり、フレームワークはアプリ全体の**土台**。

## PHPのLaravel（フレームワーク）とライブラリの使い分け

LaravelはPHPの代表的なフレームワーク。

Laravelを使ってWebアプリを作る場合はプロジェクトを作成した時点で
- ユーザー登録機能を実装するための雛形
- データベースと接続するための設定ファイル
等がもう用意されている。

ブログアプリを作るなら、Laravelのコマンド一つで認証（ログイン機能）の枠組みが生成され、あとは画面の文言を調整したり細かい挙動をコードで補うだけで、ログイン機能が完成する。これがフレームワークの力だ。

PHPにもComposerという仕組みでパッケージ（ライブラリ）を追加することができる。


## React（ライブラリ）でよく聞くViteについて
Vite（ヴィート）を使うとReactが簡単に使えるよ！とよく言われる。

Viteは近年注目されているフロントエンド開発用のビルドツール（開発環境）。

Vite自体はライブラリでもフレームワークでもなく、開発を補助するツールに分類される。

Viteを使うとReactやVueのプロジェクトを簡単にセットアップできる。
ビルドしてブラウザで動くようにするのが役目。

実際、Viteでプロジェクトを作成するときには「どのフレームワーク/ライブラリを使うか？」と選択していく。
「Reactを使う」と選べば、中でReactのセットアップが行われる。
Vite自体はReactの代わりになるフレームワークではない。

# まとめ（要点）

## ライブラリ
特定の機能を実現するための部品（再利用可能なコード）の集まり。
開発者が自らのコードから必要に応じてライブラリを呼び出して使う。


## フレームワーク
アプリケーション全体の骨組み（構造と基本機能）を提供する土台。
フレームワークがアプリの基本的な流れを制御し、開発者の書いたコードを必要に応じて呼び出す。


**主な違いは主導権**。
ライブラリは開発者が主導権を持ち、必要な機能だけ自由に利用できる。
フレームワークは枠組み側が主導権を持ち、アプリ全体に関わる包括的な機能を提供する。