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

已完成

Tailwind Traders 要求您處理具有一些過時相依性的應用程式。 此應用程式很小,而且只有一些相依性。 更新程式碼應該很簡單。 看看您是否可以更新應用程式,以充分利用最新功能。 執行此動作時,如果您發現任何弱點,請加以修正。

開始使用

  1. 在新的終端機視窗中 (Ctrl + Shift + `),變更為具有此練習檔案的資料夾:

    cd ../7-exercise-dependency-management
    
  2. 執行下列命令以安裝相依性:

    npm install
    

    您應該會看到關於已安裝套件和任何弱點的輸出。

  3. 開啟 package.json 檔案,並找出 dependencies 區段:

    "lodash": "^1.1.0",
    "node-fetch": "^1.0.2"
    

    請注意,模式會指定插入 (^) 字元,這表示次要版本的更新以支援相依性:1.x

  4. 開啟 index.js 檔案,以了解套件相依性在應用程式中的使用情況:

    const fetch = require('node-fetch')
    const _ = require('lodash');
    const path = require('path');
    const fs = require('fs');
    
    async function run() {
      const response = await fetch("https://dev.to/api/articles?state=rising");
      const json = await response.json();
      const sorted = _.sortBy(json, ["public_reactions_count"], ['desc']);
      const top3 = _.take(sorted, 3);
    
      const filePrefix = new Date().toISOString().split('T')[0];
      fs.writeFileSync(path.join(__dirname, `${filePrefix}-feed.json`), JSON.stringify(top3, null, 2));
    }
    
    run();
    

    此程式碼會使用 node-fetch 套件,從 REST API 提取資料。 其會透過使用 lodash 套件,以排序回應並取得前三個結果來加以處理。 結果會儲存在檔案中。

npm audit

若要了解是否有任何弱點,請執行此命令:

npm audit

您應該會看到如以下範例所示的輸出:

# npm audit report

lodash  <=4.17.20
Severity: critical
Regular Expression Denial of Service (ReDoS) in lodash - https://github.com/advisories/GHSA-x5rq-j2xg-h7qm
Prototype Pollution in lodash - https://github.com/advisories/GHSA-fvqr-27wr-82fm
Prototype Pollution in lodash - https://github.com/advisories/GHSA-jf85-cpcp-j695
Command Injection in lodash - https://github.com/advisories/GHSA-35jh-r3h4-6jhm
Prototype Pollution in lodash - https://github.com/advisories/GHSA-4xc9-xhrj-v574
Regular Expression Denial of Service (ReDoS) in lodash - https://github.com/advisories/GHSA-29mw-wpgm-hmr9
fix available via `npm audit fix --force`
Will install lodash@4.17.21, which is a breaking change
node_modules/lodash

node-fetch  <=2.6.6
Severity: high
The `size` option isn't honored after following a redirect in node-fetch - https://github.com/advisories/GHSA-w7rc-rwvf-8q5r
node-fetch forwards secure headers to untrusted sites - https://github.com/advisories/GHSA-r683-j2x4-v87g
fix available via `npm audit fix --force`
Will install node-fetch@3.3.2, which is a breaking change
node_modules/node-fetch

2 vulnerabilities (1 high, 1 critical)

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

輸出會指出弱點以及可修正該問題的套件版本。

Will install lodash@4.17.21, which is a breaking change
Will install node-fetch@3.3.2, which is a breaking change

npm outdated

在終端機中,執行此命令以檢查過時的相依性:

npm outdated

您應該會看到如以下範例所示的輸出:

Package     Current  Wanted   Latest  Location                 Depended by
lodash        1.3.1   1.3.1  4.17.21  node_modules/lodash      7-exercise-dependency-management
node-fetch    1.7.3   1.7.3    3.3.2  node_modules/node-fetch  7-exercise-dependency-management

目前的版本和想要的版本相同,但最新版本不同。 已符合 package.json 中指定的語意更新策略,但弱點仍然存在。

npm update

  1. 編輯 package.json 檔案,明確允許進行重大變更,以從更重要的套件開始修正弱點:

    "node-fetch": "^2.6.6"
    
  2. 執行此命令以查看更新會進行的作業:

    npm update --dry-run
    
    added 3 packages, removed 4 packages, and changed 1 package in 508ms
    
  3. 執行此命令,以根據 package.json 更新專案:

    npm update
    
  4. 執行此命令,以確認 node-fetch 的弱點已修正:

    npm audit
    
    # npm audit report
    
    lodash  <=4.17.20
    Severity: critical
    Regular Expression Denial of Service (ReDoS) in lodash - https://github.com/advisories/GHSA-x5rq-j2xg-h7qm
    Prototype Pollution in lodash - https://github.com/advisories/GHSA-fvqr-27wr-82fm
    Prototype Pollution in lodash - https://github.com/advisories/GHSA-jf85-cpcp-j695
    Command Injection in lodash - https://github.com/advisories/GHSA-35jh-r3h4-6jhm
    Prototype Pollution in lodash - https://github.com/advisories/GHSA-4xc9-xhrj-v574
    Regular Expression Denial of Service (ReDoS) in lodash - https://github.com/advisories/GHSA-29mw-wpgm-hmr9
    fix available via `npm audit fix --force`
    Will install lodash@4.17.21, which is a breaking change
    node_modules/lodash
    
    1 critical severity vulnerability
    
    To address all issues (including breaking changes), run:
      npm audit fix --force
    
  5. 如果您的專案有任何測試,請執行這些測試以驗證更新未造成任何破壞。

  6. 使用相同的步驟將 lo-dash 更新至沒有弱點的 4.17.20 版本。

    弱點已修正,但 node-fetch 版本仍落後一個主要版本。 如果所有測試都通過,請將 package.json 檔案中指定的版本更正為最新版本:

    "node-fetch": "^3.3.2"
    
  7. 然後,執行下列命令來更新專案:

    npm update
    

    您的專案現在應該沒有 npm 弱點了,且已使用目前的主要版本。

  8. 簽入您的 package.jsonpackage-lock.json 檔案。

    恭喜! 您已更新相依性並修正專案中的弱點。

清除開發容器

完成專案之後,您可能想要清除開發環境,或使其回到一般狀態。

  • 遠端開發 (瀏覽器)
  • 本機開發 (Docker)

刪除 GitHub Codespaces 環境,可確保您可將您為帳戶取得的每個核心免費時數權利數量最大化。

重要

如需 GitHub 帳戶權利的詳細資訊,請參閱 GitHub Codespaces 每月包含的儲存體和核心時數

  1. 登入 GitHub Codespaces 儀表板 (https://github.com/codespaces)。

    執行中 Codespaces 的螢幕擷取畫面,包括其狀態和範本。

  2. 開啟 Codespace 的操作功能表,然後選取 [刪除]。

    單一 Codespace 的操作功能表 (已醒目提示刪除選項) 螢幕擷取畫面。