Yarn 的 workspace 和離線安裝策略
前言:大家好,很高興和大家又見面啦!在之前得幾個(gè)小節(jié)里,主要給大家介紹了關(guān)于 Yarn
得基礎(chǔ)知識,大家只要在平時(shí)得開發(fā)過程中,多多得嘗試使用,一定能很快得掌握。那本章開始,我將給大家講解一些關(guān)于 Yarn
得高級特性,有助于幫助大家理解,為什么 Yarn
這個(gè)依賴管理工具,在短時(shí)間就能廣泛的在前端架構(gòu)中被大家熱衷使用,并且發(fā)展成為足以媲美 npm
的主流管理工具。
1. 關(guān)于 Yarn 的 workspace
1.1 為什么要使用 workspace
在前面的章節(jié)中,給大家簡單提過這樣一個(gè)觀點(diǎn),就是 yarn
的官方文檔教程中表示,Yarn
并不希望開發(fā)者像使用 npm
那樣,在不考慮內(nèi)存等相關(guān)因素的情況下,可以隨心所欲的全局安裝依賴然后去使用它。它更希望我們針對于每一個(gè)項(xiàng)目,單獨(dú)去維護(hù)我們的項(xiàng)目相關(guān)依賴。
基于這種使用思路,那么我們現(xiàn)在思考一個(gè)問題:單獨(dú)維護(hù)每個(gè)項(xiàng)目,這樣可以根據(jù)項(xiàng)目的 package.json
去維護(hù)每個(gè)項(xiàng)目的依賴,非常的清晰、方便。但是同時(shí)也暴露出了一些如重復(fù)安裝,占用存儲空間等缺點(diǎn)。所以,為了解決這些不足,Yarn 的 workspace
策略應(yīng)運(yùn)而生。
1.2 workspace 能幫我們解決什么問題?
- 依賴關(guān)系可以鏈接在一起,這意味著你的工作區(qū)可以相互依賴,同時(shí)始終使用最新的可用代碼。這也是一個(gè)相對于
yarn link
更好的機(jī)制,因?yàn)樗挥绊懩愕墓ぷ骺臻g樹,而不是整個(gè)系統(tǒng) - 能幫助你更好地管理多個(gè)子項(xiàng)目的依賴庫,這樣你可以在每個(gè)子項(xiàng)目里使用獨(dú)立的
package.json
管理你的依賴,又不用分別進(jìn)到每一個(gè)子項(xiàng)目里去yarn install/upfrade
安裝/升級依賴,而是使用一條yarn命令去處理所有依賴。就像只有一個(gè)package.json一樣。 - yarn會根據(jù)就依賴關(guān)系幫助你分析所有子項(xiàng)目的共用依賴,保證所有的項(xiàng)目公用的依賴只會被下載和安裝一次。
這樣就能完美的解決了我們上文所分析的問題。那么接下來,我就帶領(lǐng)大家通過實(shí)際例子的方式,具體的使用一下 Yarn
的 workspace
吧!
1.3 如何使用 workspace
當(dāng)我們需要構(gòu)建一個(gè)大型的前端項(xiàng)目,里面包含幾個(gè)并列的子項(xiàng)目時(shí),我們就可以使用yarn得 workspace
。目前國內(nèi)得許多經(jīng)典開源項(xiàng)目,如 vue、react 等,都是用得這一思路去構(gòu)建他們得項(xiàng)目。
1.3.1 沒有使用workspace時(shí),我們怎么做的
在不使用 workspace
時(shí),我們的項(xiàng)目目錄通常是這樣的
projects/
| project1/
| |--package.json
| |--node_modules/
| | |--vue/
|--project2
| |--package.json
| |--node_modules/
| | |--vue/
| | |--project1/
其中第一個(gè)子項(xiàng)目 project1 的 package.json
配置可以簡化為:
{
"name": "project1",
"version": "1.0.0",
"dependencies": {
"vue": "1.0.0"
}
}
第二個(gè)子項(xiàng)目 project2 的 package.json
配置可以簡化為:
{
"name": "project2",
"version": "1.0.0",
"dependencies": {
"vue": "1.0.0",
"project1": "1.0.0"
}
}
這種經(jīng)典的傳統(tǒng)使用方法,就會暴露出如上文所說的問題,總結(jié)本案例的不足點(diǎn)如下:
- 兩個(gè)子項(xiàng)目有相同的依賴 vue ,每個(gè)子項(xiàng)目都會下載一次 vue 依賴,不僅浪費(fèi)開發(fā)效率,還占用額外空間,當(dāng)子項(xiàng)目較多時(shí),問題更加明顯。
- 第二個(gè)子項(xiàng)目 project2 依賴于第一個(gè)子項(xiàng)目 project2 ,而 project1 如果沒有發(fā)布到 npm 倉庫,那就得使用
yarn link
命令來配置依賴,非常不方便。 - 需要使用
yarn build
構(gòu)建項(xiàng)目時(shí),需要每個(gè)子項(xiàng)目分別構(gòu)建,不能統(tǒng)一構(gòu)建。
1.3.2 使用workspace示例
使用 workspace 不用安裝別的依賴,直接新建一個(gè)項(xiàng)目根目錄 projects, 初始化項(xiàng)目即可。然后修改初始化的 package.json
文件為:
{
"private": true,
"workspaces": ["project1", "project2"] // 也可以使用通配符設(shè)置為 ["project*"],開源社區(qū)則都基本上使用 "workspaces": ["packages/*"] 的目錄結(jié)構(gòu)。
}
兩個(gè)子項(xiàng)目 project1 和 project2 如上文配置不變。
在根目錄 projects 目錄下執(zhí)行 yarn install
$ yarn install
yarn install v1.22.0
info No lockfile found.
[1/4] ? Resolving packages...
[2/4] ? Fetching packages...
[3/4] ? Linking dependencies...
[4/4] ? Building fresh packages...
success Saved lockfile.
? Done in 0.56s.
此時(shí)查看目錄結(jié)構(gòu)如下:
projects/
|--package.json
|--project1/
| |--package.json
|--project2
| |--package.json
|--node_modules/
| |--vue/
| |--project1/ -> ./project1/
備注:
- 如果需要某個(gè)特殊的 子項(xiàng)目 不受 Yarn Workspace 管理,只需在此 workspace 目錄下添加 .yarnrc 文件,并添加如下內(nèi)容禁用即可
workspaces-experimental false
- 如果想單獨(dú)添加或者移除某個(gè)子項(xiàng)目的依賴,可以使用如下命令:
$ yarn workspace project1 add vue --dev
$ yarn workspace project1 remove vue
以上便是 yarn 的 workspace 簡單用法。
2. 淺談Yarn的離線安裝策略
我們知道,yarn
這個(gè)依賴管理工具和其他的管理工具對比,一大特點(diǎn)就是快。根據(jù)以往經(jīng)驗(yàn)來看,當(dāng)我們使用 npm
,因?yàn)榫W(wǎng)速或者其他的,如需科學(xué)上網(wǎng)才能下載依賴等問題時(shí),使用 yarn
代替 npm
去下載時(shí),往往會有很好的效果。
那么,如果是更加極端的情況,比如我們當(dāng)前沒有網(wǎng)絡(luò)的情況,想下載相關(guān)依賴,可以嗎?答案是可以,只要我們之前在有網(wǎng)絡(luò)時(shí)候在本地下載過這個(gè)依賴,那就可以按照如下方法去離線下載相關(guān)依賴。
- 設(shè)置離線存儲目錄,使用下面命令會在當(dāng)前項(xiàng)目路徑生成一個(gè)
yarn-offline
文件夾用來存放構(gòu)建的.tgz離線文件。
yarn config set yarn-offline-mirror ./yarn-offline
- 離線文件夾不會同步你的包,可能會導(dǎo)致一些的問題,所以需要清除用不到的壓縮包。
yarn config set yarn-offline-mirror-pruning true
- 刪除
node_modules
文件夾下面的yarn.lock
,生成離線文件。
yarn install
- 模擬沒有網(wǎng)絡(luò)的環(huán)境,刪除上面安裝的
node_modules
文件,并執(zhí)行下面命令。
yarn --offline
以上便是使用 yarn 進(jìn)行離線安裝依賴的方法。
3. 小結(jié)
Yarn 作為后起之秀,發(fā)展成現(xiàn)在深受廣大開發(fā)者喜愛的依賴管理工具,有很多 npm 等管理工具所不具備的特性和優(yōu)勢,本文就給大家講解了 yarn 的兩個(gè)高級用法:workspace 和離線緩存策略。希望大家在熟練掌握它的基礎(chǔ)用法的同時(shí),也能深入理解 yarn 的高級用法與特性。