自动切换Node版本 & 包管理器“自动切换Node版本 & 自动切换包管理器“;多个`node version man
需求背景
随着项目越来越多,新旧项目所要求的node版本和 包管理器不一样,例如旧项目使用node14 & yarn
,而新项目使用的node18 & pnpm
。
在新旧项目并行开发时,总需要手动切换一下node&包管理器,操作麻烦&容易忘记。
需求目的
解决上述“痛点”,我们需要实现:“自动切换Node版本 & 自动切换包管理器“
自动切换Node版本
业界中解决此问题的方案有不少,经过调研主流的有这几种
nvm
github.com/nvm-sh/nvmnvm-window
s github.com/coreybutler…n
github.com/tj/nfnm
github.com/Schniz/fnmvolta
github.com/volta-cli/v…asdf
github.com/asdf-vm/asd…
nvm工具
NVM(Node Version Manager)是一个用于管理多个Node.js版本的工具,支持多个平台(PS:不支持Windows)
Windows 平台建议使用[nvm-windows](https://github.com/coreybutler/nvm-windows)
软件代替“nvm”
实现原理
PS: nvm-windows 的实现原理和
nvm
并不相同
- Shell 脚本:nvm 是一个基于 shell 脚本的工具,主要用于 Unix 系统(如 Linux 和 macOS)。它通过修改当前 shell 会话的环境变量(主要是 PATH)来切换 Node.js 版本。
- 版本切换:当你使用
nvm use <version>
命令时,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文件切换node
-
nvm-windows不支持.nvmrc(linux or MacOS 不用额外配置)
-
bash脚本 一般我们windows电脑都有安装"git-bash",我们可以通过识别“.nvmrc”文件,自动执行
nvm use
。 nvm auto switch node version by current working directory for zsh 这段脚本直接写到“~/.bashrc”文件中
fnm 工具
实现原理
与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 自动切换Node
volta pin node@18 |
---|
打开项目的时候就会触发,nvm & fnm 是打开Shell的时候触发切换,volta速度更快
n 工具
以npm包方式安装,但不支持windows平台,pass!
asdf 工具
不同于其他node管理工具,asdf 除了nodejs,还支持其他语言 Ruby, Elixir, Erlang & more
通过插件化方式来使用,但过于复杂的配置则没有尝试
对比
nvm | fnm | volta | |
---|---|---|---|
跨平台 | 不支持windwos | 全 | 全 |
自动切换 | .nvmrc(nvm-windows不支持) | .nvmrc/.node-version | package.json > volta (暂不支持.npmrc) |
语言 | Shell | Rust | Rust |
切换node速度 | 正常 | 快 | 很快 |
诞生时间 | 2010 | 2019 | 2018 |
流行度 | 高 | 较高 | 一般 |
迭代频率 | 高 | 高 | 高 |
自动切换包管理器
@antfu/ni
原理
根据项目中的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
www.npmjs.com/package/cor… www.npmjs.com/package/cor…
在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. ⚡
最佳实践
-
自动切换Node版本:windows平台使用
fnm
;linux使用fnm/nvm
都行- 配置.nvmrc
-
自动切换包管理器:使用
corepack
- 配置package.json
-
CICD(linux平台)
转载自:https://juejin.cn/post/7407983735662411810