Table of Contents

nvm

管理多个 Node.js 版本(nvm管理多个node,每个版本的node都有自己的npm,不和其他node共享)

node的版本是很重要的,Ubuntu上APT源的nodejs更新太慢,(22版Ubuntu的默认版本nodejs,在2025年初,vue创建新项目都会失败…前端变化就这么快吗?)建议不要用APT安装nodejs

建议使用:nvm(可以管理node版本) https://github.com/nvm-sh/nvm


安装

# Mac上测试,是可以安装的
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash

# 重开一下 Terminal 或者 source <bashrc>(Mac的话是zsh)
ubuntu@instance-20250106-1816:~/djwcb$ nvm --version
0.40.1

这个安装脚本做了什么呢?将 nvm clone 到 ~/.nvm,然后配置用户的 <bashrc>(The script clones the nvm repository to ~/.nvm, and attempts to add the source lines from the snippet below to the correct profile file (~/.bashrc, ~/.bash_profile, ~/.zshrc, or ~/.profile).

使用

# nvm 基础命令(来自官方文档)
$ nvm use 16
Now using node v16.9.1 (npm v7.21.1)
$ node -v
v16.9.1

$ nvm use 14
Now using node v14.18.0 (npm v6.14.15)
$ node -v
v14.18.0

$ nvm install 12
Now using node v12.22.6 (npm v6.14.5)
$ node -v
v12.22.6

# node版本更换后,npm版本应该也是自动更换的吧(待确认:是的,每个node用自己的npm,不共享)
# 本人常用的命令
nvm ls # 查看安装了哪些版本(system表示系统自带的node)
nvm ls-remote # 查看可安装的版本

nvm install 22.14.0 # 安装某个特定版本
nvm use 22.14.0 # 切换 node 版本,可以看到,node 版本切换之后,npm也会切换

# node 的安装路径
momoka@Momokas-Mac-mini ~ % which node
/Users/momoka/.nvm/versions/node/v22.14.0/bin/node
# npm 的安装路径
momoka@Momokas-Mac-mini ~ % which npm
/Users/momoka/.nvm/versions/node/v22.14.0/bin/npm
# npm 全局包的安装路径
momoka@Momokas-Mac-mini ~ % npm root -g
/Users/momoka/.nvm/versions/node/v22.14.0/lib/node_modules

每个版本的node的全局package都是独立管理的(包括npm,因为npm自己也是一个node package),实验如下:

anny@annys-MacBook-Air ~ % nvm use 22   
Now using node v22.14.0 (npm v10.9.2)
anny@annys-MacBook-Air ~ % npm --version
10.9.2
anny@annys-MacBook-Air ~ % npm list -g
/Users/anny/.nvm/versions/node/v22.14.0/lib
├── corepack@0.31.0
└── npm@10.9.2

anny@annys-MacBook-Air ~ % nvm use 23 
Now using node v23.10.0 (npm v10.9.2)
anny@annys-MacBook-Air ~ % npm --version
10.9.2
anny@annys-MacBook-Air ~ % npm list -g
/Users/anny/.nvm/versions/node/v23.10.0/lib
├── @anthropic-ai/claude-code@1.0.64
├── corepack@0.32.0
└── npm@10.9.2

类比 python 的虚拟环境

自己的想法
python的包里面,有需要编译的部分(C代码),所以python包在发布时候,会针对不同的python版本,发布不同的版本,类似:python3.8-xxx1.1-amd64.whl(AI:在 Python 的 pip 包管理 中,每个 Python 版本 通常需要单独发布对应的包,而不是像 npm 那样共用同一个包。
但是 node 的包就是纯 js 代码(大部分情况),所以,一个 node 包会限定兼容的 node 范围,但是不会为每一个 node 版本都单独打一次包,一个 node 包就类似 xxx1.1(AI:npm 包的代码和依赖是独立于 Node.js 版本的,开发者通常只需要发布一个包,而不是针对不同的 Node.js 版本发布多个版本。尽管 npm 包本身可以跨 Node.js 版本使用,但某些包可能需要某些 Node.js 版本的特性。开发者可以在 package.json 里 声明支持的 Node.js 版本,这样 npm 会自动检查是否兼容。)安装的时候的 node 环境也不重要。比如,安装到工程里面的 node 包,只会记录包的版本,之后只要使用适合的 node 版本就能运行。