0

多项目node版本自动切换工具-Volta

 1 year ago
source link: https://www.fly63.com/article/detial/11832
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、项目痛点

每一个前端项目都依赖不同的node版本,随着项目仓库的增多,已经记不清哪个仓库用的是哪个版本的node了,只有在项目安装依赖时发现报错,才会想起来排查默认node环境与项目默认node版本是否匹配,遗憾的是,并不是所有项目都会把node版本依赖这种细节交代清楚,因此也就只能多方打听,耗尽大量时间,只为寻找一个版本号。解决问题后,为了避免其他人踩坑,你将node版本依赖明确的写到README文件中,盼望着其他同事在开发前多看一眼,不要将他自己本地新安装的package.json强制覆盖仓库里的依赖。日积月累,node版本因为项目需要升级了,但却没更新到README文件中,README的解决方案形同虚设。寒来暑往,协同人员越来越多,业务越来越复杂,项目版本依赖也越来越混乱,开发前,项目适配花去了大量时间,项目打包报错时,难以定位问题原因,临近上线时,不得不提前打好包时刻待命发版。凡此种种,归根结底是我们无法实现自动精准锁定当前项目需要依赖的node版本,同时也无法形成有效的团队公约。

二、问题分析

上述问题README文件解决方案,之所以会失效,是因为,项目虽然强依赖README文件约定,但没有强制每一个开发者都能100%遵守约定,因此无法真正根治问题症结。针对该问题,有效的而彻底的解决的方案应该具备以下几个特点:

  1. 低成本:容易理解,容易安装,安装一次,多个项目通用,且后续无需再次安装;
  2. 高稳定工具一定要能长期可用,有人长期维护,且有先例在使用,避免踩雷;
  3. 高安全性:不会因为工具问题导致项目运行受影响,更不能影响项目功能;
  4. 高强制性与高自定义性平衡:强制每一个参与开发的同事都使用相同功能,同时也应该允许不使用该工具,保证出问题时能手动控制。

按照以上标准,分析比对出了一个符合要求的工具 -- Volta;

三、volta使用教程

3.0 volta简介

volta,读音 [ˈvoʊltə] ,与中文 沃尔塔 读音相近,但 尔 的音较轻甚至可以不发音。

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

官方说明文档地址是:https://volta.sh/

官网对该工具的定位是:轻松的JavaScript工具管理器。其有三个特点:

1. 高效快速: 快速无缝地安装和运行任何 JS 工具!Volta 是用 Rust 构建的,并作为精炼的静态二进制文件发布。

2. 可靠: 确保项目中的每个人都拥有相同的工具,而不会干扰他们的工作流程。

3. 通用: 无论是包管理器、Node 运行时还是操作系统,您只需要一个命令:volta install.

3.1 如何安装

基于上述介绍,我们来尝试如何安装并使用它。

此处以Mac OS作为环境,终端以Iterm2作为演示工具;Windows的安装略有差异,由于字数限制,暂不做介绍,可私聊获取详细使用方法,另外,终端工具不会影响工具的安装,因此可自行选择终端工具。

安装步骤:

第一步:打开一个新的终端,执行以下命令,以实现切换到登录用户根目录:

cd ~

第二步:安装volta,在终端中执行以下命令:

curl https://get.volta.sh | bash

执行以上命令后,出现下述结果则为安装成功:

62bbf6a3b32ca.jpg

如遇安装失败,请重试。

第三步:退出终端应用程序(command + Q),然后重新打开一个新的终端界面:

这一步的作用是为了使安装volta工具更新的全局变量名更新并生效

第四步:切换到登录用户根目录,并验证是否安装成功,依次执行以下命令:

cd ~

volta

执行volta命令后,界面出现版本号提示,则证明安装成功,示例如下:

62bbf6efbc3b2.jpg

如界面提示"command not found", 请检查是否执行了上述的第三步。

至此,volta的安装全部完成,接下来,一起看看该如何使用。

3.2 如何使用

在此之前,请先准备两个依赖不同node版本的项目,并记住他们各自依赖的node版本号。

