沖縄チームのキリです。チーム開発中、Node.jsのライブラリ更新があった際にnpm installコマンドを実行しますよね。
今まで本番環境でのデプロイ作業でnpm installコマンドを使っていましたが、実行後たまにpackage-lock.jsonファイルが更新されてしまいgitの最新状態とズレが生じてしまうことがありました。その際はgit reset –hard HEADなどで元に戻し、ローカル環境でnpmのバージョンを上げ、npm updateを実行するなどしてpackage-lock.jsonが本番環境で書き換わらないように対応していました。
※軽く調べたところnpm5.1からpackage-lock.jsonが無視される不具合があり、npm 5.4.2で修正されているようですが、package.jsonとpackage-lock.jsonのバージョンに齟齬がある場合はnpm install時にpackage-lock.jsonが変更されるようです。
https://stackoverflow.com/questions/45022048/why-does-npm-install-rewrite-package-lock-json
さてつい最近のことなのですがnpm ciというコマンドがあることを知りました。ciはclean installのことで、node_modulesを空にし、package-lock.jsonに基づいた厳密なバージョンをインストールするコマンドです。こちらを使った場合にはpackage-lock.jsonが書き換わることはないようです。
https://qiita.com/mstssk/items/8759c71f328cab802670
https://qiita.com/phoby20/items/0cce4bf81333fe7d4358
またnpm installとは違い依存関係の解決を行わないため、高速に動作するそうです。
今後は新しいパッケージの追加にはこれまで通りnpm installを使用し、デプロイ時やプロジェクトの最新状態に合わせる際にはnpm ciを用いると快適だと思いました。
https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable