别急着用 apt install nodejs,因为Ubuntu/Debian默认源中Node版本严重滞后(如10.x/12.x),不支持ESM语法和新API,易报错且可能破坏系统稳定性;推荐使用NVM——纯用户态工具,可安全切换多版本、自动加载项目指定版本,安装后需重新打开终端或source配置文件生效。

为什么别急着用 apt install nodejs
Ubuntu/Debian 默认源里的 nodejs 版本往往严重滞后(比如 10.x 或 12.x),而现代项目普遍需要 16.x+,甚至要切 18.x/20.x 做兼容测试。直接用系统包管理器装,大概率遇到 error: Cannot find module 'node:fs' 或 ERR_UNSUPPORTED_ESM_URL_SCHEME 这类报错——不是代码问题,是 Node 版本太老不支持 ESM 语法或新 API。
更麻烦的是:系统级 Node 一旦被其他工具(如 snap 安装的 VS Code、某些桌面环境组件)依赖,强行升级可能破坏系统稳定性。
- 系统包安装的 Node 通常没配
npm可执行文件(得额外装npm包,版本还未必匹配) -
/usr/bin/node权限受系统保护,普通用户无法覆盖或软链切换 - 无法并行安装多个版本,调试跨版本兼容性几乎不可能
用 NVM 装 Node 是当前最稳妥的选择
NVM(Node Version Manager)是纯用户态的 Shell 脚本,所有文件落在 $HOME/.nvm 下,不碰系统路径,卸载只需删目录。它能自由切换版本、设默认版本、按项目自动加载指定版本(配合 .nvmrc)。
安装命令很简单,但注意两点:
- 必须用
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash(推荐 v0.39.7,v0.40.0+ 在某些旧 shell 下有初始化问题) - 执行完后,关闭当前终端再新开一个,或者手动运行
source ~/.bashrc(Zsh 用户用source ~/.zshrc),否则nvm命令不可用 - 验证是否生效:
nvm --version应输出版本号;which nvm应返回/home/xxx/.nvm/nvm.sh类似路径
装完 NVM 后怎么装和切换 Node 版本
装版本前先看可用列表:nvm ls-remote。别盲目装最新版(如 v21.7.3),生产环境建议选 LTS 版本(带 LTS 标记,如 v20.11.1)。
常用操作:
- 安装指定 LTS 版本:
nvm install --lts(自动装最新 LTS)或nvm install 20.11.1 - 设为默认版本(新终端自动加载):
nvm alias default 20.11.1 - 临时切换当前终端的 Node 版本:
nvm use 18.20.4 - 查看已安装版本:
nvm ls;当前生效版本会标->
注意:nvm use 只影响当前终端会话。关掉终端再开,仍走 default 设置。如果某个项目必须固定版本,可在项目根目录放 .nvmrc 文件,内容就一行:18.20.4,然后进目录执行 nvm use 即可自动加载。
常见陷阱与绕过方法
装完发现 node -v 正常但 npm -v 报错“command not found”?这是 NVM 安装时 npm 没正确链接。别重装,执行:nvm reinstall-packages 20.11.1(把版本号换成你当前用的)。
在 CI/CD 脚本或 systemd service 里用 NVM?不行——NVM 依赖交互式 Shell 初始化。这类场景应改用 NodeSource 的 .deb 包,或直接下载二进制 tarball 解压到 /opt/node 并配置 PATH。
另一个坑:sudo npm install -g 会导致全局模块装到 root 的 node_modules,而普通用户用 nvm use 切换后找不到。永远用 npm install -g(不加 sudo),NVM 会自动把全局模块放在 ~/.nvm/versions/node/v20.11.1/lib/node_modules 下,权限干净。
真正麻烦的是 Docker 构建或某些 IDE 内置终端(如 VS Code 的集成终端),它们有时不会读取 .bashrc。这时得检查终端启动方式,或在 VS Code 设置里加 "terminal.integrated.profiles.linux": { "bash": { "path": "/bin/bash", "args": ["-i"] } },强制启用交互模式。










