管理您 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 中使用 install
或 update
命令來安裝套件。 這些命令現在大多可互換。 若要更新套件,您通常會使用:
- 最新版本:
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.json
,npm-shrinkwrap.json
而不是 。 慣用的其中一個例外npm-shrinkwrap.json
狀況是全域安裝精靈和命令行工具,開發人員想要確保已安裝所指定套件的確切版本。
套件版本的範例判斷
假設您在程式代碼中使用1.2版,然後發行1.4版,進而中斷程序代碼。 如果有人此時安裝您的應用程式,他們會收到非功能應用程式。 但是,如果有檔案 package-lock.json
指定 1.2 版,則會安裝該版本。
以下是判斷已安裝套件版本的範例:
package.json
如果和package-lock.json
檔案同意版本規則,則不會有任何衝突。 例如,如果package.json
指定1.x
並package-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
是識別和修正弱點的好作法,有助於項目的整體安全性。
建議的更新工作流程
建議 的更新 工作流程為:
npm run test
:在啟動此更新程式之前,請先確認您現有的測試通過。npm audit
:檢查您目前所使用的版本是否有弱點。 中的npm audit
資訊可能會建議更新為主要版本。 如果列出任何變更,您應該仔細檢閱重大變更。npm outdated
:列出所有過期的套件。 此命令會在 [所需]、[最新] 和 [位置] 資料行中提供資訊。- 使用
npm update
更新 :- 對於較小的專案(中的
package.json
一些相依性:您可以嘗試npm update
更新所有相依性,然後執行測試。 - 對於較大的專案(在 中
package.json
有許多相依性:更新單一套件或套件系列(例如 Next.js 和 React),然後執行測試。
- 對於較小的專案(中的
npm audit
:檢查沒有重大或高弱點。 如果弱點仍然存在,請使用npm update
套件名稱和 中npm audit
建議的主要版本。npm run test
再次。- 簽入您的
package.json
與package-lock.json
。