十個(gè)項(xiàng)目,十個(gè)版本的 Node,麻了!

以下文章來源于前端進(jìn)階指南 ,作者前端進(jìn)階指南

一、項(xiàng)目痛點(diǎn)
每一個(gè)前端項(xiàng)目都依賴不同的node版本,隨著項(xiàng)目倉庫的增多,已經(jīng)記不清哪個(gè)倉庫用的是哪個(gè)版本的node了,只有在項(xiàng)目安裝依賴時(shí)發(fā)現(xiàn)報(bào)錯(cuò),才會(huì)想起來排查默認(rèn)node環(huán)境與項(xiàng)目默認(rèn)node版本是否匹配,遺憾的是,并不是所有項(xiàng)目都會(huì)把node版本依賴這種細(xì)節(jié)交代清楚,因此也就只能多方打聽,耗盡大量時(shí)間,只為尋找一個(gè)版本號(hào)。解決問題后,為了避免其他人踩坑,你將node版本依賴明確的寫到README文件中,盼望著其他同事在開發(fā)前多看一眼,不要將他自己本地新安裝的package.json強(qiáng)制覆蓋倉庫里的依賴。日積月累,node版本因?yàn)轫?xiàng)目需要升級(jí)了,但卻沒更新到README文件中,README的解決方案形同虛設(shè)。寒來暑往,協(xié)同人員越來越多,業(yè)務(wù)越來越復(fù)雜,項(xiàng)目版本依賴也越來越混亂,開發(fā)前,項(xiàng)目適配花去了大量時(shí)間,項(xiàng)目打包報(bào)錯(cuò)時(shí),難以定位問題原因,臨近上線時(shí),不得不提前打好包時(shí)刻待命發(fā)版。凡此種種,歸根結(jié)底是我們無法實(shí)現(xiàn)自動(dòng)精準(zhǔn)鎖定當(dāng)前項(xiàng)目需要依賴的node版本,同時(shí)也無法形成有效的團(tuán)隊(duì)公約。

二、問題分析
上述問題README文件解決方案,之所以會(huì)失效,是因?yàn)椋?xiàng)目雖然強(qiáng)依賴README文件約定,但沒有強(qiáng)制每一個(gè)開發(fā)者都能100%遵守約定,因此無法真正根治問題癥結(jié)。針對該問題,有效的而徹底的解決的方案應(yīng)該具備以下幾個(gè)特點(diǎn):

低成本:容易理解,容易安裝,安裝一次,多個(gè)項(xiàng)目通用,且后續(xù)無需再次安裝;
高穩(wěn)定:工具一定要能長期可用,有人長期維護(hù),且有先例在使用,避免踩雷;
高安全性:不會(huì)因?yàn)楣ぞ邌栴}導(dǎo)致項(xiàng)目運(yùn)行受影響,更不能影響項(xiàng)目功能;
高強(qiáng)制性與高自定義性平衡:強(qiáng)制每一個(gè)參與開發(fā)的同事都使用相同功能,同時(shí)也應(yīng)該允許不使用該工具,保證出問題時(shí)能手動(dòng)控制。
按照以上標(biāo)準(zhǔn),分析比對出了一個(gè)符合要求的工具 -- Volta;

三、volta使用教程
3.0 volta簡介
volta,讀音 [?vo?lt?] ,與中文 沃爾塔 讀音相近,但 爾 的音較輕甚至可以不發(fā)音。

官方項(xiàng)目地址是:https://github.com/volta-cli/volta

官方說明文檔地址是:https://volta.sh/

官網(wǎng)對該工具的定位是:輕松的JavaScript工具管理器。其有三個(gè)特點(diǎn):

1. 高效快速: 快速無縫地安裝和運(yùn)行任何 JS 工具!Volta 是用 Rust 構(gòu)建的,并作為精煉的靜態(tài)二進(jìn)制文件發(fā)布。

