爲何不少時候咱們喜歡用yarn管理項目,而不喜歡用npm呢?node
場景:
咱們常常遇到的一種狀況是:你設置好了你的網絡,順利地安裝好了一切依賴,寫好了package.json,npm給你自動生成了一個package-lock.
json,在你的電腦上沒有問題,可是你上傳到git,再交給別的同窗或者上傳到服務器的時候,他們卻怎麼npm install也不成功了,這是由於
了確保一致性,npm在package-lock.json裏寫明瞭每個包的網絡下載路徑,而你同窗的網絡環境沒有你這裏好,因此你能成功下載的東西到
他這裏就下載不了了,結果爲了這個網絡設置又要折騰很長時間,雖說國內也有淘寶鏡象的cnpm這樣的替代品,但也不時出現各類奇怪現象,
仍是不如正宗的npm順暢。
複製代碼
爲了完全解決這個問題,咱們須要用到Yarn。git
安裝yarnnpm
brew install yarn
複製代碼
關於brew查看https://brew.sh/json
yarn
複製代碼
這時它會生成一個yarn.lock的文件,這個文件的內容和npm生成的package-lock.json文件很像,也包含了各個依賴包的網絡下載路徑(實際上,npm的package-lock.json這個概念就是從yarn借鑑過來的)。而後你能夠執行yarn start來啓動開發環境,或者yarn run build來執行編譯,npm能執行什麼命令,yarn也能夠。至此爲止,彷佛沒有看到yarn有什麼神奇之處。緩存
離線下載資源纔是yarn的關鍵點bash
爲了能有一個地方存儲yarn下載下來的安裝包,咱們須要設置一個與項目和機器完全無關的文件夾,假定咱們就在電腦的根目錄下存儲這些文件,咱們首先創建一個文件夾,容許別人訪問它:服務器
sudo mkdir /Projects
sudo chmod 777 /Projects
複製代碼
而後,咱們告訴yarn到這裏來存儲和讀取離線安裝包:網絡
yarn config set yarn-offline-mirror /Projects/yarn-offline-mirror
複製代碼
這時候,yarn會在你當前用戶的根目錄下生成一個.yarnrc的文件,你能夠把這個文件搬到你項目的根目錄下:網站
mv ~/.yarnrc ./
複製代碼
這個文件的內容很短,打開來看一下:ui
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
複製代碼
lastUpdateCheck 1520049128107
yarn-offline-mirror "/Projects/yarn-offline-mirror"
複製代碼
它的大意是說這是一個自動生成的文件,你不該該直接修改文件內容(不過其實若是你知道你在乾的是什麼的,修改也是沒有關係的,畢竟不是二進制文件)。這裏面就列出了咱們離線包的存儲位置。
接下來咱們開始往咱們的離線文件夾灌入內容。咱們先把咱們當前項目的node_modules文件夾和yarn.lock文件刪除:
rm -rf node_modules/ yarn.lock
複製代碼
而後,咱們執行一下
yarn install
複製代碼
這時候你會看到yarn不但從新生成了node_modules文件夾和yarn.lock文件,而且把下載下來的安裝包全都放入了咱們剛纔設定好的離線安裝路徑/Projects/yarn-offline-mirror。
咱們怎麼驗證yarn確實能夠離線安裝呢?咱們仍是先把node_modules文件夾刪掉,注意,此次不要再刪yarn.lock文件了:
rm -rf node_modules
複製代碼
爲了完全起見,咱們把yarn的緩存也刪掉:
yarn cache clean
複製代碼
而後,咱們把wifi關掉,把網線拔掉,而後咱們再執行:
yarn install -offline
複製代碼
成功了!在沒有任何網絡的狀況下,咱們繼續能夠重建node_modules文件夾,它取的就是咱們剛纔設定好的/Projects/yarn-offline-mirror裏的內容。
意義 那麼這有什麼意義呢?僅僅如此仍是不夠的,咱們須要把整個yarn-offline-mirror上傳到咱們本身的git庫裏,爲它單獨建一個庫,這樣咱們的多個項目就能夠共享這同一個yarn-offline-mirror,而沒必要浪費太多的空間。而且因爲這是在咱們本身的文件系統中,若是是在服務器端或者其餘同事的電腦中執行yarn install -offline的話,它也不會再去訪問npm的官方網站獲取安裝包,畢竟那樣訪問不通的機率很大,在中國目前這種網絡環境下。
這麼麻煩,爲何我不直接把整個node_modules文件夾放入git庫呢?這不也是同樣的效果嗎?某種意義上說,的確是這樣的,可是
node_modules裏存儲的是解壓縮以後的全部文件,動輒幾萬甚至幾十萬個文件都很常見,因此一般咱們在建項目的時候是把
node_modules文件夾放在.gitignore文件中忽略掉的。而yarn-offline-mirror裏存放的是安裝包自己,是未經解壓縮的.tgz文件,
通常一個項目幾十最多幾百個文件就夠了,這樣對於咱們的git服務器的管理也是一件好事,因此咱們能夠把它放在git裏管理起來。
複製代碼
yarn的使用
如今Yarn已經 安裝完畢,能夠開始使用。如下是一些你須要的最經常使用的命令:
初始化新項目
yarn init
複製代碼
添加依賴包
yarn add [package]
yarn add [package]@[version]
yarn add [package]@[tag]
複製代碼
將依賴項添加到不一樣依賴項類別
分別添加到 devDependencies、peerDependencies 和 optionalDependencies:
yarn add [package] --dev
yarn add [package] --peer
yarn add [package] --optional
複製代碼
升級依賴包
yarn upgrade [package]
yarn upgrade [package]@[version]
yarn upgrade [package]@[tag]
複製代碼
移除依賴包
yarn remove [package]
安裝項目的所有依賴
複製代碼
yarn
或者
yarn install
複製代碼