yarn 簡介
yarn 官網:https://www.yarnpkg.com/zh-Hans/
yarn 是由Facebook、Google、Exponent 和 Tilde 聯合推出了一個新的 JS 包管理工具,它仍然使用 npm 的registry,不過提供了全新 CLI 來對包進行管理
過去,yarn 的出現極大的搶奪了 npm 的市場,甚至有人戲言,npm 只剩下一個 registry 了。
之所以會出現這種情況,是因爲在過去,npm 存在下面的問題:
- 依賴目錄嵌套層次深:過去,npm 的依賴是嵌套的,這在 windows 系統上是一個極大的問題,由於衆所周知的原因,windows 系統無法支持太深的目錄
- 下載速度慢
- 由於嵌套層次的問題,所以npm對包的下載只能是串行的,即前一個包下載完後纔會下載下一個包,導致帶寬資源沒有完全利用
- 多個相同版本的包被重複的下載
- 控制檯輸出繁雜:過去,npm 安裝包的時候,每安裝一個依賴,就會輸出依賴的詳細信息,導致一次安裝有大量的信息輸出到控制檯,遇到錯誤極難查看
- 工程移植問題:由於 npm 的版本依賴可以是模糊的,可能會導致工程移植後,依賴的確切版本不一致。
針對上述問題,yarn 從誕生那天就已經解決,它用到了以下的手段:
- 使用扁平的目錄結構
- 並行下載
- 使用本地緩存
- 控制檯僅輸出關鍵信息
- 使用yanr-lock文件記錄確切依賴
不僅如此,yarn還優化了以下內容:
- 增加了某些功能強大的命令
- 讓既有的命令更加語義化
- 本地安裝的CLI工具可以使用 yarn 直接啓動
- 將全局安裝的目錄當作一個普通的工程,生成package.json文件,便於全局安裝移植
yarn 的出現給 npm 帶來了巨大的壓力,很快,npm 學習了 yarn 先進的理念,不斷的對自身進行優化,到了目前的npm6版本,幾乎完全解決了上面的問題:
- 目錄扁平化
- 並行下載
- 本地緩存
- 使用package-lock記錄確切依賴
- 增加了大量的命令別名
- 內置了npx,可以啓動本地的CLI工具
- 極大的簡化了控制檯輸出
總結
npm6 之後,可以說npm已經和yarn非常接近,甚至沒有差距了。很多新的項目,又重新從yarn轉回到npm。
yarn 的核心命令
- 初始化
初始化:yarn init [--yes/-y]
- 安裝
添加指定包:yarn [global] add package-name [--dev/-D] [--exact/-E]
安裝package.json中的所有依賴:yarn install [--production/--prod]
- 腳本和本地CLI
運行腳本:yarn run 腳本名
start、stop、test可以省略run
運行本地安裝的CLI:yarn run CLI名
- 查詢
查看bin目錄:yarn [global] bin
查詢包信息:yarn info 包名 [子字段]
列舉已安裝的依賴:yarn [global] list [--depth=依賴深度]
yarn的list命令和npm的list不同,yarn輸出的信息更加豐富,包括頂級目錄結構、每個包的依賴版本號
- 更新
列舉需要更新的包:yarn outdated
更新包:yarn [global] upgrade [包名]
- 卸載
卸載包:yarn remove 包名
yarn 的特別禮物
在終端命令上,yarn不僅僅是對npm的命令做了一個改名,還增加了一些原本沒有的命令,這些命令在某些時候使用起來非常方便
- yarn check
使用yarn check
命令,可以驗證package.json文件的依賴記錄和lock文件是否一致
這對於防止篡改非常有用
- yarn audit
使用yarn audit
命令,可以檢查本地安裝的包有哪些已知漏洞,以表格的形式列出,漏洞級別分爲以下幾種:
- INFO:信息級別
- LOW: 低級別
- MODERATE:中級別
- HIGH:高級別
- CRITICAL:關鍵級別
- yarn why
使用yarn why 包名
命令,可以在控制檯打印出爲什麼安裝了這個包,哪些包會用到它
- yarn create
非常有趣的命令
今後,我們會學習一些腳手架,所謂腳手架,就是使用一個命令來搭建一個工程結構
過去,我們都是使用如下的做法:
- 全局安裝腳手架工具
- 使用全局命令搭建腳手架
由於大部分腳手架工具都是以create-xxx
的方式命名的,比如react的官方腳手架名稱爲create-react-app
因此,可以使用yarn create
命令來一步完成安裝和搭建
例如:
yarn create react-app my-app
# 等同於下面的兩條命令
yarn global add create-react-app
create-react-app my-app
來源:渡一教育