Skip to main content

使用 volta 代替 nvm

背景

nvm

nvm 允许开发人员在一台机器上安装和管理多个版本的 Node.js。它还提供了一个方便的命令行界面,用于在可用版本之间切换。

nvm 的工作原理是将 Node.js 的每个版本安装到下的独立目录中。使用 nvm use 在版本之间切换时,它会更新环境变量以指向相应的目录。所以可以并行安装多个版本的 Node.js,并且每个版本都有自己的一组全局安装的软件包 ~/.nvm/versions/node/$PATH

nvm 的缺点是它只支持 Node.js,而且需要手动切换 Node 版本。如果需要管理其他编程语言或工具,则需要使用单独的版本管理器。

Volta

volta 也是一个版本管理器,旨在简化 Node.js其他工具的安装和管理。

Volta 采用了与 nvm 不同的方法:它不是管理 Node.js 的多个版本,而是管理项目及其依赖项。当你创建新项目时,volta 会自动检测所需的 Node.js 版本并为你安装它。

volta 还支持其他工具,如 Yarn 和 Rust,这对于使用多种编程语言并需要单个工具来管理它们的开发人员来说是一个不错的选择。

与 nvm 一样,volta 提供了一个命令行界面,用于在 Node.js 版本之间切换,但它通过使用拦截对 node 可执行文件的调用的全局填充程序来实现。

为什么用 Volta

Volta 将 Node 引擎的确切版本存储在 package.json 中,从那时起,每次在项目目录中运行 Node 时,Volta 都会自动切换到对应版本的 Node。

同样,您的合作者也可以通过在他们各自的开发机器上安装 Volta 来做同样的事情。

安装

按照官方入门安装。

Windows 系统

官网下载并运行 Windows 安装程序,一路 next 即可。

note

Volta's functionality depends on creating symlinks, so you must either:

  • Enable Developer Mode (recommended)
  • Run Volta with elevated privileges (not recommended)

Unix 系统

直接运行以下命令即可:

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

命令是 | bash,但即使是那些使用 zsh / fish 的人也可以毫无问题地安装它。

安装确认

重新启动终端:

volta --version

显示 Volta 版本时安装完成!

使用

安装默认 Node

首先安装 Volta 默认使用的 Node 版本,相当于全局 Node 的版本,即项目未指定特定 Node 版本时,使用该默认版本。

安装最新的 LTS 版本
volta install node
安装最新版本
volta install node@latest
安装相匹配的适当版本
volta install node@14
安装确切的版本
volta install node@16.0.0

当运行这些命令时,由 Volta 在 PATH 环境(或 Windows 上的 Path)中提供的节点可执行文件默认自动运行所选版本的节点。

可以使用 volta install npmvolta install yarn 分别选择 npm 和 Yarn 包管理器的版本。

选择节点引擎

使用命令 volta pin 来选择项目的 Node 引擎和包管理器的版本。

volta pin node@14.17
volta pin npm@6.14

Volta 将 Node 引擎的准确版本保存在 package.json,这样你就可以把你的选择提交给 git。

package.json
"volta": {
"node": "14.17.3",
"npm": "6.14.13"
}

从那时起,每次在项目目录中运行 Node 时,Volta 都会自动切换到您选择的同一版本 的 Node。

类似的,所有的合作者都可以通过在他们的开发机器上安装 Volta 来做同样的事情。

使用项目工具

使用 Volta 后,它不仅帮你控制每个项目使用的 Node.js 版本,还能确保项目中使用的全局工具(比如 TypeScript 或 vuePress)与该项目设定的 Node 版本相匹配。

这个特性非常方便,因为如果你在不同的项目中需要不同版本的工具,Volta 会自动帮你切换到正确的版本,无需手动干预。

假设你有两个项目,项目 A 使用 TypeScript 3.9 版本,而项目 B 需要 TypeScript 4.1 版本。在没有 Volta 的情况下,你需要手动记住在两个项目之间切换时更改 TypeScript 的版本,或者可能会在全局范围安装一个版本,这可能会导致其中一个项目无法正确运行,因为它们依赖于不同的 TypeScript 版本。

项目 A 的 package.json
{
"name": "project-a",
"devDependencies": {
"typescript": "3.9"
},
"volta": {
"node": "12.18.3"
}
}
项目 B 的 package.json
{
"name": "project-b",
"devDependencies": {
"typescript": "4.1"
},
"volta": {
"node": "14.15.1"
}
}

当你在项目 A 工作时,不管全局安装了哪个版本的 TypeScript,Volta 会确保使用的是 3.9 版本。在命令行中运行 tsc 命令,Volta 会查找项目 A 中指定的版本,并执行那个版本的 TypeScript 编译器。

当你切换到项目 B 并运行 tsc 时,Volta 会自动切换到 TypeScript 4.1 版本,即使在你的机器上全局安装的是另一个版本。Volta 会智能地为当前项目选择正确的版本,无需你手动切换或配置。

更好的是,这些工具在安装时不仅固定在项目中,还被固定到特定的 Node 引擎上,除非显式地更改。

Pnpm 支持

对 pnpm 的支持目前是实验性的。要启用该功能,请确保环境变量 VoLTA_FEATURE_PNPM 设置为 1。

在 Windows 上可以添加到环境变量中。

在 Linux/Mac 上,可以在配置文件脚本中设置该值(例如 .bash_profile.zshrc 或类似的脚本)。

目前已知使用 pnpm 作为包管理器的限制:

  1. 全局安装:目前不支持全局安装(例如 pnpm install -g),并且会导致错误。
  2. 迁移:目前还没有自动迁移功能,因此如果您以前将 pnpm 作为 Volta 全局文件安装,则需要通过调用 Volta install pnpm 手动重新安装它。在启用支持并重新安装之前,您可以通过 volta uninstall pnpm 卸载之前安装的 pnpm 包。一旦切换到本机 pnpm 支持,由于目前缺乏卸载实现,可能无法通过调用相同的命令来删除孤立的旧 pnpm 包。

命令

查看 Volta 常用命令:

volta help