使用 Volta 管理工具


前言

近两年,我都是使用 volta 管理 node 版本 和为项目锁定 yarn 版本。没遇到什么大问题,最近了解了 corepack 后,打算切换成 fnm + corepack 管理 node 版本和包管理工具。

安装

Volta 在 Linux/Mac 下通过 shell 脚本安装, Windows 下通过 exe 安装。安装后续,都需要配置下环境变量。

Getting Started | Volta

shell 配置

oh-my-zsh 的话, 可以 volta completions zsh > ~/.oh-my-zsh/completions/_volta, omz 会自动加载。

特色

  • 可以管理 node 版本和包管理工具
  • 可以管理全局安装的 npm 包
  • 实验性的支持 pnpm

项目固定版本

volta pin 可以固定 node, npm, yarn 版本, 会在 package.json 中生成volta字段, 以后使用 volta install 安装包的时候,会使用这个版本。

这里可以看到 github 中所有使用 volta 的项目: context:global “volta” file:package.json - Sourcegraph

简单的全局包管理

拦截了 yarn global, npm global 安装方式, 使用 volta install 安装全局包。

pnpm 支持

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

在 Windows 上可以添加到环境变量中。在 Linux/Mac 上,您可以在配置文件脚本中设置该值(例如 .bash_profile、.zshrc 或类似的脚本)。

优点

  • 可以当个全局的 npm 包的安装工具
  • 每个包,安装的时候,会记录依赖的 node 版本, 可以在 ~/.volta/tools/user 目录下查看

缺点

  • 另外 volta 也有快一年没更新了,并且还不支持锁定 pnpm 版本。
  • global 安装的包, 是会记录包安装时刻的 node 版本的。如果切换了 node 版本,包的依赖会使用之前的 node 版本,这个时候就需要重新安装一遍。比如 git cz 这样的工具,全局使用的话,就会有这个问题。
  • volta fetchvolta install 命令让人混淆,完全可以 volta install 统一处理,volta fetch的使用场景,可能是为了将工具缓存到本地机器以供离线使用
  • 迟早会被 corepack 官方替代
  • 无法和 rush.js 这种 monorepo 结合, root 下没有 package.json, 无法固定
  • 每个包,由于有自身依赖的 node , 而不是使用当前项目维度的,可能会在 git hook 阶段,导致 node 版本校验失效。

技术总结

没大问题,用习惯也就无所谓了,但我还是建议切换 fnm + corepack, 包管理使用 pnpm.