十个项目,十个版本的 Node,麻了!
以下文章来源于前端进阶指南 ,作者前端进阶指南
一、项目痛点
每一个前端项目都依赖不同的node版本,随着项目仓库的增多,已经记不清哪个仓库用的是哪个版本的node了,只有在项目安装依赖时发现报错,才会想起来排查默认node环境与项目默认node版本是否匹配,遗憾的是,并不是所有项目都会把node版本依赖这种细节交代清楚,因此也就只能多方打听,耗尽大量时间,只为寻找一个版本号。解决问题后,为了避免其他人踩坑,你将node版本依赖明确的写到README文件中,盼望着其他同事在开发前多看一眼,不要将他自己本地新安装的package.json强制覆盖仓库里的依赖。日积月累,node版本因为项目需要升级了,但却没更新到README文件中,README的解决方案形同虚设。寒来暑往,协同人员越来越多,业务越来越复杂,项目版本依赖也越来越混乱,开发前,项目适配花去了大量时间,项目打包报错时,难以定位问题原因,临近上线时,不得不提前打好包时刻待命发版。凡此种种,归根结底是我们无法实现自动精准锁定当前项目需要依赖的node版本,同时也无法形成有效的团队公约。
二、问题分析
上述问题README文件解决方案,之所以会失效,是因为,项目虽然强依赖README文件约定,但没有强制每一个开发者都能100%遵守约定,因此无法真正根治问题症结。针对该问题,有效的而彻底的解决的方案应该具备以下几个特点:
低成本:容易理解,容易安装,安装一次,多个项目通用,且后续无需再次安装;
高稳定:工具一定要能长期可用,有人长期维护,且有先例在使用,避免踩雷;
高安全性:不会因为工具问题导致项目运行受影响,更不能影响项目功能;
高强制性与高自定义性平衡:强制每一个参与开发的同事都使用相同功能,同时也应该允许不使用该工具,保证出问题时能手动控制。
按照以上标准,分析比对出了一个符合要求的工具 -- 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
执行以上命令后,出现下述结果则为安装成功:
如遇安装失败,请重试。
第三步:退出终端应用程序(command + Q),然后重新打开一个新的终端界面:
这一步的作用是为了使安装volta工具更新的全局变量名更新并生效
第四步:切换到登录用户根目录,并验证是否安装成功,依次执行以下命令:
cd ~
volta
执行volta命令后,界面出现版本号提示,则证明安装成功,示例如下:
如界面提示"command not found", 请检查是否执行了上述的第三步。
至此,volta的安装全部完成,接下来,一起看看该如何使用。
3.2 如何使用
在此之前,请先准备两个依赖不同node版本的项目,并记住他们各自依赖的node版本号。
此处演示时,我以A、B两个项目做演示,在没有进行任何操作时,我分别对A、B两项目执行查看node版本的命令,得到的版本号一致,均为全局默认版本号v12.21.0,截图如下:
如果,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,结果如下:
此时,版本自动切换就成功了,此时我们再次查看B项目的node版本依赖,执行node -v 后,发现版本号依然为v12.21.0,说明A项目的版本切换并不影响B项目,实现了隔离。如果想要把B项目node版本指定为11.6.0,设置方法与设置A项目步骤相同,快亲自动手试试吧。
设置完成后,我们来检验结果,此时对A、B项目分别查看版本号,结果如下:
至此,volta基本使用教程结束。
四、volta扩展
上面的教程已经满足了我们实际项目需要,但如果我们有兴趣,不满足于这些基本使用,你会发现一写有趣的功能:
1. node
执行node指令后,你将获得一个当前指定版本的node执行环境;
2. volta install node@12.22.8
执行该指令后,你将安装node的12.22.8版本,当下次指定node版本为12.22.8时,能够快速切换到该版本;否则,如果指定的版本在volta工具中不存在,volta将会自动匹配安装,这将花费1-2分钟。示例如下:
3. volta list all
执行该指令后,你将能够查看所有已安装到volta工具的node版本,同时能够看到全局默认node环境以及当前正在使用的node环境。示例如下:
4. volta list
执行该指令后,你将查看当前项目正在使用的node版本
5. volta pin node@10.23.0
执行该指令后,你将当前项目的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版本自动管理提升研发效率的目标,达成。
六、参考文献
volta官方文档地址: https://volta.sh/
voltaGithub仓库地址: https://github.com/volta-cli/volta
volta指令: https://docs.volta.sh/reference/
作者:前端进阶指南
欢迎关注微信公众号 :前端印象