• 作者:老汪软件技巧
  • 发表时间: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平台)