管理您 Node.js 專案中的相依性更新

已完成

身為 Tailwind Traders 的開發人員,請務必讓套件保持最新狀態。 這有助於確保我們使用最新的功能和修正程式。 它也有助於我們避免安全性弱點。 在本單元中,您將瞭解如何管理 Node.js 專案中的相依性。 您將瞭解如何更新套件、使用語意版本控制,以及管理安全性問題。

更新套件前的考慮

更新套件之前,請考慮:

  • 更新類型:瞭解其是否為次要修正、新功能或可能會中斷程序代碼的重大變更。 語意版本控制有助於識別這一點。
  • 項目組態:確定您的項目設定為只接收所需的更新,以避免發生非預期的變更。
  • 安全性:隨時了解潛在的弱點。 使用 npm 的稽核功能來識別並更新有問題的套件。
  • 測試:請確定您的測試在更新之後通過。 如果您沒有測試,請考慮新增測試。 更新之後,您的應用程式的行為可能會不同,而測試會驗證 正確的 行為。

定義更新行為的語意版本控制

語意版本控制是軟體開發的重要標準。 發行和使用 npm 套件都很重要。 它可藉由指出新版本中的變更類型,協助管理更新風險。 版本號碼有特定的區段來反映這些變更:

版本類型 Position 語法 發生什麼事 更新方法
Major 1 x.0.0 或 * 從 1.0.0 到 2.0.0 的變更表示中斷性變更。 可能需要調整程序代碼。 熟悉最新主要版本的立即更新,並確認潛在的程式代碼變更。
Minor 第二 1.x.1 或 ^ 從 1.2.9 變更為 1。3.0 引進新功能。 現有的程式代碼仍應正常運作。 更新 通常是安全的。 開啟至新功能,但不會中斷性變更。
Patch 第三 1.1.x 或 ~ 從 1.0.7 變更為 1.0。8 個平均錯誤修正。 更新 應該是安全的。 接受錯誤修正。

針對小型 Node.js 專案,您可以自由更新為最新版本。 但是對於較大的專案,更新需要仔細思考,而且並不總是自動的。 一般而言,更新較小的相依性,其本身相依性較少,可讓程式更容易。

更新一或多個相依性之前,您應該先設定檔案 package.json ,以便在執行 npm update <name of dependency> 命令時取得可預測的行為。 Node.js 使用一組符號,可讓您定義要如何更新套件。

使用 npm CLI 更新套件

您可以在 npm 中使用 installupdate 命令來安裝套件。 這些命令現在大多可互換。 若要更新套件,您通常會使用:

  • 最新版本: npm update <package name>@latest
  • 特定版本: npm update <package name>@<optional version number>

更新程序取決於兩個因素:

  • Version Argument:如果在命令中 npm update 指定版本號碼,npm 會擷取並安裝該特定版本。
  • 指令清單檔案專案:檔案 package.json 包含更新相依性的規則。 例如, "dependencyName": "1.1.x" 表示 npm 會擷取符合此模式的版本。

瞭解版本控制

三個檔案控制相依性的版本控制:

  • package.json:此檔案會定義您想要使用的套件版本。 這是專案的指令清單檔。 其中包含專案的元數據,包括相依性。
  • package-lock.json:此檔案描述產生的確切樹狀結構,讓後續安裝能夠產生相同的樹狀結構,而不論中繼相依性更新為何。 此檔案的目的是要認可至來源存放庫。
  • shrinkwrap.json:此檔案是由 npm shrinkwrap CLI 命令所建立,類似於 package-lock.json。 命令之間的主要差異在於,用戶無法覆寫 中指定的 npm-shrinkwrap.json 套件版本。 此外,檔案 npm-shrinkwrap.json 與較舊版本的 npm 相容(版本 2-4),而 package-lock.json 與 npm 第 5 版和更新版本相容。 因此,您可能會在維護舊版程式代碼基底時發現 npm-shrinkwrap.json 。 大部分的開發人員都會使用 package-lock.jsonnpm-shrinkwrap.json而不是 。 慣用的其中一個例外 npm-shrinkwrap.json 狀況是全域安裝精靈和命令行工具,開發人員想要確保已安裝所指定套件的確切版本。

套件版本的範例判斷

假設您在程式代碼中使用1.2版,然後發行1.4版,進而中斷程序代碼。 如果有人此時安裝您的應用程式,他們會收到非功能應用程式。 但是,如果有檔案 package-lock.json 指定 1.2 版,則會安裝該版本。

以下是判斷已安裝套件版本的範例:

  • package.json如果和 package-lock.json 檔案同意版本規則,則不會有任何衝突。 例如,如果 package.json 指定 1.xpackage-lock.json 指定 1.4 版,則會安裝 1.4 版。
  • 如果 package.json 指定更特定的版本,例如 1.8.x,它會覆寫 package-lock.json 檔案,其會指出舊版 1.4。 在此情況下,如果有的話,將會安裝 1.8.0 版或更新版本的修補程式版本。

尋找並更新 npm 過時的套件

npm outdated命令可用來識別有較新版本可用的套件。 執行時,它會提供這些過時套件的清單:

Package       Current    Wanted   Latest     Location     Depended by
lodash        1.0.0      1.0.0    4.17.19    lock-test    main-code-file
node-fetch    1.2.0      1.2.0    2.6.0      lock-test    function-code-file

輸出中的資料行包括:

資料行 描述
Package 過期的套件。
目前 套件的目前安裝版本。
符合您在檔案中指定的 package.json 語意模式的最新版本。
最新 套件的最新版本。
Location 套件相依性的位置。 命令 outdated 會搜耙各種 node_modules 資料夾中所有已安裝的套件。
相依於 具有相依性的套件。

使用 npm 稽核管理安全性問題

每次安裝或更新套件時,您都會收到記錄回應,告訴您已安裝的版本,以及是否有任何弱點。 記錄會列出弱點。 如果您有任何重大或高弱點,您應該更新套件。

記錄回應的範例如下:

+ lodash@1.3.1
added 1 package from 4 contributors and audited 1 package in 0.949s
found 3 vulnerabilities (1 low, 2 high)
  run `npm audit fix` to fix them, or `npm audit` for details

若要修正問題並套用更新,您可以執行 npm audit 命令。 此命令會列出每個弱點。

npm audit fix命令會藉由升級至不存在問題的次要版本,嘗試解決弱點。 不過,如果修正程序實際上是在下一個主要版本中,可能無法使用。

在這種情況下,您可能需要使用 npm audit fix --force,這可以藉由更新至主要版本來引入重大變更。 執行此命令是您應該仔細做出的決策。 您應該注意重大變更,並使用 npm update 來更新程序代碼,包括弱點。

弱點是一個程式代碼缺陷,攻擊者可能會惡意執行惡意動作,可能會危害您的數據和系統。 請務必及時解決這些弱點。

由於經常發現弱點,GitHub 具有一項功能,可掃描存放庫,並自動建立建議升級至更安全版本的 PR。 定期執行 npm audit 是識別和修正弱點的好作法,有助於項目的整體安全性。

建議 的更新 工作流程為:

  1. npm run test:在啟動此更新程式之前,請先確認您現有的測試通過。
  2. npm audit:檢查您目前所使用的版本是否有弱點。 中的 npm audit 資訊可能會建議更新為主要版本。 如果列出任何變更,您應該仔細檢閱重大變更。
  3. npm outdated:列出所有過期的套件。 此命令會在 [所需]、[最新] 和 [位置] 資料行中提供資訊。
  4. 使用 npm update更新 :
    • 對於較小的專案(中的 package.json一些相依性:您可以嘗試 npm update 更新所有相依性,然後執行測試。
    • 對於較大的專案(在 中 package.json有許多相依性:更新單一套件或套件系列(例如 Next.js 和 React),然後執行測試。
  5. npm audit:檢查沒有重大或高弱點。 如果弱點仍然存在,請使用 npm update 套件名稱和 中 npm audit建議的主要版本。
  6. npm run test 再次。
  7. 簽入您的 package.jsonpackage-lock.json