幽靈依賴與常見依賴管理

文章目錄

  • 前言
      • 1. 演示:檢測和修復幽靈依賴
        • 步驟1:安裝 depcheck
        • 步驟2:在項目根目錄運行 depcheck
        • 可能的輸出
        • 步驟3:修復幽靈依賴
      • 2. 依賴管理的好習慣
    • 1. 場景設定
      • 現在有如下依賴需求:
    • 2. 依賴沖突的表現
    • 3. 解決依賴沖突的方法
      • 方法一:統一依賴版本
      • 方法二:強制安裝多版本(不推薦,除非特殊需求)
    • 4. 實際操作演示
        • 統一依賴版本
    • 5. 檢查依賴沖突
    • 總結


前言

實際項目中發現和修復幽靈依賴問題,并給出常見依賴管理的好習慣。


1. 演示:檢測和修復幽靈依賴

假設你的 package.json 如下(只聲明了 lodash):

{"name": "root","private": true,"workspaces": ["packages/*"],"devDependencies": {"lerna": "^7.1.5"},"volta": {"node": "18.17.1"}
}

假設你在某個包的代碼里寫了如下內容:

const _ = require('lodash');
const moment = require('moment'); // 實際未聲明依賴

步驟1:安裝 depcheck
npm install -g depcheck

步驟2:在項目根目錄運行 depcheck
depcheck

可能的輸出
Missing dependencies
* moment

這說明你的代碼用到了 moment,但 package.json 沒有聲明。


步驟3:修復幽靈依賴

執行:

npm install moment --save

這樣 moment 就會被正確聲明到 dependencies 里,幽靈依賴問題解決。


2. 依賴管理的好習慣

  • 用到什么依賴就聲明什么依賴,不要依賴于“間接依賴”。
  • 定期用 depcheck 或類似工具檢查項目依賴的準確性。
  • 刪除未使用的依賴,保持 package.json 干凈。
  • 對于 Monorepo 項目,每個包都要單獨管理自己的依賴。

下面通過一個實際例子,演示在 Monorepo(如你當前的 Lerna + Yarn/NPM Workspaces 項目)下,子包的依賴管理和依賴沖突的解決方法。


1. 場景設定

假設你的 Monorepo 結構如下:

packages/header/package.jsonfooter/package.jsonremixapp/package.json

現在有如下依賴需求:

  • header 依賴 react@17.0.2
  • footer 依賴 react@18.1.0
  • remixapp 依賴 react@18.1.0

2. 依賴沖突的表現

如果你分別在 headerfooterpackage.json 里聲明不同版本的 react,再在根目錄執行 yarn installnpm install,包管理器會嘗試“扁平化”依賴,但如果版本沖突無法合并,會出現如下情況:

  • node_modules/react 只會有一個版本(比如 18.1.0),
  • header 代碼如果用到了 17.x 的特性,可能會報錯或行為異常。

3. 解決依賴沖突的方法

方法一:統一依賴版本

最佳實踐是在 Monorepo 根目錄的 package.json 里統一聲明所有子包的公共依賴(如 react),并保證版本一致:

{// ... 其他配置 ..."devDependencies": {"lerna": "^7.1.5","react": "18.1.0","react-dom": "18.1.0"}
}

然后在各子包的 package.json去掉react 的聲明,或者用 peerDependencies 指定兼容范圍:

{// ... 其他配置 ..."peerDependencies": {"react": ">=18.0.0","react-dom": ">=18.0.0"}
}

這樣,所有包都用同一份 react,避免沖突。


方法二:強制安裝多版本(不推薦,除非特殊需求)

如果確實有包必須依賴不同版本,可以在子包的 node_modules 里安裝特定版本(但會導致包體積變大,依賴樹復雜,維護困難)。


4. 實際操作演示

統一依賴版本
  1. 在根目錄添加依賴:
