Volta是用来管理Node,包管理器,命令行工具版本的工具,让开发者可以在一个稳定的环境构建并运行程序。Volta的诞生主要针对以下问题:
问题1:需要根据项目切换Node及包管理器版本
项目中如果需要使用指定的Node或包管理器版本,开发者往往需要手动切换到该版本,比如使用我们很熟悉的nvm。
针对该问题,Volta给出的解决方案是,通过对项目声明Node及包管理器版本,Volta就能确保该项目下使用的Node和包管理器版本是固定的,无需额外操作。示例如下:
在项目目录下运行:
volta pin node@12.20
volta pin yarn@1.19
可以看到Volta在package.json中添加了版本信息:
"volta": {
"node": "12.20.2",
"yarn": "1.19.2"
}
之后任何开发者只要安装了Volta,那么在该项目下查看Node和包管理器版本都会是指定的版本:
node --version # 12.20.2
yarn --version # 1.19.2
问题2: 命令行工具全局安装后难以管理版本
项目中使用的命令行工具使用全局安装会有以下问题:
- 如果使用的命令行工具,未添加到项目的依赖里,那其他开发者就不知道你用的什么工具,难以合作
- 如果不同开发者用的全局安装的工具版本不一样,那么出现bug将难以排查
- 如果不同的项目使用的工具版本不一样,切换项目时需要切换工具版本
以上问题,通用的解决方案是把项目需要使用的命令,全写在package.json的scripts里,因为通过npm run执行的文件肯定是项目的依赖里的,不会出现版本差错。
但是使用scripts管理命令行工具也存在一些问题:
- 需要了解运行特定工具所需的脚本,这增加了心理负担(例如
npm testvsmocha)。 - 可能会使自定义命令变得棘手,例如从测试套件中运行单个测试。
- 无法用于用于引导项目的工具,例如
create-react-app。
而Volta实现了,一次全局安装,到处运行而无需在意版本。也就是说全局安装后如果在项目目录运行工具,则会使用项目依赖的版本,如果非项目目录下,则使用默认安装的版本。示例如下:
-
全局安装Typescript:
npm install --global typescript -
在依赖了不同Typescript版本的项目下,查看Typescript版本:
cd /path/to/project-using-typescript-3.9.4 tsc --version # 3.9.4 cd /path/to/project-using-typescript-4.1.5 tsc --version # 4.1.5
个人想法
在早期版本的Volta,只有通过volta install mocha安装工具时,才会接管该工具的版本管理。然而现在的Volta代理了所有npm install的操作,侵入式太强了,不知会和其他存在的工具比如nvm有什么冲突,对于Volta声称解决的问题来说,似乎有点大题小作。另外Volta目前对pnpm的支持还是实验性的。