WEB制作の学習やアプリ開発を進める中で、初めてnpmに触れる時、直感的にわかりづらいこととても多いと思います。
私がnpmに触れた時にいろいろ疑問に思ったことをまとめます。
パッケージの検索はどうやる?
npmjsでnpmで公開されているパッケージを検索することができます。
package.jsonって何?
npmパッケージの設定等を記述するJSON形式のファイルです。
パッケージを作成してnpmjsに公開するのであればしっかり設定する必要がありますが、WEB制作・アプリ開発等でライブラリを使用するだけであれば、とりあえずは次に紹介するキーの設定方法さえ押さえておけばOKです!
dependencies
制作物に含めるパッケージを記述します。
WEB制作の場合はほとんど利用することはないと思いますが、アプリ開発の場合、ライブラリとして使用するものを記述します。
記述するといっても、
> npm install パッケージ
とするだけで、該当プロジェクトのpackage.json
に
{
...
"dependencies": {
"パッケージ": "^1.0.0" }
...
}
と自動で更新されます。
これにより、このプロジェクトが依存するパッケージを示すことになります。
devDependencies
制作物には含めないが、開発中に使用するパッケージを記述します。
WEB制作で使用するパッケージはほとんどここに記述することになります。
パッケージをインストールするとき、
> npm install --save-dev パッケージ
とすると、該当プロジェクトのpackage.json
が次のように更新されます。
{
...
"devDependencies": {
"パッケージ": "^1.0.0" }
...
}
peerDependencies
通常あまり気にすることはありませんが、プラグインモジュール等、他のパッケージありきで、プラグインとして使用される前提のようなパッケージにおいて、peerDependencies
に相方となるパッケージを指定します。
アプリ開発してる時、パッケージを探してたらたまーにこのキーワードに出くわします。
依存パッケージのバージョン?
インストールしてdependencies
等に記述されたパッケージの値としてバージョンコードのような数字の羅列があります。
{
"devDependencies": {
"sass": "^1.64.1" ...
},
...
}
これはインストールされているパッケージのバージョンを示しているものではなく、パッケージを更新する際に受け入れることの出来るバージョン範囲を示しています。
この項目の説明の前にまずはバージョニングについてです。パッケージのバージョンは大体1.2.3
のような数字で構成されていますが、これはそれぞれ、
メジャーバージョン.マイナーバージョン.パッチバージョン
という風になっています。
パッケージを開発する側は、アップデートの際に
- 軽微なバグの修正等はパッチバージョンをインクリメント
- 下位互換性のある新機能追加等はマイナーバージョンをインクリメント(パッチは0へ)
- 下位互換性のないアップデートはメジャーバージョンをインクリメント(マイナー・パッチは0へ)
という風にバージョニングします。
対して、先のdependencies
等のインストールしたパッケージに対する値にはバージョンコードの頭に^
(キャレット)が付いています。
{
"devDependencies": {
"sass": "^1.64.1" ...
},
...
}
上の例ではメジャーバージョン1
は固定で、マイナー・パッチのアップデートは許容する意味合いになります。
公開されているパッケージは日々細かなバグの修正や機能の追加などが行われており、後述するnpm update
などで更新を反映することができます。
しかし、パッケージ更新で、下位互換性のない更新を受け入れてしまったりした場合、それまで使えていたコードやコマンドが使用不可になってしまう可能性があります。
このような事態を防ぐために受け入れる事の出来るバージョン範囲を設定しており、多くはメジャーバージョンのアップデートを除く全てのような指定となっています。
バージョン範囲を表す構文としては主に次のものがあります。
構文 | 説明 |
---|---|
^A.B.C | 一番左のゼロ以外のバージョンを固定し、変更を許可します |
~A.B.C | マイナーバージョンの指定がある場合はパッチの更新を許可し、マイナーの指定がない場合はマイナーまでの更新を許可します。 |
A.B.X | X 、x 、* を使用して、任意の数値を受け入れます |
<A.B.C | < 、<= 、> 、>= 、= を使用してバージョンの範囲を指定します |
例として次のようになります。
^1.2.3
→1.2.3
から2.0.0
未満まで^0.1.2
→0.1.2
から0.2.0
未満まで~1.2.3
→1.2.3
から1.3.0
未満まで~1.2
→1.2.3
から1.3.0
未満まで~1
→1.0.0
から2.0.0
未満まで1.2.x
→1.2.0
から1.3.0
未満まで1.x
→1.0.0
から2.0.0
未満まで<1.2.3
→1.2.3
未満>=1.2.3
→1.2.3
以上
package-lock.jsonって何?
package.json
に記述されているものは依存するパッケージと、受け入れ可能なバージョンでしたか、こちらのファイルに記述されているものは、実際にインストールされている全てのパッケージのバージョンが記載されています。
通常は直接編集することはありません。
プロジェクトのルートでnpm install
すると、package.json
の受け入れ可能なバージョンに従い最新のものをインストールしますが、npm ci
とすると、一旦node_modules
フォルダを削除してから、package-lock.json
のバージョン情報に基づきインストールをします。
これはGitクローンするなどした後で、インストールされいてるパッケージを完全再現する際に便利です。
node_modulesって何?
インストールしたパッケージが入っているフォルダです。
通常は直接編集することはありません。
npm コマンド
npmコマンドは色々ありますが、特によく使うものについてピックアップします。
初期化
init
で対話形式でpackage.json
を作成します。
> npm init
対話が面倒くさい時は-yes
または-y
オプションで全てデフォルト設定でpackage.json
を作成できます。
> npm init -yes
> npm init -y
パッケージのインストール
package.json
に記述されているdependencies
、devDependencies
等に記載されている依存関係をローカルインストールしたい場合はinstall
を実行します。省略形としてi
でもOK。
但し、このインストールを実行すると、package.json
の受け入れ可能なバージョンの最新版をインストールしするので、package-lock.json
が更新されてしまうことがあります。(基本的にはそこまで問題にはならないはずです)
> npm install
> npm i
package-lock.json
を元にローカルインストールしたい場合はci
を実行します。
> npm ci
パッケージを指定してローカルインストールしたい場合はinstall パッケージ名
とする。これを実行すると、自動的にpackage.json
のdependencies
に記載されます。また、該当のパッケージが依存するパッケージもインストールされます。
> npm install パッケージ名
package.json
のdevDependencies
に記載してローカルインストールしたい場合は--save-dev
オプションを追加します。省略形として-D
でもOK。
WEB制作で使用するパッケージは、開発時に使うものがほとんどなので、大体このオプションを付けてインストールすることになります。
> npm install --save-dev パッケージ名
> npm install -D パッケージ名
グローバルインストールしたい場合は--global
オプションを追加する。省略形として-g
でもOK。
> npm install --global パッケージ名
> npm install -g パッケージ名
パッケージのアンインストール
ローカルインストールされたパッケージを削除したいときはuninstall
を実行します。その他、un
、remove
、r
等でもOK。
> npm uninstall パッケージ名
> npm un パッケージ名
> npm remove パッケージ名
> npm r パッケージ名
パッケージの削除を実行すると、package.json
のdependencies
や、devDependencies
の記述や、package-lock.json
の記述も削除されます。もしpackage.json
等から削除したくない場合は--no-save
オプションを追加します。
> npm uninstall --no-save パッケージ名
グローバルインストールされたパッケージを削除したい場合は--global
オプションを追加します。
> npm uninstall --global パッケージ名
インストールされているパッケージ一覧
プロジェクトにローカルインストールされているパッケージを確認したい場合はls
を実行します。
> npm ls
次のような感じでコンソールに出力されます。
env@1.0.0 C:\Users\katsu\Desktop\env
+-- autoprefixer@10.4.15
+-- browser-sync@2.29.3
+-- chokidar-cli@3.0.0
+-- htmlhint@1.1.4
+-- imagemin-giflossy@5.1.10
+-- imagemin-gifsicle@7.0.0
+-- imagemin-jpegtran@7.0.0
+-- imagemin-keep-folder@5.3.2
+-- imagemin-pngquant@9.0.2
+-- imagemin-svgo@10.0.1
+-- imagemin-webp@8.0.0
+-- postcss-cli@10.1.0
+-- postcss@8.4.29
+-- pug-cli@1.0.0-alpha6 (git+ssh://git@github.com/pugjs/pug-cli.git#0eb8d37c5a38cb297cf09361631b93312e0dfa21)
+-- rimraf@5.0.1
`-- sass@1.64.1
インストールされているパッケージ依存しているパッケージを全て確認したい場合は--all
オプションを追加します。
> npm ls --all
次のように出力されます。インストールしているパッケージによってはかなり長くなります。
env@1.0.0 C:\Users\katsu\Desktop\env
+-- autoprefixer@10.4.15
| +-- browserslist@4.21.10
| | +-- caniuse-lite@1.0.30001525 deduped
| | +-- electron-to-chromium@1.4.508
| | +-- node-releases@2.0.13
| | `-- update-browserslist-db@1.0.11
| | +-- browserslist@4.21.10 deduped
| | +-- escalade@3.1.1 deduped
| | `-- picocolors@1.0.0 deduped
| +-- caniuse-lite@1.0.30001525
| +-- fraction.js@4.3.5
| +-- normalize-range@0.1.2
| +-- picocolors@1.0.0
| +-- postcss-value-parser@4.2.0
| `-- postcss@8.4.29 deduped
.
.
.
ls パッケージ名
とすろと、指定したパッケージに依存するパッケージ一覧が出力されます。
> npm ls chokidar
env@1.0.0 C:\Users\katsu\Desktop\env
+-- browser-sync@2.29.3
| `-- chokidar@3.5.3
+-- chokidar-cli@3.0.0
| `-- chokidar@3.5.3 deduped
+-- postcss-cli@10.1.0
| `-- chokidar@3.5.3 deduped
`-- sass@1.64.1
`-- chokidar@3.5.3 deduped
グローバルインストールされているパッケージを確認したい場合は--global
オプションを追加します。
> npm ls --global
インストールされているパッケージの最新版の確認
ローカルにインストールされたパッケージの更新の必要があるか調べたいときは、outdated
を実行します。
> npm outdated
次のようにコンソールに出力されます。
Package Current Wanted Latest Location Depended by
sass 1.64.1 1.67.0 1.67.0 node_modules/sass env
Current
が現在インストールされているバージョン、Wanted
がpackage.json
で指定された受け入れ可能な最新バージョン、Latest
が公開されている最新バージョンになります。
グローバルにインストールされたパッケージの更新の必要があるか調べたいときは、--global
オプションを追加します。
> npm outdated --global
インストールされているパッケージの更新
公開されているパッケージは日々細かなバグの修正や機能の追加などが行われています。インストールされているパッケージを更新し、それらを反映することができます。
ローカルインストールされているパッケージを全て更新したい場合はupdate
を実行します。省略形としてup
、upgrade
でもOK。
更新されるバージョンは先述のpackage.json
に記載されている受け入れ可能なバージョン情報に従います。
> npm update
> npm up
> npm upgrade
ローカルインストールされているパッケージを単体で指定して更新したい場合はパッケージ名を指定します。
> npm update パッケージ名
グローバルにインストールされたパッケージを更新したい時は、--glolbal
オプションを追加します
> npm update --global パッケージ名
パッケージが全て最新版に更新されるていると、outdated
を実行しても何も出力されません。
脆弱性の確認
インストールされているパッケージに脆弱性がないか調べたいときはaudit
を実行します。
> npm audit
問題が見つかると次のようにコンソールに出力されます。low
からcritical
に行くほど重大度が大きくなります。
...
39 vulnerabilities (1 low, 13 moderate, 19 high, 6 critical)
To address issues that do not require attention, run:
npm audit fix
To address all issues possible (including breaking changes), run:
npm audit fix --force
Some issues need review, and may require choosing
a different dependency.
詳細は省略しますが、要は問題が見つからない状態であればOKです。
問題を修正するにはaudit fix
を実行すると、互換性のある更新を行ってくれます。
> npm audit fix
まとめ
コマンドについては、一度環境構築してしまうとあまり使う機会が多くないのでどうしても忘れがちです。
忘れてしまったときはまた見に来てください(笑)