npm install react@18.1.0 react-dom@18.1.0 --save-dev
  1. 在子包 footer/package.json 里改為 peerDependencies:
// ... 省略 ..."peerDependencies": {"react": ">=18.0.0","react-dom": ">=18.0.0"},
// ... 省略 ...
  1. 刪除子包 dependencies 里的 react/ react-dom,保存后重新安裝依賴:
npm install

5. 檢查依賴沖突

可以用如下命令檢查依賴樹:

npm ls react

在這里插入圖片描述

如果所有包都指向同一個版本,說明依賴沖突已解決。


總結

  • Monorepo 下建議在根目錄統一管理公共依賴,子包用 peerDependencies 聲明兼容范圍。
  • 避免各子包聲明不同版本的同一依賴,否則會出現沖突和幽靈依賴等問題。
  • 定期用 npm lsyarn why 檢查依賴樹,確保依賴一致性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76498.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76498.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76498.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何使用人工智能大模型,免費快速寫工作總結?

如何使用人工智能大模型,免費快速寫工作總結? 詳細學習視頻https://edu.csdn.net/learn/40406/666581

[Java實戰經驗]異常處理最佳實踐

一些好的異常處理實踐。 目錄 異常設計自定義異常為異常設計錯誤代碼(狀態碼)設計粒度全局異常處理異常日志信息保留 異常處理時機資源管理try-with-resources異常中的事務 異常設計 自定義異常 自定義異常設計,如業務異常定義BusinessExce…

Makefile 入門指南

Makefile 入門指南 最簡單的例子 單文件編譯 假設我們有一個main.cpp文件,最簡單的Makefile如下: # 最簡單的單文件編譯 # 目標:依賴文件 main: main.cpp# 編譯命令g main.cpp -o main使用步驟: 將上述內容保存為名為Makefile的文件&…

PyTorch數據操作基礎教程:從張量創建到高級運算

本文通過示例代碼全面講解PyTorch中張量的基本操作,包含創建、運算、廣播機制、索引切片等核心功能,并提供完整的代碼和輸出結果。 1. 張量創建與基本屬性 import torch# 創建連續數值張量 x torch.arange(12, dtypetorch.float32) print("原始張…

【Redis】Redis中的常見數據類型(一)

文章目錄 前言一、Redis前置知識1. 全局命令2、數據結構和內部編碼3. 單線程架構 二、String 字符串1. 常見命令2. 計數命令3.其他命令4. 內部編碼5. 典型使用場景 三、Hash哈希1. 命令2.內部編碼3. 使用場景4. 緩存方式對比 結語 前言 Redis 提供了 5 種數據結構,…

Windows 中使用 `netstat` 命令查看端口占用

在 Windows 系統中,可以通過 netstat 命令來查看當前系統的網絡連接以及端口的占用情況。以下是關于該命令的具體說明: #### 使用方法 1. **查看所有端口及其狀態** 可以通過以下命令查看系統中的所有活動連接和監聽端口: bash net…

23種設計模式-結構型模式之裝飾器模式(Java版本)

Java 裝飾器模式(Decorator Pattern)詳解 🎁 什么是裝飾器模式? 裝飾器模式是一種結構型設計模式,允許向一個對象動態添加新的功能,而不改變其結構。 🧱 你可以想象成在原有功能上“包裹”一…

解決模擬器打開小紅書設備異常問題

解決模擬器打開小紅書設備異常問題 解決模擬器打開小紅書設備異常問題和無法打開問題 解決模擬器打開小紅書設備異常問題和無法打開問題 問題描述 最近有用戶反饋在模擬器上無法正常登錄和打開小紅書APP,系統提示"設備異常"錯誤。本文將詳細介紹如何通過…

論文閱讀:2025 arxiv AI Alignment: A Comprehensive Survey

總目錄 大模型安全相關研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Alignment: A Comprehensive Survey 人工智能對齊:全面調查 https://arxiv.org/pdf/2310.19852 https://alignmentsurvey.com/ https://www.doubao.com/cha…

