likes
comments
collection
share

自动切换Node版本 & 包管理器“自动切换Node版本 & 自动切换包管理器“;多个`node version man

作者站长头像
站长
· 阅读数 26

需求背景

随着项目越来越多,新旧项目所要求的node版本和 包管理器不一样,例如旧项目使用node14 & yarn,而新项目使用的node18 & pnpm

在新旧项目并行开发时,总需要手动切换一下node&包管理器,操作麻烦&容易忘记。

需求目的

解决上述“痛点”,我们需要实现:“自动切换Node版本 & 自动切换包管理器“

自动切换Node版本

业界中解决此问题的方案有不少,经过调研主流的有这几种

直接看对比结果的请跳转💫

nvm工具

NVM(Node Version Manager)是一个用于管理多个Node.js版本的工具,支持多个平台(PS:不支持Windows)

Windows 平台建议使用[nvm-windows](https://github.com/coreybutler/nvm-windows)软件代替“nvm”

实现原理

PS: nvm-windows 的实现原理和nvm并不相同

  1. Shell 脚本:nvm 是一个基于 shell 脚本的工具,主要用于 Unix 系统(如 Linux 和 macOS)。它通过修改当前 shell 会话的环境变量(主要是 PATH)来切换 Node.js 版本。
  2. 版本切换:当你使用 nvm use <version> 命令时,nvm 会修改 PATH 环境变量,使其指向指定版本的 Node.js 二进制文件。
  3. 版本安装: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版本。

自动切换Node版本 & 包管理器“自动切换Node版本 & 自动切换包管理器“;多个`node version man

自动根据.npmrc文件切换node

fnm 工具

实现原理

与nvm类似,不再阐述

同样支持.nvmrc自动切换Node

自动切换Node版本 & 包管理器“自动切换Node版本 & 自动切换包管理器“;多个`node version man

volta 工具

Volta 是一个独立的二进制工具,使用rust构建,最近迭代到2.x版本,主要解决了在windows平台的运行问题

实现原理

PS: 与nvm-windows类似

  1. 全局安装:Volta 是一个全局安装的工具,它会将自身添加到系统的 PATH 中。
  2. 命令拦截:Volta 拦截所有与 Node.js 相关的命令(如 nodenpmnpx 等),并根据当前项目或全局配置来决定使用哪个版本的 Node.js。
  3. 版本管理:Volta 使用一个全局的缓存目录来存储不同版本的 Node.js 和相关工具。当你切换版本时,Volta 只是更新它的内部指针来指向正确的版本(软连接),而不需要修改系统的 PATH。

自动切换Node版本 & 包管理器“自动切换Node版本 & 自动切换包管理器“;多个`node version man

支持packjson.volta 自动切换Node

volta pin node@18

打开项目的时候就会触发,nvm & fnm 是打开Shell的时候触发切换,volta速度更快

自动切换Node版本 & 包管理器“自动切换Node版本 & 自动切换包管理器“;多个`node version man

n 工具

以npm包方式安装,但不支持windows平台,pass!

github.com/tj/n?tab=re…

asdf 工具

不同于其他node管理工具,asdf 除了nodejs,还支持其他语言 Ruby, Elixir, Erlang & more

通过插件化方式来使用,但过于复杂的配置则没有尝试

对比

nvmfnmvolta
跨平台不支持windwos
自动切换.nvmrc(nvm-windows不支持).nvmrc/.node-versionpackage.json > volta (暂不支持.npmrc)
语言ShellRustRust
切换node速度正常很快
诞生时间201020192018
流行度较高一般
迭代频率

自动切换包管理器

@antfu/ni

github.com/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版本 & 包管理器“自动切换Node版本 & 自动切换包管理器“;多个`node version man

兼容性

因为对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版本,会报错 自动切换Node版本 & 包管理器“自动切换Node版本 & 自动切换包管理器“;多个`node version man

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平台) 自动切换Node版本 & 包管理器“自动切换Node版本 & 自动切换包管理器“;多个`node version man

转载自:https://juejin.cn/post/7407983735662411810
评论
请登录