npm install --saveについてきちんと調べる

# 導入

初歩的だが「`npm install`と`npm install --save`とは何が違うんだ？」と疑問に思ったので動作をきちんと調べた。


# 環境

```shell
$ zsh --version
zsh 5.9 (x86_64-apple-darwin23.0)
$ node -v
v20.16.0
$ npm -v
10.8.1
```

# 調査

まずは公式のリファレンスをきちんと読む。

https://docs.npmjs.com/cli/v10/commands/npm-install#save

Configurationの`save`では以下のように説明されている。

> - Default: `true` unless when using `npm update` where it defaults to `false`
> - Type: Boolean
Save installed packages to a `package.json` file as dependencies.
When used with the `npm rm` command, removes the dependency from `package.json`.
Will also prevent writing to `package-lock.json` if set to `false`.

リファレンスを読む限り、デフォルトで`--save=true`なので

```shell
$ npm install {package}
```
と
```shell
$ npm install --save {package}
```
と
```shell
$ npm install --save=true {package}
```
は同じようだ。`--save=true`のときは`package.json`に依存性パッケージとしてインストールされるとも書かれている。`--save=false`を指定したときは`package.json`に依存性パッケージとしてインストールされない。このあたりは次節で実際に動作させてどのような意味なのか確認しよう。
また`--save=false`のときは`package-lock.json`には書き込まれないともある。この点も実際に動作させて確認する。

# 動作確認
適当なフォルダを用意する。今回は`node-npm-install-test`とした。
```shell
$ mkdir node-npm-install-test
```
このフォルダ内に`sax`パッケージをインストールしたりアンインストールしたりして動作確認をする。

https://www.npmjs.com/package/sax

`sax`パッケージを選んだ理由はとくにない。公式の`npm-install`のページで例に挙げられていたのでここでも使用した。

## `npm install`と`npm install --save`と`npm install --save=true`
最初に下記を実行する。
```shell
$ npm install sax
```

何も入っていなかったフォルダ内に`node_modules`フォルダと`package.json`と`package-lock.json`が作成される。
```shell
$ ls
node_modules		package-lock.json	package.json
```

ひとつひとつ中身を確認すると`sax`がインストールされていることがわかる。
```shell
$ ls node_modules
sax
$ cat package.json
{
  "dependencies": {
    "sax": "^1.4.1"
  }
}
$ cat package-lock.json
{
  "name": "node-npm-install-test",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "dependencies": {
        "sax": "^1.4.1"
      }
    },
    "node_modules/sax": {
      "version": "1.4.1",
      "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
      "integrity": "sha512-(略)",
      "license": "ISC"
    }
  }
}
```

`sax`をアンインストールするために下記コマンドを実行する。
```shell
$ npm rm sax
removed 1 package, and audited 1 package in 235ms

found 0 vulnerabilities
```
ちなみに`vulnerabilities`とは脆弱性のことであり、上記の結果は`sax`パッケージに脆弱性が見つからなかったことを表している。

実行後に`node_modules`フォルダと`package.json`と`package-lock.json`の中身をそれぞれ確認すると以下のようになっている。
```shell
$ ls node_modules

$ cat package.json
{}
$ cat package-lock.json
{
  "name": "node-npm-install-test",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {}
}
```
`sax`パッケージがアンインストールされていることがわかる。

記事を短くするために省略するが
```shell
$ npm install --save sax
```
と
```shell
$ npm install --save=true sax
```
の場合も同じ結果になった。

## `npm install --save=false`
さて`sax`パッケージをアンインストールしたあと、下記を実行する。
```shell
$ npm install --save=false sax
```
すると下記の結果となった。
```shell
$ ls node_modules
sax
$ cat package.json
{}
$ cat package-lock.json
{
  "name": "node-npm-install-test",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {}
}
```
`node_modules`フォルダには`sax`がインストールされているが`package.json`と`package-lock.json`には書き込まれなかった。

# まとめ
`--save`オプションは依存パッケージとしてインストールするかしないかを表すオプションであり、デフォルトは`true`である。つまり通常は`npm install`と`npm install --save`は同じ動作をするので`npm install`を使えばよい

特別な意図があって依存パッケージとしてインストールしたくないパッケージに対しては`--save=false`とする。