npm@3之前
- 依賴樹層級過深,導致依賴路徑過長
- 并且相同依賴模塊會被重復安裝,占用電腦磁盤空間
npm@3之后
修改為扁平化處理
- 算法復雜
- 存在多項目間依賴相同副本的情況
- 導致沒有明確被依賴的包也可以直接引用,管理復雜
pnpm
node_modules改成非扁平化結構,并且改為使用硬鏈+軟鏈的形式
軟鏈接:創建的快捷方式,其實保存的只是一個地址
硬鏈接:磁盤具體的引用路徑
- 所有的文件被實際安裝在.pnpm-store文件夾下面(使用 pnpm store path 查看),node_modules下面依賴會最終通過硬鏈接的形式鏈接到該文件夾,保證了不同項目間共享相同依賴版本的使用,減少依賴包副本
- node_modules下面的直屬依賴都是軟鏈接的形式,鏈接到.pnpm文件下面的指定依賴
- 在.pnpm對應直屬依賴的node_modules中,分為兩種鏈接。其中直屬依賴本身使用的是硬鏈接鏈接到.pnpm-store文件夾里面;而剩余的其他依賴包是使用軟鏈接 鏈接到.pnpm文件下面的指定依賴。所以!!!!只有找到依賴自身,才會通過硬鏈接找到磁盤中的位置,這樣可以保證同一個項目里不同依賴也不會重復安裝,同時不同項目之間的相同依賴也無需在磁盤中存儲多份
例如:根目錄下 axios 軟鏈接到 .pnpm 目錄下的 axios 文件夾中,展開 .pnpm/axios@16.1 的node_modules 文件夾,其中有 axios 所需的依賴,包含 axios、follow-redirects、form-data、proxy-from-env,其中 axios硬鏈接到磁盤中(即與 pnpm 倉庫保存的地址一致),其它文件軟鏈接到 .pnpm 的自身位置。
- 優點1: 對于非明確依賴的包做隔離
- 優點2: 不同項目的相同依賴只存在一個副本,避免了重復依賴重復安裝,節約磁盤空間
- 優點3: 同一依賴包的不同版本,那么只有版本之前不用的文件被存儲起來
- 優點4: 避免了循環引用和層級過深的問題(都在.pnpm-store文件夾的第一層)