精益數據分析(1/126):從《精益數據分析》探尋數據驅動增長之道

精益數據分析(1/126):從《精益數據分析》探尋數據驅動增長之道 在當今數字化時代,數據無疑是企業發展的關鍵驅動力,對于競爭激烈的程序化廣告行業更是如此。最近我在研讀《精益數據分析》這本書,收獲頗豐&…

第五節:React Hooks進階篇-如何用useMemo/useCallback優化性能

反模式:濫用導致的內存開銷React 19編譯器自動Memoization原理 React Hooks 性能優化進階:從手動到自動 Memoization (基于 React 18 及以下版本,結合 React 19 新特性分析) 一、useMemo/useCallback 的正確使用場景…

windows server C# IIS部署

1、添加IIS功能 windows server 2012、windows server 2016、windows server 2019 說明:自帶的是.net 4.5 不需要安裝.net 3.5 盡量使用 windows server 2019、2016高版本,低版本會出現需要打補丁的問題 2、打開IIS 3、打開iis應用池 .net 4.5 4、添…

Elasticsearch的Java客戶端庫QueryBuilders查詢方法大全

matchAllQuery 使用方法:創建一個查詢,匹配所有文檔。 示例:QueryBuilders.matchAllQuery() 注意事項:這種查詢不加任何條件,會返回索引中的所有文檔,可能會影響性能,特別是文檔數量很多時。 ma…

C#進階學習(六)單向鏈表和雙向鏈表,循環鏈表(下)循環鏈表

目錄 📊 鏈表三劍客:特性全景對比表 一、循環鏈表節點類 二、循環鏈表的整體設計框架 三、循環列表中的重要方法: (1)頭插法,在頭結點前面插入新的節點 (2)尾插法實現插入元素…

交換網絡基礎

學習目標 掌握交換機的基本工作原理 掌握交換機的基本配置 交換機的基本工作原理 交換機是局域網(LAN)中實現數據高效轉發的核心設備,工作在 數據鏈路層(OSI 模型第二層),其基本工作原理可概括為 “學習…

科學研究:怎么做

科研(科學研究)?? 是指通過系統化的方法,探索自然、社會或人文領域的未知問題,以發現新知識、驗證理論或解決實際問題的活動。它的核心是??基于證據的探索與創新??,旨在推動人類認知和技術的進步。 科研的核心要…

算法題(128):費解的開關

審題: 本題需要我們將多組測試用例中拉燈數小于等于6的最小拉燈數輸出,若拉燈數最小值仍大于6,則輸出-1 思路: 方法一:二進制枚舉 首先我們先分析一下基本特性: 1.所有的燈不可能重復拉:若拉的數…

MFC文件-屏幕錄像

下載本文件 本文件將獲取屏幕圖像數據的所有代碼整合到兩個文件中(ScreenRecorder.h和ScreenRecorder.cpp),使獲取屏幕圖像數據變得簡單。輸出IYUV視頻流。還可以獲取系統播放的聲音,輸出PCM音頻流。由于使用了MFC類,本…

0801ajax_mock-網絡ajax請求1-react-仿低代碼平臺項目

0 vite配置proxy代理 vite.config.ts代碼如下圖所示: import { defineConfig } from "vite"; import react from "vitejs/plugin-react";// https://vite.dev/config/ export default defineConfig({plugins: [react()],server: {proxy: {&qu…

JVM筆記【一】java和Tomcat類加載機制

JVM筆記一java和Tomcat類加載機制 java和Tomcat類加載機制 Java類加載 * loadClass加載步驟類加載機制類加載器初始化過程雙親委派機制全盤負責委托機制類關系圖自定義類加載器打破雙親委派機制 Tomcat類加載器 * 為了解決以上問題,tomcat是如何實現類加載機制的…