此处演示时,我以A、B两个项目做演示,在没有进行任何操作时,我分别对A、B两项目执行查看node版本的命令,得到的版本号一致,均为全局默认版本号v12.21.0,截图如下:

62bbf6f6afcfc.jpg

62bbf6fbbf11c.jpg

如果,A项目需要依赖的node版本为10.23.0,B项目需要依赖的node版本为11.6.0,设置步骤如下:

第一步:在A项目的package.json文件中添加以下代码

"volta": {
  "node": "10.23.0"
}

第二步:再次在终端执行以下代码,查看A项目node版本:

node -v

此时,终端显示的结果已经切换到目标版本10.23.0,结果如下:

62bbf701d5e23.jpg

此时,版本自动切换就成功了,此时我们再次查看B项目的node版本依赖,执行node -v 后,发现版本号依然为v12.21.0,说明A项目的版本切换并不影响B项目,实现了隔离。如果想要把B项目node版本指定为11.6.0,设置方法与设置A项目步骤相同,快亲自动手试试吧。

设置完成后,我们来检验结果,此时对A、B项目分别查看版本号,结果如下:

62bbf707e6111.jpg

至此,volta基本使用教程结束。

四、volta扩展

上面的教程已经满足了我们实际项目需要,但如果我们有兴趣,不满足于这些基本使用,你会发现一写有趣的功能:

1. node

执行node指令后,你将获得一个当前指定版本的node执行环境;

2. volta install  [email protected]

执行该指令后,你将安装node的12.22.8版本,当下次指定node版本为12.22.8时,能够快速切换到该版本;否则,如果指定的版本在volta工具中不存在,volta将会自动匹配安装,这将花费1-2分钟。示例如下:

62bbf70e892e2.jpg

3. volta list  all

执行该指令后,你将能够查看所有已安装到volta工具的node版本,同时能够看到全局默认node环境以及当前正在使用的node环境。示例如下:

62bbf71477e4a.jpg

4. volta list

执行该指令后,你将查看当前项目正在使用的node版本

5. volta pin [email protected]

执行该指令后,你将当前项目的node版本指定为10.23.0,同时将自动更改package.json中关于volta的配置;

以上总结了5个常见的扩展指令,更多有趣功能,请移步官方说明文档:https://docs.volta.sh/reference/

五、复盘总结

我们最终的目的是解决多项目node版本依赖混乱带来的研发低效问题,并对解决方案提出了低成本、高稳定、高安全性、高强制性与高自定义性平衡的要求,我们来依次验证下volta是否解决了项目痛点以及是否符合优秀解决方案的标准。

通过上面的实际操作流程及验证,可以明确验证volta工具确实解决多项目node版本依赖混乱带来的研发低效问题,初始目标达成。

接下来,验证volta与优秀解决标准的契合程度:

1. 低成本:综合来看,volta的安装只需要一行命令,使用也只需要增加一项配置,配置、学习成本低;原理上,volta的原理可以理解为:volta会将指定版本的node路径存储为一个变量,当进入项目时会自动将node版本指向并切换到执行版本,并且会自动帮你切换合适的npm版本,你无需担心二者不匹配;项目与项目之间版本隔离,只需要在根目录下安装一次,可以在任何地方无限次使用。

2. 高稳定性volta在Github平台有  5.8K Star,拥有38位代码贡献值,社区活跃,且长期保持固定频率更新;目前已有500+ 开源项目使用该工具,包括TypeScript、sentry-javascript等大型开源项目;

3. 高安全性volta的配置放在package.json中,即使未使用该工具时,也不会影响业务功能,实现了开发与正式环境隔离。

4. 高强制性与高自定义性平衡只要安装过volta工具的开发者,都会遵循自动切换指定版本node环境,且可以手动更新执行版本,实现手动接管版本管理。

综合评估,volta方案能够解决现有痛点问题,符合方案评判标准,node版本自动管理提升研发效率的目标,达成。

六、参考文献

  1. volta官方文档地址: https://volta.sh/

  2. voltaGithub仓库地址: https://github.com/volta-cli/volta

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

来源:前端进阶指南

链接: https://www.fly63.com/article/detial/11832


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK