現在有不少項目都轉向使用了pnpm,它能幫我們節約磁碟空間並提升包的安裝速度,但是也沒有帶來很多使用習慣上的遷移,npm中的命令在pnpm中大多都是能用的,我們可以方便的切換到pnpm中進行開發。為何不嘗試一下呢?本文就介紹了pnpm中基本的原理,很常用的命令,讓你方便快速的瞭解並使用它。 ...
基本原理
前置知識:軟體鏈接與硬鏈接
軟鏈接(符號鏈接Symbolic link):是一類特殊的文件, 其包含有一條以絕對路徑或者相對路徑的形式指向其它文件或者目錄的引用。在window快捷方式上和其功能類似。
硬鏈接:是電腦文件系統中的多個文件平等地共用同一個文件存儲單元(如MFT條目、inode)。硬鏈接必須在同一個文件系統中;一般用戶許可權下的硬鏈接只能用於文件,不能用於目錄,因為其父目錄就有歧義了。
熟悉Linux的朋友就很容易就能區分理解這兩個東西了。(mac同)創建的命令分別是:
# 創建硬鏈接
$ ln target_file link_name
# 創建軟鏈接
$ ln -s target_file link_name
$ ln -s target_directory link_name
當然在windows中使用mklink
也能夠創建軟鏈接和硬鏈接
# 創建硬鏈接
mklink /H link_name target_file
# 創建軟鏈接
mklink target_file link_name
創建非扁平化的 node_modules 文件夾
這是官網的一張說明其非扁平化 node_modules的圖,可能不是很明白,我們可以對比著npm
會比較明白。分別使用npm和pnpm安裝axios
。
PS G:\npm_demo> npm install axios
added 9 packages in 1s
PS G:\pnpm_demo> pnpm add axios
Packages: +9
+++++++++
Packages are hard linked from the content-addressable store to the virtual store.
Content-addressable store is at: G:\.pnpm-store\v3
Virtual store is at: node_modules/.pnpm
Progress: resolved 9, reused 6, downloaded 3, added 9, done
dependencies:
+ axios 1.2.2
Done in 2.8s
npm安裝axios的時候,axios的依賴會放在和axios同一級,這樣做的好處是,如果別的包也同樣使用了這些依賴,就不用重新導入了。但是缺點是,我們在項目中也能直接去應用axios依賴導入的包。但我們自身的項目卻是沒有依賴那些包的。要是哪天移除了axios,那項目中可能就會出錯了,也就是幽靈依賴。
切換node版本原理
-
在我們配置了系統環境變數之後,命令行中使用命令時,系統就會到配置的路徑中去尋找是否有支持命令的軟體,然後執行命令。
-
在安裝pnpm的時候,它會在我們的環境變數中添加它自己文件夾的路徑,比如在我電腦中它的路徑是:
C:\Users\Administrator\AppData\Local\pnpm
,它的目錄結構如下:
-
當我們使用pnpm切換node版本的時候,沒有對應的版本它則會下載對應版本的node,然後在將其創建了鏈接(軟鏈接)到pnpm的根目錄中。就相當於當前環境變數中有了對應版本的node了。
快速使用
安裝
安裝了node可以使用npm安裝
npm install -g pnpm
沒有也可以直接在powershell中使用命令進行安裝
iwr https://get.pnpm.io/install.ps1 -useb | iex
安裝過程中,若許可權足夠它會在自動在系統中添加環境變數。
常用命令(基本與npm一致)
npm 命令 | pnpm 等效 |
---|---|
npm install | pnpm install |
npm i |
pnpm add |
npm run |
pnpm |
刪除相關依賴
pnpm remove -D # 刪除開發環境 devDependencies 中的依賴項
pnpm rm -P # 刪除dependencies 中相關依賴項
pnpm uninstall -g # 全局中刪除
pnpm prune # 移除沒有在項目中使用的packages
管理node版本
pnpm env use --global lts # 安裝lts版node
pnpm env use --global 18 # 安裝v18版node
pnpm env use --global latest # 安裝最新node
pnpm env remove --global 14.0.0 # 移除指定版本node
pnpm env list # 查看本地有的node版本
pnpm env list --remote # 查看網路源可用的node版本
其它命令
pnpm create react-app my-app
pnpm start # 別名 run start
常用配置
package.json
{
// 指定你的軟體能夠運行的 Node 版本和 pnpm 版本
"engines": {
"node": ">=10",
"pnpm": ">=3"
},
"pnpm": {
// 忽略依賴問題的警告
"peerDependencyRules": {
"ignoreMissing": ["@babel/*", "@eslint/*"]
}
}
}