<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天給大家介紹一種新的包管理器:pnpm,pnpm 由 zkochan 開發,最初也是在用 npm 或者 yarn 遇到了一些不爽的地方,於是自己做了一個開源的包管理器,也為優化包管理提供了一種不同的新思路,接下來我們就看一下為何要使用 pnpm,以及他能做什麼
值得一提的是,zkochan 也是一名烏克蘭的開發者,他也在主頁呼籲大家援助一下烏克蘭,我也希望當前的國際局勢能更快的穩定下來,不要損失這麼優秀的開發者
一句話概括就是:節約磁碟空間並提升安裝速度
設想一下,假如公司的每個專案都用了 vue 全家桶,那麼每個專案都需要安裝 vue、vue-router、vuex、axios 等幾乎相同的庫,如果有 100 個專案,那就要重複安裝 100 遍!!,要知道,現如今,硬碟雖然便宜,但也沒那麼多插槽啊,更別說筆記型電腦這寸土寸金的資源空間。
因此,pnpm 的核心就是將所有的包都存放在一個資源倉庫中,而每個專案的 node_modules 通過軟連結的形式將包連結到資源倉庫中,這樣不僅節省了空間,同時也加快了安裝速度
pnpm 的另一個優點,在保留了非扁平化的 node_modules 資料夾,同時節省了空間
我們簡單回顧一下 npm 的發展歷史
1.最初,npm 只是簡單的通過依賴去遞迴的安裝包,所有的依賴放在相應的包資料夾下面,假如 A 依賴了 foo,B 也依賴了 foo,那麼就會有兩份 foo 安裝在 node_modules
node_modules ├── A │ └── node_modules │ └── foo └── B └── node_modules └── foo
2.經過一次優化, npm 為了節省空間,採用了扁平化的 node_modules,這樣,假如 A 和 B 都依賴了 foo,那麼 foo 會提升至頂層,也就是說 node_modules 資料夾裡的包會變成 A、B、foo
node_modules ├── A ├── B └── foo
這樣的好處是,同一個包 foo 只會有一份,節省了空間,但是引入了一個新的問題,參照混亂!!。
試想一下,我們的專案依賴本來只有 A 和 B,假如你想 import foo,肯定是找不到的,但是扁平化的結果,將 A 和 B 的依賴層級提升到了頂級,這樣,我們直接參照 foo,其實也不會報錯,但實際上我們並沒有指定依賴 foo,導致了使用上的混亂,假如有一天,A 和 B 都不依賴於 foo 了,那我們的專案或者說我提供的包就會報錯
這個不良的行為其實已經默默的融入我們的開發中,當我們使用 ant-design 時,我們可以直接使用 moment,當我們使用 axios 時,我們可以直接使用 qs,當我們使用 webpack 時,我們可以直接使用 lodash,而無需額外的安裝包
假設我們的專案依賴 foo 包,而 foo 又依賴 bar 包,那麼 pnpm 安裝後的實際 node_modules 結果如下
node_modules ├── foo -> ./.pnpm/foo@1.0.0/node_modules/foo └── .pnpm ├── bar@1.0.0 │ └── node_modules │ └── bar -> <store>/bar └── foo@1.0.0 └── node_modules ├── foo -> <store>/foo └── bar -> ../../bar@1.0.0/node_modules/bar
我們分析一下這個目錄結構
如果新增 qar@2.0.0 作為 bar 和 foo 的依賴項,那麼結果會變成
node_modules ├── foo -> ./.pnpm/foo@1.0.0/node_modules/foo └── .pnpm ├── bar@1.0.0 │ └── node_modules │ ├── bar -> <store>/bar │ └── qar -> ../../qar@2.0.0/node_modules/qar ├── foo@1.0.0 │ └── node_modules │ ├── foo -> <store>/foo │ ├── bar -> ../../bar@1.0.0/node_modules/bar │ └── qar -> ../../qar@2.0.0/node_modules/qar └── qar@2.0.0 └── node_modules └── qar -> <store>/qar
curl -fsSL https://get.pnpm.io/install.sh | PNPM_VERSION=7.0.0-rc.2 sh -
或者
wget -qO- https://get.pnpm.io/install.sh | PNPM_VERSION=7.0.0-rc.2 sh -
npm install -g pnpm@next-7
brew install pnpm
簡單的通過 pnpm 自己的命令升級即可
pnpm add -g pnpm
大部分設定可以直接使用 npm 的設定,與之區別的是有些設定可能是 pnpm 專有的,例如:
# 設定倉庫路徑 pnpm config set store-dir /path/to/.pnpm-store
安裝依賴
pnpm install # 其他一些引數 --offline 僅從 store 中離線下載 --dev, -D 只下載 devDependencies 依賴 --frozen-lockfile 不會生成 lockfile --shamefully-hoist 建立扁平結構,類似於 npm ,不推薦
2. 增加依賴
pnpm add <pkg>
這裡 pnpm 有多種增加方式
在 workspace 中,會先檢查 workspace 是否有相應包,至於 workspace 是什麼,在下面會詳細說道
從本地安裝: 例如你想偵錯開發的包時
pnpm add ./package.tar.gz pnpm add ./some-directory
從遠端安裝 Tar 包
pnpm add https://github.com/indexzero/forever/tarball/v0.5.6
從 git 安裝
pnpm add <git remote url>
# 其他一些引數 --save-dev, -D 安裝為 devDependencies,也就是開發環境使用的包 --save-peer 安裝為 peerDependencies ,同時安裝到 devDependencies, peerDependencies 通常是和該包一起使用的其他包,需要使用者同時下載 --global, -g 安裝為全域性依賴
釋出依賴
pnpm [-r] publish [<tarball|folder>] [--tag <tag>] [--access <public|restricted>] [options] --no-git-checks 不檢查當前分支是否是可釋出分支,是否有沒有提交的程式碼,直接釋出 --dry-run 執行釋出包的所有流程,但唯獨不會真正把包釋出到源上,這個在測試釋出的時候非常有用 -r 遞迴的執行釋出命令,通常在 workspace 中使用
這裡只列出常用的一些,更多的命令可以參考官網
npm 命令 | pnpm 等效 |
---|---|
npm install | pnpm install |
npm i | [pnpm add ] |
npm run | [pnpm ] |
功能 | pnpm | Yarn | npm |
---|---|---|---|
工作空間支援(monorepo) | ✔️ | ✔️ | ✔️ |
隔離的 node_modules | ✔️ - 預設 | ✔️ | ❌ |
提升的 node_modules | ✔️ | ✔️ | ✔️ - 預設 |
Plug'n'Play | ✔️ | ✔️ - 預設 | ❌ |
零安裝 | ❌ | ✔️ | ❌ |
修補依賴項 | ❌ | ✔️ | ❌ |
管理 Node.js 版本 | ✔️ | ❌ | ❌ |
有鎖檔案 | ✔️ - pnpm-lock.yaml | ✔️ - yarn.lock | ✔️ - package-lock.json |
支援覆蓋 | ✔️ | ✔️ - 通過 resolutions | ✔️ |
內容可定址儲存 | ✔️ | ❌ | ❌ |
動態包執行 | ✔️ - 通過 pnpm dlx | ✔️ - 通過 yarn dlx | ✔️ - 通過 npx |
Monorepo 由兩個單片語成,Mono 指的是單個(single),repo 指的是專案儲存(Repository),合起來意思就是說,大量的專案儲存在單一的庫中,用人話講就是,不同的專案都寫在一個 git 庫裡,第一次聽到這個概念的時候大家肯定覺得這人指定有什麼大病,這麼多專案放一起,大家在裡面各種修改,一個人專案修改了,另一個不相干的專案肯定還得更新程式碼,這不是技術倒退麼,這個其實還真就是 Monorepo 的缺點,但是靜下心來考慮,他的優點也還是很多的,例如:
這裡插一句,很多公司的專案說是獨立的,其實都是從已有的專案中各種複製來的,連帶著以前的 bug 也都有了,還不如放一起呢
說完了 Monorepo ,離真正應用還是有點差距,多個專案之間需要保證自己的獨立性,還需要能方便的根據其他專案的變動做出相應的改變,目前市面上也有很多其他的方便管理 Monorepo 的工具,例如:lernajs,幸運的是,pnpm 也對 Monorepo 有著良好的支援,pnpm 稱他為 workspace
值得一提的是,vite 也對 Monorepo 做了支援,這使得當參照的其他庫發生變化時,正在使用 vite dev 開發的專案也會熱更新,詳細可見Monorepo 和連結依賴
pnpm 可以建立一個 workspace 將多個專案合併到一箇中,一個 workspace 的根目錄下必須有 pnpm-workspace.yaml 檔案,常見的 pnpm-workspace.yaml 類似於下面這種設定,可以定義哪些檔案或者資料夾應該包含於 workspace 中
packages: # all packages in subdirs of packages/ and components/ - 'packages/**' - 'components/**' # exclude packages that are inside test directories - '!**/test/**'
在 workspace 根目錄使用 pnpm install 命令時,會自動將 workspace 中的所有專案執行 pnpm install
pnpm 支援協定 workspace:,當使用這個協定時,pnpm 只會解析本地 workspace 中的包,workspace: 協定的使用方法和 package.json 參照包的方法一致
"foo": "workspace:*" "foo": "workspace:../foo" "foo": "workspace:~", "foo": "workspace:^", "zoo": "workspace:^1.5.0"
當需要釋出包時,例如使用 pnpm pack 或者 pnpm publish 命令時,將動態的把 workspace: 協定替換為真正的版本號
pnpm 目前被越來越多的人使用,其中也包括 vue 這樣的一線開源框架,具體可以參見 使用範例
在諸如 pnpm 或者 yarn 這樣的開源專案影響下,npm 也在反思自己,也及時的做出了更新,例如:支援 workspace 等功能,希望這樣的良性迴圈也讓 js 社群越來越好,或許有一天我還會重投 npm 的懷抱也說不定
以上就是使用pnpm包管理器替代npm及yarn的命令範例的詳細內容,更多關於pnpm包管理器替代npm及yarn命令的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45