npmパッケージの依存関係の警告を解消した話

React

こんにちは、はるです。

所属している「もりけん塾」でReact課題に取り組んでいます。
今回は少し脱線しますが、パッケージの依存関係の警告と向き合った記録です。

結果的にreact-scriptsをViteに置き換える対応を取りました。

react-scriptsはすでに非推奨のものなので、なかなか同じ警告や対応をすることはないと思うのですが、警告文をどのように読んで、関連の文書をどのように調べ、実際にどうやって解消していくかを学ぶことができたので大変勉強になりました。

初心者の学習ノートなので、認識の間違えている点がありましたらお問い合わせからご指摘いただけるとうれしいです。

経緯

もりけん塾のReact課題では、react-scriptsというパッケージのCreate React Appを使って環境構築を行っていました。(これは現在は非推奨のものですが、課題の特性上、簡単に環境構築を行い、React課題に集中するため採用されている

課題の中で、Tanstack Queryをインストールしようとしたところ

npm install @tanstack/react-query

依存関係の警告が……..

10 vulnerabilities (1 low, 3 moderate, 6 high)

To address issues that do not require attention, run:
npm audit fix

To address all issues (including breaking changes), run:
npm audit fix --force132 vulnerabilities ...

1行目にある、1 low, 3 moderate, 6 highが脆弱性のグレードです。

中でも、highやcriticalは早急に対応したほうが良いとのことで、今回はこれと向き合うことにしました。

npm audit

npm auditで脆弱性の詳細を見ることができます。

赤枠の中を見てみると、「nth-check」というパッケージのバージョンが2.0.1未満の場合は、重大な脆弱性があることがわかります。

続いて下記のようにあります。

fix available via ‘npm audit fix –force
Will install react-scripts@3.0.1,

脆弱性の修正のために npm audit fix –force というコマンドを使い、react-scripts@3.0.1へダウングレードできるとあります。

しかし、この変更によって他の依存関係に影響があるかもしれないとも書かれていました。

 

Issueやドキュメントを確認

ダウングレード、アップグレードなどをして既存のパッケージの脆弱性を解決していくのか?
他の代替手段に移行するのか?
など、対応を選ぶためにIssueやAdvisoryなどの情報を確認していきます。

今回は2つのIssueを主に確認しましたが、どちらもreact-scriptsのリポジトリのものです。

react-scriptsで使っているsemverにも脆弱性がある

react-scriptsはnth-checkだけでなく、semver@6.3.0にも脆弱性があることがわかりました。

ここで、semverの脆弱性についてGitHub Advisory Database で調べてみました。

GitHub Advisory Databaseは、オープンソースソフトウェアに関連するセキュリティの脆弱性を追跡し、公開するためのデータベースです。

「semver パッケージの 7.x ブランチの 7.5.2 より前のバージョン、6.x ブランチの 6.3.1 より前のバージョン、および 5.7.2 より前の他のすべてのバージョンには、信頼されていないユーザデータが範囲として提供された場合、関数 new Range を経由した正規表現サービス拒否 (ReDoS) の脆弱性があります。」とありました。👀

react-scriptsの依存関係のnth-checkに対する脆弱性

別のIssueによると、「react-scriptsを最新にしたところ、nth-checkの脆弱性の警告が出た。手動で解決を試みたが、警告が出続けている」といった内容でした。

Issueのやりとりで引用されていたコメント

CRA 開発者は脆弱性を気にせず、それを修正するために何もしません。気になる場合は、CRA の使用を中止してください。 CRA は公式には、React アプリを作成するための推奨プロジェクトではなくなりました。他のものを使用してください。CRA との 1 対 1 に近いエクスペリエンスが必要な場合は、Vite を使用してください。」といった記述がありました。

以上のことから、バージョンを下げてreact-scriptsを使い続けるよりも、Viteへ移行した方が良いと判断しました。

Viteへの移行

移行は下記の記事に沿って行ったので、手順は割愛します。

Viteを追加し、react-scriptsはuninstall。

最後にインストールしたかったTanstack Queryを追加しましたが、依存関係の警告は何も出ませんでした🥳

メジャー・マイナーアップデート

今回は移行の対応でしたが、他にもメジャー・マイナーアップデートの対応が必要なこともあります。

npm-check-updates

よく、npm-check-updatesを使ってサクッと一括アップデートするといった方法が紹介されていますが、何も考えずに一気にバージョンを上げることはバグを仕込む可能性があり危険なことを知りました。
ライブラリ一つ一つ(または関連ライブラリを一緒に対応)に対して、
  • ライブラリ一つ一つドキュメントも確認
  • 上がったことで何が影響受けるか
  • テストは通っているか
  • 使っている箇所はうまく動くか
などを確認しながら対応することが大切です。
npm-check-updatesを使わないわけではなく、ncu -u --target patchでpacthバージョンだけ上げるときに使っているとお聞きしました。
このコマンドを使うことで、メジャーまたはマイナーバージョンは変更せず、パッチバージョンのみ最新の状態に更新することができます。

patchバージョン

ソフトウェアのバージョン番号は「メジャー.マイナー.パッチ」という形式で表されます。
よく見るv2.0.1のような書き方で、一番右側がpatchバージョンです。
patchバージョンは、重大な機能追加やAPIの互換性を損なう変更が含まれず、バグ修正やセキュリティ修正など、小さな改良や修正を示します。

まとめ

今回の対応を通じて、警告文の読み方や、Issue,Advisoryで情報を調べること、実際の対応の仕方を学ぶことができました。

1つのパッケージを移行やアップグレードするために、きちんと裏付けとなる情報を調べた上で影響を確認しながら行っていくことを知りました。

ただ、今回は判断の材料になるissueをもりけんさんがくださっていたので、今後自分でも調べていけるようになりたい…✏️

今回は書いていないけど、Viteへの移行の際にAST変換についても詳しく調べることができて最初から最後までとても勉強になりました。

何度もアドバイスしてくださったもりけんさん(@terrace_tec)ありがとうございました!