2. 可靠: 確保項(xiàng)目中的每個(gè)人都擁有相同的工具,而不會(huì)干擾他們的工作流程。

3. 通用: 無論是包管理器、Node 運(yùn)行時(shí)還是操作系統(tǒng),您只需要一個(gè)命令:volta install.

3.1 如何安裝
基于上述介紹,我們來嘗試如何安裝并使用它。

此處以Mac OS作為環(huán)境,終端以Iterm2作為演示工具;Windows的安裝略有差異,由于字?jǐn)?shù)限制,暫不做介紹,可私聊獲取詳細(xì)使用方法,另外,終端工具不會(huì)影響工具的安裝,因此可自行選擇終端工具。

安裝步驟:

第一步:打開一個(gè)新的終端,執(zhí)行以下命令,以實(shí)現(xiàn)切換到登錄用戶根目錄:
cd ~
第二步:安裝volta,在終端中執(zhí)行以下命令:
curl https://get.volta.sh | bash
執(zhí)行以上命令后,出現(xiàn)下述結(jié)果則為安裝成功:


如遇安裝失敗,請重試。

第三步:退出終端應(yīng)用程序(command + Q),然后重新打開一個(gè)新的終端界面:
這一步的作用是為了使安裝volta工具更新的全局變量名更新并生效
第四步:切換到登錄用戶根目錄,并驗(yàn)證是否安裝成功,依次執(zhí)行以下命令:
cd ~

volta
執(zhí)行volta命令后,界面出現(xiàn)版本號(hào)提示,則證明安裝成功,示例如下:


如界面提示"command not found", 請檢查是否執(zhí)行了上述的第三步。

至此,volta的安裝全部完成,接下來,一起看看該如何使用。

3.2 如何使用
在此之前,請先準(zhǔn)備兩個(gè)依賴不同node版本的項(xiàng)目,并記住他們各自依賴的node版本號(hào)。






此處演示時(shí),我以A、B兩個(gè)項(xiàng)目做演示,在沒有進(jìn)行任何操作時(shí),我分別對A、B兩項(xiàng)目執(zhí)行查看node版本的命令,得到的版本號(hào)一致,均為全局默認(rèn)版本號(hào)v12.21.0,截圖如下:



如果,A項(xiàng)目需要依賴的node版本為10.23.0,B項(xiàng)目需要依賴的node版本為11.6.0,設(shè)置步驟如下:

第一步:在A項(xiàng)目的package.json文件中添加以下代碼:
"volta": {
  "node": "10.23.0"
}
第二步:再次在終端執(zhí)行以下代碼,查看A項(xiàng)目node版本:
node -v
此時(shí),終端顯示的結(jié)果已經(jīng)切換到目標(biāo)版本10.23.0,結(jié)果如下:


此時(shí),版本自動(dòng)切換就成功了,此時(shí)我們再次查看B項(xiàng)目的node版本依賴,執(zhí)行node -v 后,發(fā)現(xiàn)版本號(hào)依然為v12.21.0,說明A項(xiàng)目的版本切換并不影響B(tài)項(xiàng)目,實(shí)現(xiàn)了隔離。如果想要把B項(xiàng)目node版本指定為11.6.0,設(shè)置方法與設(shè)置A項(xiàng)目步驟相同,快親自動(dòng)手試試吧。

設(shè)置完成后,我們來檢驗(yàn)結(jié)果,此時(shí)對A、B項(xiàng)目分別查看版本號(hào),結(jié)果如下:


至此,volta基本使用教程結(jié)束。

四、volta擴(kuò)展
上面的教程已經(jīng)滿足了我們實(shí)際項(xiàng)目需要,但如果我們有興趣,不滿足于這些基本使用,你會(huì)發(fā)現(xiàn)一寫有趣的功能:

1. node

執(zhí)行node指令后,你將獲得一個(gè)當(dāng)前指定版本的node執(zhí)行環(huán)境;

2. volta install  node@12.22.8

