npm v5
npm に v5 がやっとリリースされました。この npm v5 は既に明日リリース予定の Node v8 にバンドルされる予定です。 かいつまんで、機能を紹介します。
Notable Changes
- package-lock.json!!!
- faster than npm v4
- no more
--save
option - Offline mode
- sha512 support
package-lock.json!!!
npm v4 まで問題だった npm-shrinkwrap の問題 を解消するための新しい lock ファイルが生まれました。
shrinkwrap は依存ライブラリを固定するための機能です。npm v4 までは shrinkwrap で固定していましたが、新しく npm v5 になってからはshrinkwrap は不要です。
shrinkwrap は現在の自分の node_modules
フォルダ以下にある情報を元に shrinkwrap.json
ファイルを作成します。
単純に今の自分の依存モジュールのスナップショットとして作るだけならいいのですが、実際には環境の差異で開発中にしかいらないモジュール(devDependencies)やOSX環境ではインストールできたけど、Linux環境ではインストールできないモジュール(optionalDependencies)などがあり、きちんと環境に合わせてshrinkwrapを構築する必要があります。これを回避するために色々 hack していましたが、今回の変更でそれらは全て不要になります。
package-lock.json は package.json に何か変更があったらそれと完全にsyncしてファイルが変更されます。
要は npm install
や npm update
や npm uninstall
などをした場合は毎回 package-lock.json にも同様の変更が行われます。
facebookのメンバーが作った yarn と同じ動きですね。
もしもこの動きを止めたければ --no-save
オプションが追加されているのでそれを付けると package-lock.json には反映されなくなります。 --no-save
を付ける時はちょっとだけ試してみたい時ですね、基本は何も付けずに npm install foobar
とやるだけで lock ファイルもpackage.json も一緒に更新されていきます。
faster than npm v4
npm v4 よりも高速化されました。試しに手元で 適当なモジュール を使った所、下記のような結果になりました。
- npm4 3.14sec
- npm5 1.52sec
- yarn 0.78sec
- pnpm 0.75sec
手元では pnpm > yarn > npm v5 > npm v4 の順で速いのが観測されました。ただ正直 pnpm と yarn の差は誤差の範囲内です。 高速にはなりましたが、 npm5 と yarn, pnpm はまだ yarn, pnpmのが高速です。
こちらの資料にはもう少し詳細なデータが載っています。
no more --save
option
npm install
でモジュールをインストールする際に --save
オプションがデフォルトで付くようになりました。つまり、何らかのモジュールをインストールした場合デフォルトで package.json
に変更が入ります。
--save-dev
もしくは -D
オプションを付けてインストールすれば devDependencies
に入ります。--save-optional
もしくは -O
をつければ optionalDependencies
に入ります。
これらモジュールをインストールした時には必ず package.json
とともに package-lock.json
にも変更が入ります。
offline mode
npm install --prefer-offline
や npm install --offline
などのモードが追加されました。
--prefer-offline
をつけると、npmのcacheがstaleしているかどうかを確認するためのrequestを発行しなくなり、今持っているローカルキャッシュを優先して実行するようになります。無かったら npm リポジトリに取りに行きます。
--offline
をつけるとローカルキャッシュからしか取りません。もしもローカルキャッシュに見つからなかったらエラーになって終わりです。
この offline mode自身は「高速化というよりもnetwork 利用率を下げるために使っているオプションで、直接速度に影響するものではない」とのことを npm の中にいる Kat Marchan から教えてもらいました。
@yosuke_furukawa the reason for having them is more for users who want to reduce or prevent network usage.
— ✨5x gayer Kat✨ (@maybekatz) 2017年5月29日
sha512 support
これまで sha-1 でハッシュを計算していましたが、 sha-1 はcollision の懸念もあるためよりcollisionが起きにくいsha512もサポートされることになりました。
Please make sure to start using #npm5 to publish modules if you can, so you can actually generate `sha512` checksums for your tarballs~ pic.twitter.com/92iNcxcRrR
— ✨5x gayer Kat✨ (@maybekatz) 2017年5月13日
現時点では、 sha512 と sha1 両方で併用される形になるようです。 sha512 だけにすると既存モジュール全てハッシュ値を再計算する必要があるからだと想定されます。なので既存のsha1も併用する形になるんじゃないかと。ただ npm v5 以降からは sha512 のフィールドに値が入っていれば優先的にチェックされます。
この他にも
cache の機能がいくつか deprecated になっていたり、 package.json や package-lock.json がデフォルトでインデントがされるように改修が入っています。
まとめ
npm v5 のリリースに関してざっくり紹介しました。
yarn や pnpm の速度は魅力的ですが、 npm v5 は Node v8 にバンドルされて標準的なツールとして組み込まれる事になるでしょう。まだ v5.0.0 が出たばかりですが、今のうちからでも npm i npm@5 -g
で入れて試してみるのも悪くないでしょう。