Node.js 版本管理的终极答案——Volta

大家好,我是刘布斯。

在前端项目开发中,Node 版本管理工具是必备工具,大部分人应该都在使用 nvm ,但如果需要维护的项目比较多,而且不同项目要求的 Node 版本不同,版本管理会特别麻烦。

今天分享的 Volta,它不仅带来了极速的版本切换体验,还能自动管理项目的 Node 版本依赖,降低使用的心智成本,号称是Node.js 版本管理的最终答案

本文由同事提供,感谢 @兰之 的授权。

背景

面临不同项目对 Nodejs 版本不同的依赖,我们通常会在项目 package.jsonengines 字段中声明项目所需的版本,同时采用 nvm 管理不同版本的 Nodejs 实例,只需要在进入项目后查看一眼 engines 字段,手动切换至对应的版本即可。

项目数量较少时,这确实是一种可选的方案。但随着团队规模扩大,同时面临数十个待维护的存量项目时,手动的翻找、切换、安装无疑会是一场灾难

Volta 就是为了解决这一问题而生的!

特性

以下特点摘自 Volta 官方文档:https://docs.volta.sh/guide/

  • 高速
  • 无缝、按项目切换版本
  • 跨平台支持,包括 Windows 和所有 Unix shell
  • 支持多个软件包管理器
  • 稳定的工具安装 — 不需要在每次 Node 升级时重新安装!
  • 可扩展性钩子,用于特定站点的定制化

Volta 采用 Rust 编写,原生语言的加持让它的性能十分强悍。使用 Volta,你可以在手动给项目选择一个 Node 版本,然后再也不必关心它,甚至可以在不同项目目录之间任意切换,也不再需要手动在不同 Node 版本之间切换。

迁移指南

安装

Volta 是跨平台的,不同操作系统的同学可以选择不同的方式。

  • Unix like(Mac Linux)
curl https://get.volta.sh | bash
  • Windows

以下两种方式任选其一即可

  1. 使用 winget
winget install Volta.Volta
  1. 使用安装包,自行选择合适的版本按照指引安装即可

基本使用

进入项目根目录,执行volta pin node@version,就会看到 Voltapackage.json 中新增了一些配置,例如:

将变更提交至 Git 仓库,就可以让其他协作的小伙伴自动使用你指定的 Node 版本了

集成 PNPM

pnpm Support | Volta

配置环境变量

目前 Volta 对 pnpm 的支持是实验性的,但实测常用的功能都能支持,因此是可以正常使用的:

  • Mac 系统可在 shell 的配置文件中新增一行 export VOLTA_FEATURE_PNPM=1
  • Windows 则需要到系统的环境变量管理中新增 VOLTA_FEATURE_PNPM 变量,值为 1

随后就可以像 pin Node 版本一样,在不同项目中固定不同的 pnpm 版本了

以 Mac 及 ZSH 为例:

code ~/.zshrc

# 新增代码:
# 手动开启volta的PNPM支持
export VOLTA_FEATURE_PNPM=1

清除手动安装的 PNPM

卸载 pnpm | pnpm

  • 如果是通过独立脚本安装的 pnpm,可以直接删除 pnpm 的主目录
rm -rf $PNPM_HOME
  • 如果使用 npm 安装 pnpm,那么应该使用 npm 卸载 pnpm
npm rm -g pnpm

重新安装全局工具

如果类似 Whistle 等的全局工具是使用自行安装的 pnpm 管理的,则应在卸载 pnpm 后自行重新使用 npm 来安装

  • 卸载 pnpm 之前,使用pnpm list --global列出当前安装的全局包
  • 卸载后,使用npm add --global <packageName>逐个安装即可

移除 nvm

若之前有安装 NVM 等其他的版本管理工具,则需手动移除,否则可能与Volta产生冲突,以卸载 NVM 为例:

  1. 首先,使用nvm unload从终端中删除nvm命令并删除安装目录:
nvm_dir="${NVM_DIR:-~/.nvm}"
nvm unload
rm -rf "$nvm_dir"
  1. 编辑~/.bashrc(或其他 shell 资源配置)并删除以下行:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[[ -r $NVM_DIR/bash_completion ]] && \. $NVM_DIR/bash_completion

其他问题

Q:上述步骤好简单,没有别的操作了?是的!使用 Volta 就是这么省心!

当然,本文只介绍了管理 Node 版本这一功能,Volta 还有一些其他针对工具链的增强,感兴趣可以自行阅读文档

Q:不同的目录,不同的终端都能自动切换吗?

是的!Volta 会在进入项目目录后自动读取项目中声明的版本并主动切换,如果没有声明则会退回全局的版本

如果没有设置过全局版本,则可以使用volta install node@version命令主动设置一个版本到全局环境,相当于 nvm 的 use 命令

Q:项目维护者没有安装 Volta 怎么办?

回退到之前的方案,自己查看项目的 engines 字段,自己手动切换版本

Q:项目中声明了本地未下载的 Node 版本会怎样?

Volta 会在你执行 node 相关命令时自动下载声明的版本,你无需关心这一过程

Q:全局移除了其他来源的 Node,遇到没有 Volta 声明的文件夹怎么办?

使用 install 子命令安装一个全局版本,例如

volta install node@20
node -v # v20.18.0

其实,install 也可以简单等价为 use,执行时会下载并设置为全局版本

如果你和我一样,是个懒人,觉得 volta 命令太长了懒得拼!!!可以配合 alias 的别名功能,整个短的,例如在 ~/.zshrc 中配置别名为vt

code ~/.zshrc # 或者使用其他编辑器

# 随后在文件中新增一行
alias vt="volta"


最后

还没有使用过我们刷题网站(https://fe.ecool.fun/)或者刷题小程序的同学,如果近期准备或者正在找工作,千万不要错过,题库主打题全和更新快哦~。

有会员购买、辅导咨询的小伙伴,可以通过下面的二维码,联系我们的小助手。