pnpm初探
pnpm 的優點
它解決了 npm/yarn 平鋪 node_modules 帶來的依賴項重復的問題 (doppelgangers)
假設存在依賴依賴:
.
├── package-a
│ └── lodash@4.0.0
├── package-b
│ └── lodash@4.0.0
├── package-c
│ └── lodash@3.0.0
└── package-d
└── lodash@3.0.0
那么不可避免地在 npm 或者 yarn 中,lodash@3.0.0 會被多次安裝,無疑造成了空間的浪費與諸多問題。
./node_modules/package-a
./node_modules/package-b
./node_modules/package-c
./node_modules/package-c/node_mdoules/lodash
./node_modules/package-d
./node_modules/package-d/node_mdoules/lodash
這是一個較為常見的場景,在平時項目中有些庫相同版本甚至會安裝七八次,如 postcss、ansi-styles、ansi- regex、braces 等,你們可以去你們的 yarn.lock/package-lock.json 中搜索一下。
而在 pnpm 中,它改變了 npm/yarn 的目錄結構,采用軟鏈接的方式,避免了 doppelgangers 問題更加節省空間。
它最終生成的 node_modules 如下所示,從中也可以看出它解決了幽靈依賴的問題。
./node_modules/package-a -> .pnpm/package-a@1.0.0/node_modules/package-a
./node_modules/package-b -> .pnpm/package-b@1.0.0/node_modules/package-b
./node_modules/package-c -> .pnpm/package-c@1.0.0/node_modules/package-c
./node_modules/package-d -> .pnpm/package-d@1.0.0/node_modules/package-d
./node_modules/.pnpm/lodash@3.0.0
./node_modules/.pnpm/lodash@4.0.0
./node_modules/.pnpm/package-a@1.0.0
./node_modules/.pnpm/package-a@1.0.0/node_modules/package-a
./node_modules/.pnpm/package-a@1.0.0/node_modules/lodash -> .pnpm/package-a@1.0.0/node_modules/lodash@4.0.0
./node_modules/.pnpm/package-b@1.0.0
./node_modules/.pnpm/package-b@1.0.0/node_modules/package-b
./node_modules/.pnpm/package-b@1.0.0/node_modules/lodash -> .pnpm/package-b@1.0.0/node_modules/lodash@4.0.0
./node_modules/.pnpm/package-c@1.0.0
./node_modules/.pnpm/package-c@1.0.0/node_modules/package-c
./node_modules/.pnpm/package-c@1.0.0/node_modules/lodash -> .pnpm/package-c@1.0.0/node_modules/lodash@3.0.0
./node_modules/.pnpm/package-d@1.0.0
./node_modules/.pnpm/package-d@1.0.0/node_modules/package-d
./node_modules/.pnpm/package-d@1.0.0/node_modules/lodash -> .pnpm/package-d@1.0.0/node_modules/lodash@3.0.0
如此,依賴 軟鏈接 的方式,可解決重復依賴安裝 (doppelgangers) 的問題,「如果一個項目占用 1000 MB,那么使用 pnpm
可能僅占用 800 MB」
然而它除此之外,還有一個最大的好處,「如果一個項目占用 1000 MB,傳統方式十個項目占用 10000 MB,那么使用 pnpm 可能僅占用 3000
MB」,而它得益于硬鏈接。
再借用以上示例,lodash@3.0.0 與 lodash@4.0.0 會生成一個指向全局目錄的硬鏈接,如果新項目依賴二者,則可復用存儲空間。
./node_modules/.pnpm/lodash@3.0.0 -> hardlink
./node_modules/.pnpm/lodash@4.0.0 -> hardlink
關于軟鏈接/硬鏈接
假設我們有一個文件,稱為 hello
通過 ln -s 創建一個軟鏈接,通過 ln 可以創建一個硬鏈接。
$ ln -s hello hello-soft
$ ln hello hello-hard
$ ls -lh
total 768
45459612 -rw-r--r-- 2 xiange staff 153K 11 19 17:56 hello
45459612 -rw-r--r-- 2 xiange staff 153K 11 19 17:56 hello-hard
45463415 lrwxr-xr-x 1 xiange staff 5B 11 19 19:40 hello-soft -> hello
他們的區別有以下幾點:
軟鏈接可理解為指向源文件的指針,它是單獨的一個文件,僅僅只有幾個字節,它擁有獨立的 inode
硬鏈接與源文件同時指向一個屋里地址,它與源文件共享存儲數據,它倆擁有相同的 inode
總結
- 上一篇: N皇后——最小冲突算法一个相对高效的实现
- 下一篇: 夏天穿短裤中间往上跑怎么办 短裤走路上窜