npmとyarnとNode.jsについて

# はじめに
VueやReactを使ってWeb開発をする際、`npm`や`yarn`といったコマンドを使ってプロジェクトの作成やパッケージのインストール等を行っていると思います。
自分はこの`npm`や`yarn`についてなんとなく使っていたので理解を深めるため、主に以下の3点について調べてみました。

* そもそも`npm`, `yarn`とは何か
* Node.jsとは何か
* npmとyarnで何か違いはあるのか

# npm, yarn とは
共に、**Node.js上で動く**JavaScriptの**パッケージマネージャー**のことを指します。



## まず 「パッケージマネージャー」とは
コンピュータに何のソフトウェアがインストールされたかを記録し、新しいソフトウェアのインストール・新しいバージョンへのソフトウェアの更新・以前インストールしたソフトウェアの削除を容易に行えるようにするプログラムのこと

参考
[パッケージマネージャとは](https://www.debian.org/doc/manuals/aptitude/pr01s02.ja.html)

### 特徴
* パッケージAのバージョン1.5にはパッケージBのバージョン5.0以上が必要といった依存関係を解決する情報や現時点でインストールされているパッケージの情報をもつ
* パッケージのインストール・アンインストール・アップグレード・ダウングレードを行う
* インストール・アップグレート時には依存関係にあるパッケージを自動でインストール・アップグレートしてくれる
* 言語ごとにパッケージマネジャーが分かれている
* Linux, Windows, macOSなど, OSを管理するパッケージマネジャーもある

### パッケージマネージャーを使わないと大変
無数のソフト（パッケージ、ライブラリ）をパッケージマネージャーを使わず、ソフトのホームページから手動でインストールするのは骨の折れる作業です。また、それぞれのソフトにはバージョンの依存関係が発生し、それらを確認しながら必要なバージョンをインストールする必要があるためかなり時間がかかります。

### パッケージマネージャーの例
| パッケージマネジャー | 言語 or OS |
|:-:|:-:|
|pip| Python  |
|gem|  Ruby |
|composer|  PHP |
|glide|  Go |
|**npm**|  **JavaScript** |
|**yarn**|  **JavaScript** |
|Homebrew|  macOS |
|apt-get|  Linux (Debian系) |

## 次に 「Node.js上で動く」とは
### そもそもNode.jsとは
Node.jsとはサーバ上でJavaScriptを実行するための環境のことです。
もともとJavaScriptはブラウザ上で動く言語ですが、Node.jsをインストールすることでサーバ上でJavaScriptが使えるようになります。「Node.js上で動く」とは「サーバ上でJavaScriptを実行するための環境で動作する」ということになります。
つまり、npm, yarnは__Node.jsという環境で動くJavaScriptでできたツール（パッケージやモジュール）を管理するプログラム__ということになります。

#### サーバ上で実行する環境とは
Node.jsをインストールすることで、RubyやPythonのようなバックエンド言語としてJavaScriptを使うことができ、今までできなかったファイルの読み書きや、ネットワーク通信等のOSの機能にアクセスできるようになるということです。
Pythonを動かしたいとき、PythonをインストールしてPythonの実行環境をつくる必要があるように、サーバ上でJavaScriptを動かしたいときはNode.jsをインストールしてJavaScript実行環境を作る必要があるといったイメージです。
ちなみに、ブラウザ上で動いているJavaScriptはブラウザ自体が実行環境の役割を担ってくれています。

### なぜReactで開発を行う際Node.jsが必要になるのか
「ReactはJavaScriptのUIライブラリであり、ブラウザ上で動くものなのでNode.js（サーバ上でのJavaScript実行環境）は不要ではないか」と思っていました。
調べてみると、Node.jsがないと色々と不便なことがあり、Node.jsのインストールは基本的に必要とされています。
ただ以下の記事で紹介されている通り、Node.jsがなくてもReact自体は使えます。

* [正真正銘のReactだけの不純物なしでReact入門](https://sbfl.net/blog/2019/02/20/react-only-tutorial/)
* [ブラウザだけで動作するNode.jsなしReactの使い方](https://wellknowledge.org/node-js-react/)

#### Node.jsが必要な理由

* npmもしくはyarnを使用したい
    * Reactを使った大規模なアプリケーション開発となると、様々なパッケージをインストールする必要があります。前述しましたが、それらのパッケージを依存関係を意識しながらインストールするにはnpmがあると嬉しくてNode.jsが必要になるということです。
* babelを使用したい
    * JavaScriptの新しい書き方から古い書き方に変換する
        * 新しいJS文法に対応していない古いブラウザでも使えるようになる
* webpackを使用したい
    * JavaScript, CSS, 画像等を一つのjsファイルにまとめる
        * 機能ごとにモジュールを細かく分けられる
        * HTTPリクエストの回数を減らすことができる
* その他様々なビルドツールや開発補助ツールを使用したい

### 用途の遷移
つまり、サーバーサイドでJavaScriptのパッケージを管理するnpmでしたが、ReactやVue等のフロントエンド用のパッケージを提供するのにも使われるようになったということですね。

流れとしては以下のようなイメージです。
1. JavaScriptは元々ブラウザで動作するプログラミング言語だった
2. Node.jsの誕生によってサーバでJavaScriptが使えるようになった。
3. 最近ではnpm, babel, webpack等のパッケージを提供する「クライアントサイドのJavaScript実行環境」として使われることが多くなった

# npmとyarnの特徴
### npm
* Node.jsがリリースされた翌年（2010年）リリース
* Node Package Managerの略
* package-lock.jsonファイルを自動的に生成する
* Node.jsをインストールすれば自動的にインストールされる

### yarn
* 2016年リリース
* Facebook、Google、Exponent、Tildeによって開発された新しいJavaScriptパッケージマネージャー
* npｍと互換性がある
    * 同じpackage.jsonが使える
* npmより厳密にモジュールのバージョンを固定できる
* npmよりインストールが速い

yarnの方が優れているように見えますが、最近ではnpmがアップデートされて機能の差はあまりないようです。

# 参考
[パッケージマネージャがパッケージをインストールする仕組み](https://blog.ymyzk.com/2017/12/how-packages-are-installed/)
[パッケージ管理システムとは？](https://eng-entrance.com/category/linux/linux-package)
[Node.jsとはなにか？なぜみんな使っているのか？](https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb)
[Node.js入門編](https://qiita.com/hisashi_matsui/items/5b7c381a14d28b91dfc5)
[JSのモジュールとbabelとwebpackとは何かまとめてみる（初心者向け）](https://qiita.com/teradonburi/items/a0095b8c8dfd876d6b91#webpack)