- 作者:老汪软件技巧
- 发表时间:2024-08-29 00:04
- 浏览量:
需求背景
随着项目越来越多,新旧项目所要求的node版本和 包管理器不一样,例如旧项目使用node14 & yarn,而新项目使用的node18 & pnpm。
在新旧项目并行开发时,总需要手动切换一下node&包管理器,操作麻烦&容易忘记。
需求目的
解决上述“痛点”,我们需要实现:“自动切换Node版本 & 自动切换包管理器“
自动切换Node版本
业界中解决此问题的方案有不少,经过调研主流的有这几种
nvm工具
NVM(Node Version Manager)是一个用于管理多个Node.js版本的工具,支持多个平台(PS:不支持Windows)
Windows 平台建议使用[nvm-windows]()软件代替“nvm”
实现原理
PS: nvm-windows 的实现原理和nvm并不相同
Shell 脚本:nvm 是一个基于 shell 脚本的工具,主要用于 Unix 系统(如 Linux 和 macOS)。它通过修改当前 shell 会话的环境变量(主要是 PATH)来切换 Node.js 版本。版本切换:当你使用nvm use 命令时,nvm 会修改 PATH 环境变量,使其指向指定版本的 Node.js 二进制文件。版本安装:nvm 会将不同版本的 Node.js 安装到一个特定的目录中(通常是~/.nvm),并通过修改 PATH 来切换版本。.nvmrc
.nvmrc文件是NVM使用的配置文件,用于指定项目所需的Node.js版本。
当在项目目录下执行nvm use命令时,NVM会查找并使用.nvmrc文件中指定的版本。
这样可以确保在不同的项目中使用不同的Node.js版本,以满足项目的需求。
.nvmrc文件通常包含一个版本号,如14.17.0,表示需要使用Node.js的14.17.0版本。
自动根据.npmrc文件切换nodefnm 工具
nvm(Node Version Manager)和fnm(Fast Node Manager)都是用于管理 Node.js 版本的工具。但fnm使用 Rust 编写,性能优越,跨平台支持更好。
详情介绍fnm:
主要解决:nvm不支持windows平台问题
实现原理
与nvm类似,不再阐述
同样支持.nvmrc自动切换Node
volta 工具
Volta 是一个独立的二进制工具,使用rust构建,最近迭代到2.x版本,主要解决了在windows平台的运行问题
实现原理
PS: 与nvm-windows类似
全局安装:Volta 是一个全局安装的工具,它会将自身添加到系统的 PATH 中。命令拦截:Volta 拦截所有与 Node.js 相关的命令(如node,npm,npx等),并根据当前项目或全局配置来决定使用哪个版本的 Node.js。版本管理:Volta 使用一个全局的缓存目录来存储不同版本的 Node.js 和相关工具。当你切换版本时,Volta 只是更新它的内部指针来指向正确的版本(软连接),而不需要修改系统的 PATH。
支持packjson.volta 自动切换Nodevolta pin node@18
打开项目的时候就会触发,nvm & fnm 是打开Shell的时候触发切换,volta速度更快
n 工具
以npm包方式安装,但不支持windows平台,pass!
asdf 工具
不同于其他node管理工具,asdf 除了nodejs,还支持其他语言 Ruby, Elixir, Erlang & more
通过插件化方式来使用,但过于复杂的配置则没有尝试
对比nvmfnmvolta
跨平台
不支持windwos
全
全
自动切换
.nvmrc(nvm-windows不支持)
.nvmrc/.node-version
package.json > volta (暂不支持.npmrc)
语言
Shell
Rust
Rust
切换node速度
正常
快
很快
诞生时间
2010
2019
2018
流行度
高
较高
一般
迭代频率
高
高
高
自动切换包管理器@antfu/ni
/antfu-colle…
原理
根据项目中的lock文件,自动判断使用yarn or pnpm or npm or bun
指定项目的包管理器
通过配置package,添加install前置脚本,可以强制指定包管理器
"preinstall": "npx -y only-allow pnpm"
CorePack
以上两种方法,只能指定包管理器,但不能具体到包管理器的版本号。
corepack 是 node 官方出的一个管理 node 包管理器的管理器,其已经内置于node@16.9.0 以上版本中,与 npm 一样作为被默认安装的指令工具,但默认没有被启用。
需要手动执行corepack enable来开启
配置文件
与 volta 类似的,corepack 也是通过识别项目 package.json 中声明的配置来自动切换包管理器的,还会默认生成hash值
此时当我们使用pnpm指令的时候,corepack 会自动安装对应版本,并调用该版本。
兼容性
因为对node版本有要求,corepack还没默认开启;
而其默认不会托管 npm,也不建议这么做(因为 node 版本与 npm 版本已经强绑定了),因此不会拦截npm install的指令
corepack 还有api的break change,需要注意你的node版本,建议先使用旧版本api,保证兼容。
node 16 用的是corepack prepare
node 18 以上用的是corepack install
…
…
在node16中,强制更新corepack版本,会报错
Volta
volta 也可以管理管理器,但不推荐使用。因为corepack 必定是一个趋势,已经被 node 官方视为一个规范。所以对于包管理器的管理来说,应当尽量使用 Corepack 而非 Volta。
如果你的团队 node 版本低于16.9.x版本,同时项目又使用了 yarn/pnpm 来进行包管理,那么使用 corepack 可能存在问题,可以考虑使用 volta 的包管理器的管理功能。
兼容性
使用了volta,会与corepack产生冲突,因为他们的实现原理类似。
目前不推荐同时使用,相关issue: volta-cli/volta: Volta: JS Toolchains as Code. ⚡
此外,目前volta的包管理功能不兼容pnpm,相关issue: volta-cli/volta: Volta: JS Toolchains as Code. ⚡
最佳实践
自动切换包管理器:使用corepack
CICD(linux平台)