執(zhí)行該指令后,你將安裝node的12.22.8版本,當(dāng)下次指定node版本為12.22.8時(shí),能夠快速切換到該版本;否則,如果指定的版本在volta工具中不存在,volta將會(huì)自動(dòng)匹配安裝,這將花費(fèi)1-2分鐘。示例如下:

3. volta list  all

執(zhí)行該指令后,你將能夠查看所有已安裝到volta工具的node版本,同時(shí)能夠看到全局默認(rèn)node環(huán)境以及當(dāng)前正在使用的node環(huán)境。示例如下:

4. volta list

執(zhí)行該指令后,你將查看當(dāng)前項(xiàng)目正在使用的node版本

5. volta pin node@10.23.0

執(zhí)行該指令后,你將當(dāng)前項(xiàng)目的node版本指定為10.23.0,同時(shí)將自動(dòng)更改package.json中關(guān)于volta的配置;

以上總結(jié)了5個(gè)常見的擴(kuò)展指令,更多有趣功能,請移步官方說明文檔:https://docs.volta.sh/reference/

五、復(fù)盤總結(jié)
我們最終的目的是解決多項(xiàng)目node版本依賴混亂帶來的研發(fā)低效問題,并對解決方案提出了低成本、高穩(wěn)定、高安全性、高強(qiáng)制性與高自定義性平衡的要求,我們來依次驗(yàn)證下volta是否解決了項(xiàng)目痛點(diǎn)以及是否符合優(yōu)秀解決方案的標(biāo)準(zhǔn)。

通過上面的實(shí)際操作流程及驗(yàn)證,可以明確驗(yàn)證volta工具確實(shí)解決多項(xiàng)目node版本依賴混亂帶來的研發(fā)低效問題,初始目標(biāo)達(dá)成。

接下來,驗(yàn)證volta與優(yōu)秀解決標(biāo)準(zhǔn)的契合程度:

1. 低成本:綜合來看,volta的安裝只需要一行命令,使用也只需要增加一項(xiàng)配置,配置、學(xué)習(xí)成本低;原理上,volta的原理可以理解為:volta會(huì)將指定版本的node路徑存儲(chǔ)為一個(gè)變量,當(dāng)進(jìn)入項(xiàng)目時(shí)會(huì)自動(dòng)將node版本指向并切換到執(zhí)行版本,并且會(huì)自動(dòng)幫你切換合適的npm版本,你無需擔(dān)心二者不匹配;項(xiàng)目與項(xiàng)目之間版本隔離,只需要在根目錄下安裝一次,可以在任何地方無限次使用。

2. 高穩(wěn)定性volta在Github平臺(tái)有  5.8K Star,擁有38位代碼貢獻(xiàn)值,社區(qū)活躍,且長期保持固定頻率更新;目前已有500+ 開源項(xiàng)目使用該工具,包括TypeScript、sentry-javascript等大型開源項(xiàng)目;

3. 高安全性volta的配置放在package.json中,即使未使用該工具時(shí),也不會(huì)影響業(yè)務(wù)功能,實(shí)現(xiàn)了開發(fā)與正式環(huán)境隔離。

4. 高強(qiáng)制性與高自定義性平衡只要安裝過volta工具的開發(fā)者,都會(huì)遵循自動(dòng)切換指定版本node環(huán)境,且可以手動(dòng)更新執(zhí)行版本,實(shí)現(xiàn)手動(dòng)接管版本管理。

綜合評估,volta方案能夠解決現(xiàn)有痛點(diǎn)問題,符合方案評判標(biāo)準(zhǔn),node版本自動(dòng)管理提升研發(fā)效率的目標(biāo),達(dá)成。

六、參考文獻(xiàn)
volta官方文檔地址: https://volta.sh/

voltaGithub倉庫地址: https://github.com/volta-cli/volta

volta指令: https://docs.volta.sh/reference/






作者:前端進(jìn)階指南

歡迎關(guān)注微信公眾號(hào) :前端印象