十個項目,十個版本的 Node,麻了!

以下文章來源于前端進階指南 ,作者前端進階指南

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

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

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

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

官方項目地址是:https://github.com/volta-cli/volta

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

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

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

2. 可靠: 確保項目中的每個人都擁有相同的工具,而不會干擾他們的工作流程。

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

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

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

安裝步驟:

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


如遇安裝失敗,請重試。

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

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


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

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

3.2 如何使用
在此之前,請先準備兩個依賴不同node版本的項目,并記住他們各自依賴的node版本號。






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



如果,A項目需要依賴的node版本為10.23.0,B項目需要依賴的node版本為11.6.0,設置步驟如下:

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


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

設置完成后,我們來檢驗結(jié)果,此時對A、B項目分別查看版本號,結(jié)果如下:


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

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

1. node

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

2. volta install  node@12.22.8

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

3. volta list  all

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

4. volta list

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

5. volta pin node@10.23.0

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

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

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

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

接下來,驗證volta與優(yōu)秀解決標準的契合程度:

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

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

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

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

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

六、參考文獻
volta官方文檔地址: https://volta.sh/

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

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






作者:前端進階指南

歡迎關注微信公眾號 :前端印象