npmって何?

昨日、環境っていうかパッケージのダウンロードに失敗して、ちょっと考えたのですが、npm ってなんだろうなーって…

36歳にもなって npm ってなんですか?って、なかなか聞けないから調べよう!
いつもそばにいてくれてありがとう Google 先生!

npmとは


npmの正式名称は、Node Package Managerです。
npmの正式名称からも解るように、Node.jsのパッケージ(Package )を管理する(Manager)ツールです。
Node.jsのパッケージ(Package)とは、予め用意された便利な機能をまとめたものです。

便利なパッケージ管理ツール!npmとは【初心者向け】
https://techacademy.jp/magazine/16105

↑このWordPress5の引用フィールドの使い方、いま気が付きました涙
これからはちゃんと使っていきます!

npm はパッケージ管理ツール!

$ npm –version
6.11.2

私の MacBook Air の npm のバージョンは 6.11.2 でした。

$ npm list -g

いまダウンロード済みのパッケージはこのコマンドらしい…試しにやってみます。

$ npm list -g
/usr/local/lib
├─┬ expo-cli@3.0.10
│ ├─┬ @expo/bunyan@3.0.2
│ │ ├── exeunt@1.1.0
│ │ ├── moment@2.24.0
│ │ ├─┬ mv@2.1.1
│ │ │ ├── mkdirp@0.5.1 deduped
│ │ │ ├── ncp@2.0.0 deduped
│ │ │ └─┬ rimraf@2.4.5
│ │ │   └─┬ glob@6.0.4
│ │ │     ├── inflight@1.0.6 deduped
│ │ │     ├── inherits@2.0.4 deduped
│ │ │     ├── minimatch@3.0.4 deduped
│ │ │     ├── once@1.4.0 deduped
│ │ │     └── path-is-absolute@1.0.1 deduped
│ │ ├── safe-json-stringify@1.2.0
│ │ └── uuid@3.3.3
│ ├─┬ @expo/config@2.1.4
│ │ ├── @expo/json-file@8.1.11 deduped
│ │ ├─┬ find-yarn-workspace-root@1.2.1
│ │ │ ├─┬ fs-extra@4.0.3
│ │ │ │ ├── graceful-fs@4.2.2 deduped
│ │ │ │ ├── jsonfile@4.0.0 deduped
│ │ │ │ └── universalify@0.1.2 deduped
│ │ │ └─┬ micromatch@3.1.10
│ │ │   ├── arr-diff@4.0.0
│ │ │   ├── array-unique@0.3.2
│ │ │   ├─┬ braces@2.3.2
│ │ │   │ ├── arr-flatten@1.1.0
│ │ │   │ ├── array-unique@0.3.2 deduped
│ │ │   │ ├─┬ extend-shallow@2.0.1
│ │ │   │ │ └── is-extendable@0.1.1
│ │ │   │ ├─┬ fill-range@4.0.0
│ │ │   │ │ ├─┬ extend-shallow@2.0.1
│ │ │   │ │ │ └── is-extendable@0.1.1 deduped
│ │ │   │ │ ├─┬ is-number@3.0.0
│ │ │   │ │ │ └─┬ kind-of@3.2.2
│ │ │   │ │ │   └── is-buffer@1.1.6 deduped
│ │ │   │ │ ├── repeat-string@1.6.1
│ │ │   │ │ └─┬ to-regex-range@2.1.1
│ │ │   │ │   ├── is-number@3.0.0 deduped
│ │ │   │ │   └── repeat-string@1.6.1 deduped
│ │ │   │ ├── isobject@3.0.1
│ │ │   │ ├── repeat-element@1.1.3
│ │ │   │ ├── snapdragon@0.8.2 deduped
│ │ │   │ ├─┬ snapdragon-node@2.1.1
│ │ │   │ │ ├─┬ define-property@1.0.0
│ │ │   │ │ │ └─┬ is-descriptor@1.0.2
│ │ │   │ │ │   ├─┬ is-accessor-descriptor@1.0.0
│ │ │   │ │ │   │ └── kind-of@6.0.2 deduped
│ │ │   │ │ │   ├─┬ is-data-descriptor@1.0.0

以下略

すごい量!
こんなに使ってたかー!!

この deduped ってなに?

Naturally, “deduped” is short for “deduplicated” (duplicates were removed). The documentation for npm dedupe explains how npm does this:

What is deduped in npm packages list?
https://stackoverflow.com/questions/52781142/what-is-deduped-in-npm-packages-list

同じことねー思いますよねー

npm-dedupe
https://docs.npmjs.com/cli/dedupe

npm dedupeでモジュールの重複を解消する
https://qiita.com/totto357/items/585b6bb225021f723c5e

なるほどねー
無駄なダウンロードを対応してくれるのね。

package-lock.jsonってなに?

Summary


npm ^5.x.xを使っている場合、デフォルトでpackage-lock.jsonが生成されます
継続的インストールと依存関係を確実にするためpackage lockを使うべきです
バージョン管理にpackage lockを使うべきです
npm ^5.1.x以降はpackage.jsonはpackage-lock.jsonを奥の手として持っており、悩ましさを軽減してくれます。
package-lock.jsonを削除する必要はなく、npm installで再生成できる
APIを提供している場合、セマンティックバージョン管理に従う

package-lock.jsonについて知りたくても聞けなかったこと
https://qiita.com/yfujii1127/items/7ca887a45e0855917279

はーーーーんなるほどー

読み進めていくときのメモ

バージョン管理の提案

X.Y.Z(メジャー.マイナー.パッチ)のバージョン形式を遵守しなければなりません。

Semantic Versioning 2.0.0
https://semver.org/
日本語→ https://semver.org/lang/ja/

だそうです。
これはでも言われることはわかりますねー。

すべてのパブリックAPIに関してドキュメントを書くのは重労働です。

 ユーザーに使用されることを前提としたソフトウェアに適切なドキュメントを用意することはプロフェッショナルな開発者としての当然の責任です。ソフトウェアの複雑性を管理することはプロジェクトをスムーズに続けていくために非常に重要なことで、もしあなたのソフトウェアの使い方や、どのメソッドが安全に呼び出せるのかを誰も知らないのは望ましい状況とは言えません。セマンティック バージョニングと適切に定義されたパブリックAPIを宣言することは長期的に見ればメリットが大きいでしょう。

Semantic Versioning 2.0.0
https://semver.org/
日本語→ https://semver.org/lang/ja/

耳が痛いけど大事なことです!

まとめ

依存パッケージが依存するパッケージ(ネストした依存状態)のバージョン情報が変わる場合がある
package.jsonだけでは、node_modulesを完璧に再現できるとは限らない(勝手に違うバージョンのライブラリがインストールされてしまう可能性)
package-lock.jsonはバージョン情報をすべて正確に記録する
package-lock.json に書き込まれたバージョンのパッケージがインストールされる

package-lock.jsonについて知りたくても聞けなかったこと
https://qiita.com/yfujii1127/items/7ca887a45e0855917279

わかりやすい。
ありがとうございました。
この場をお借りしてお礼を!

明日環境直そう…

フォローよろしくお願いします!^_^

毎日つぶやいています!