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

更新日期: 2022-06-29阅读: 2k标签: node

一、项目痛点

每一个前端项目都依赖不同的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

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


如遇安装失败,请重试。

第三步:退出终端应用程序(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版本自动管理提升研发效率的目标,达成。

六、参考文献

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

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

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

来源:前端进阶指南

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

关于 Node.js 里 ES6 Modules 的一次更新说明

关于 Node.js 里 ES6 Modules 的一次更新说明,总结来说:CommonJS 与 ES6 Modules 之间的关键不同在于代码什么时候知道一个模块的结构和使用它。

用node.js开发一个可交互的命令行应用

在这个教程中,我们会开发一个命令行应用,它可以接收一个 CSV 格式的用户信息文件,教程的内容大纲:“Hello,World”,处理命令行参数,运行时的用户输入,异步网络会话,美化控制台的输出,封装成 shell 命令,JavaScript 之外

Node启动https服务器

首先你需要生成https证书,可以去付费的网站购买或者找一些免费的网站,可能会是key或者crt或者pem结尾的。不同格式之间可以通过OpenSSL转换

nodejs 异步转同步

nodej项目在微信环境开发,nodejs的异步特效,会导致请求没有完成就执行下面的代码,出现错误。经过多方查找,可以使用async模块来异步转同步,只有前一个function执行callback,下一个才会执行。

基于node服务器的大文件(G级)上传

3G的大文件分1500个2M二进度文件,通post方法发送给node服务,服务器全部接收到文件后,进组装生成你上文件。

为什么要把 JavaScript 放到服务器端上运行?

JavaScript比C的开发门槛要低,尽管服务器端JavaScript存在已经很多年了,但是后端部分一直没有市场,JavaScript在浏览器中有广泛的事件驱动方面的应用,考虑到高性能、符合事件驱动、没有历史包袱这3个主要原因,JavaScript成为了Node的实现语言。

了解node.js事件循环

node.js的第一个基本论点是I / O的性能消耗是很昂贵。因此,使用当前编程技术的最大浪费来自于等待I / O完成。有几种方法可以处理性能影响

Node.js 应用:Koa2 使用 JWT 进行鉴权

在前后端分离的开发中,通过 Restful API 进行数据交互时,如果没有对 API 进行保护,那么别人就可以很容易地获取并调用这些 API 进行操作。那么服务器端要如何进行鉴权呢?

Node.js 前端开发指南

我们经常跟Node.js打交道,即使你是一名前端开发人员 -- npm脚本,webpack配置,gulp任务,程序打包 或 运行测试等。即使你真的不需要深入理解这些任务,但有时候你会感到困惑,会因为缺少Node.js的一些核心概念而以非常奇怪的方式来编码。

happypack提升项目构建速度

运行在 Node.js 之上的 Webpack 是单线程模型的,也就是说 Webpack 需要处理的任务需要一件件挨着做,不能多个事情一起做。happypack把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!