為什么你應(yīng)該用Yarn而不是Npm來管理你的項目依賴?
作者:張京??
鏈接:https://segmentfault.com/a/1190000016497047
因為Yarn有離線安裝的功能,特別是在國內(nèi)網(wǎng)絡(luò)環(huán)境不大好的情況下,這個功能尤為有用。
問題
我們經(jīng)常遇到的一種情況是:你設(shè)置好了你的網(wǎng)絡(luò),順利地安裝好了一切依賴,寫好了package.json,npm給你自動生成了一個package-lock.json,在你的電腦上沒有問題,但是你上傳到git,再交給別的同學(xué)或者上傳到服務(wù)器的時候,他們卻怎么npm install也不成功了,這是因為為了確保一致性,npm在package-lock.json里寫明了每一個包的網(wǎng)絡(luò)下載路徑,而你同學(xué)的網(wǎng)絡(luò)環(huán)境沒有你這里好,所以你能成功下載的東西到他這里就下載不了了,結(jié)果為了這個網(wǎng)絡(luò)設(shè)置又要折騰很長時間,雖然說國內(nèi)也有淘寶鏡象的cnpm這樣的替代品,但也不時出現(xiàn)各種奇怪現(xiàn)象,還是不如正宗的npm順暢。
Yarn
為了徹底解決這個問題,我們需要用到Yarn。
Yarn的初始安裝很簡單:
brew?install?yarn
執(zhí)行就更簡單:
yarn
這時它會生成一個yarn.lock的文件,這個文件的內(nèi)容和npm生成的package-lock.json文件很像,也包含了各個依賴包的網(wǎng)絡(luò)下載路徑(實際上,npm的package-lock.json這個概念就是從yarn借鑒過來的)。然后你可以執(zhí)行yarn start來啟動開發(fā)環(huán)境,或者yarn run build來執(zhí)行編譯,npm能執(zhí)行什么命令,yarn也可以。至此為止,似乎沒有看到yarn有什么神奇之處。
離線
下面我們開始為yarn設(shè)置離線安裝環(huán)境,這才是yarn最精彩的地方。
為了能有一個地方存儲yarn下載下來的安裝包,我們需要設(shè)置一個與項目和機器徹底無關(guān)的文件夾,假定我們就在電腦的根目錄下存儲這些文件,我們首先建立一個文件夾,允許別人訪問它:
sudo?mkdir?/Projects
sudo?chmod?777?/Projects
然后,我們告訴yarn到這里來存儲和讀取離線安裝包:
yarn?config?set?yarn-offline-mirror?/Projects/yarn-offline-mirror
這時候,yarn會在你當(dāng)前用戶的根目錄下生成一個.yarnrc的文件,你可以把這個文件搬到你項目的根目錄下:
mv?~/.yarnrc?./
這個文件的內(nèi)容很短,打開來看一下:
\#?THIS?IS?AN?AUTOGENERATED?FILE.?DO?NOT?EDIT?THIS?FILE?DIRECTLY.
#?yarn?lockfile?v1
lastUpdateCheck?1520049128107
yarn-offline-mirror?"/Projects/yarn-offline-mirror"
它的大意是說這是一個自動生成的文件,你不應(yīng)該直接修改文件內(nèi)容(不過其實如果你知道你在干的是什么的,修改也是沒有關(guān)系的,畢竟不是二進制文件)。這里面就列出了我們離線包的存儲位置。
接下來我們開始往我們的離線文件夾灌入內(nèi)容。我們先把我們當(dāng)前項目的node_modules文件夾和yarn.lock文件刪除:
rm?-rf?node\_modules/?yarn.lock
然后,我們執(zhí)行一下
yarn?install
這時候你會看到yarn不但重新生成了node_modules文件夾和yarn.lock文件,并且把下載下來的安裝包全都放入了我們剛才設(shè)定好的離線安裝路徑/Projects/yarn-offline-mirror。
驗證
我們怎么驗證yarn確實可以離線安裝呢?我們還是先把node_modules文件夾刪掉,注意,這次不要再刪yarn.lock文件了:
rm?-rf?node\_modules
為了徹底起見,我們把yarn的緩存也刪掉:
yarn?cache?clean
然后,我們把wifi關(guān)掉,把網(wǎng)線拔掉,然后我們再執(zhí)行:
yarn?install?-offline
成功了!在沒有任何網(wǎng)絡(luò)的情況下,我們繼續(xù)可以重建node_modules文件夾,它取的就是我們剛才設(shè)定好的/Projects/yarn-offline-mirror里的內(nèi)容。
意義
那么這有什么意義呢?僅僅如此還是不夠的,我們需要把整個yarn-offline-mirror上傳到我們自己的git庫里,為它單獨建一個庫,這樣我們的多個項目就可以共享這同一個yarn-offline-mirror,而不必浪費太多的空間。并且由于這是在我們自己的文件系統(tǒng)中,如果是在服務(wù)器端或者其他同事的電腦中執(zhí)行yarn install -offline的話,它也不會再去訪問npm的官方網(wǎng)站獲取安裝包,畢竟那樣訪問不通的概率很大,在中國目前這種網(wǎng)絡(luò)環(huán)境下。
這么麻煩,為什么我不直接把整個node_modules文件夾放入git庫呢?這不也是一樣的效果嗎?某種意義上說,的確是這樣的,但是node_modules里存儲的是解壓縮之后的所有文件,動輒幾萬甚至幾十萬個文件都很常見,所以通常我們在建項目的時候是把node_modules文件夾放在.gitignore文件中忽略掉的。而yarn-offline-mirror里存放的是安裝包本身,是未經(jīng)解壓縮的.tgz文件,一般一個項目幾十最多幾百個文件就夠了,這樣對于我們的git服務(wù)器的管理也是一件好事,所以我們可以把它放在git里管理起來。
參考
你可以更進一步了解一下官方介紹[1],如果你感興趣的話。
參考資料
官方介紹: https://link.segmentfault.com/?enc=VipAurZli94mQ3xdTQiueA%3D%3D.YwZ5nny1UUsmZVqMPqQAhUy8jOnIJ%2FV3t8mMwvPMuMt3ngel3ByghgGIkzjVOJJXpD9Vu3w%2F4FAo50fU6yJ%2F%2Bg%3D%3D
最后
如果你覺得這篇內(nèi)容對你挺有啟發(fā),我想邀請你幫我三個小忙:
點個「在看」,讓更多的人也能看到這篇內(nèi)容(喜歡不點在看,都是耍流氓 -_-)
歡迎加我微信「qianyu443033099」拉你進技術(shù)群,長期交流學(xué)習(xí)...
關(guān)注公眾號「前端下午茶」,持續(xù)為你推送精選好文,也可以加我為好友,隨時聊騷。

