JS工具管理器Volta简介

886 阅读3分钟

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 test vs mocha)。
  • 可能会使自定义命令变得棘手,例如从测试套件中运行单个测试。
  • 无法用于用于引导项目的工具,例如 create-react-app

而Volta实现了,一次全局安装,到处运行而无需在意版本。也就是说全局安装后如果在项目目录运行工具,则会使用项目依赖的版本,如果非项目目录下,则使用默认安装的版本。示例如下:

  1. 全局安装Typescript:

    npm install --global typescript

  2. 在依赖了不同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的支持还是实验性的。