你是不是也遇到过这种场景:项目本地跑得好好的,突然就报了一行Node.js not found,你决定把 Node.js 卸载重装,结果控制面板里点了卸载,重装完一敲node -v,依然提示“找不到命令”。问题几乎不在安装步骤,而在卸载没卸干净。Node.js 和普通软件不一样,它会在系统里留下安装目录、全局包、缓存、环境变量等多个“分身”,任何一个没清掉,重装后的环境都是半残状态。
这篇把 Node.js 的卸载和安装掰开揉碎地讲清楚:不同安装方式分别怎么卸、哪些残留必须手动清、环境变量怎么修、装完该怎么验证、遇到not found这类报错怎么排查。不管你是刚入门的小白,还是被 Mac/Linux/Windows 环境折腾过无数次的老手,都能在这里找到对应的操作。我的目标很朴素:让你能干净卸载,并装上一个长期稳定、不折腾的新环境。
1. 卸载之前,先搞清楚Node.js到底在你机器上装了什么
1.1 Node.js、npm、全局包和缓存:四件套
很多人以为 Node.js 就是一个node.exe,卸载就是把那个文件夹删了。实际上,一套完整的 Node.js 环境至少包含四类东西:
- Node.js 运行时本体:Windows 下默认在
C:\Program Files\nodejs,macOS/Linux 下可能是/usr/local/bin/node、/usr/bin/node或者某个版本管理器的专属目录。 - npm 及 npx、corepack 等命令行工具:通常跟随 Node 一起装进系统目录,负责管理依赖、执行脚本。
- 全局 npm 包:你用
npm install -g装过的工具,比如yarn、nodemon、typescript、nest,都放在全局目录,Windows 下一般是C:\Users\你的用户名\AppData\Roaming\npm,macOS/Linux 下一般是/usr/local/lib/node_modules或 nvm 管理的对应目录。 - 缓存和配置文件:npm 缓存目录在 Windows 下是
C:\Users\你的用户名\AppData\Local\npm-cache,在 macOS/Linux 下是~/.npm;另外还有.npmrc、.node_repl_history、.node-gyp这类配置文件,分散在用户主目录里。
这四部分分布在完全不同的位置,只删一个地方根本卸不干净。尤其全局包和缓存,它们才是重装后各种“奇怪报错”的源头。比如全局包还在,但全局目录里的node解释器被卸载了,你敲nodemon就会提示脚本无法运行;缓存里存了旧依赖快照,新装的 npm 可能会继续读取,导致npm install依然报过期错误。
1.2 为什么要“彻底”卸载而不是直接删文件夹
直接删安装目录的后果,我见过很多次,主要有三个:
- 环境变量里的旧路径不会自动消失。新装的 Node.js 装到新路径后,系统路径里可能还残留旧路径,导致执行
node -v时调用的还是旧版,或者干脆找不到。 - 全局命令和旧的 node.exe 分离。比如你以前把全局包装在
%APPDATA%\npm,卸载后这个目录还在,里面的.cmd脚本会尝试调用一个已经不在的 node,等于留下了一堆坏掉的快捷方式。 - 缓存、配置里的旧状态会干扰新环境。比如
.npmrc里残留了老的 registry 地址或 prefix 配置,新装的 npm 读到的还是旧配置,你怎么改都没用。
所以,我把“彻底”两个字当成整个流程的底线。动手卸载之前,先别急,不要想着“赶紧卸完赶紧重装”,耐心按下面的分类一步一步来。
2. Windows下的完整卸载链路:程序卸载、残留清理、环境变量修复
2.1 从“卸载程序”和安装器入手
Windows 上最不推荐的方式,是直接删C:\Program Files\nodejs文件夹。Node.js 的安装包通常是 MSI 格式,Windows Installer 在系统里登记了大量信息,如果你直接暴力删除,注册表里会留下残缺记录,之后重装时可能出现“另一个安装程序正在运行”或者“已安装同版本”的提示。
正确的第一步,是从“设置 -> 应用 -> 安装的应用”里找到 Node.js,点击卸载;或者打开旧版“控制面板 -> 程序和功能”卸载。卸载过程中如果提示文件被占用,先关掉所有终端、VSCode、WebStorm,再打开任务管理器,把所有node.exe进程结束掉,然后重新卸载。
如果你当初不是用官方安装包,而是用以下方式装的,卸载入口也不一样:
| 安装方式 | 卸载命令/入口 |
|---|---|
| 官方 MSI 安装包 | 设置 -> 应用 -> Node.js -> 卸载 |
| Chocolatey | choco uninstall nodejs |
| winget | winget uninstall OpenJS.NodeJS |
| nvm-windows | nvm uninstall <版本号>,再卸载 nvm 本身 |
| 绿色版/zip 手动解压 | 没有卸载程序,只能手动删除目录,再清理环境变量 |
其中 nvm-windows 的情况比较特殊。如果你用nvm install装过多个版本,每个版本其实是放在 nvm 的安装目录下的,比如D:\nvm\v20.11.0。卸载时先nvm uninstall <版本号>,确认版本列表空了以后,再从“设置 -> 应用”里卸载 nvm 工具本身。但即使这样,nvm 的缓存和临时文件仍然可能残留在%APPDATA%\nvm或%LOCALAPPDATA%\nvm,需要手动删除。
2.2 清理npm缓存、全局安装目录和用户目录残留
很多人在程序列表里把 Node.js 卸掉,就觉得自己已经卸载完了。其实卸载程序只删除它安装时写入的文件,你后来通过 npm 安装的全局模块、缓存,它一概不管。这一步必须手动处理。
建议打开文件资源管理器,把地址栏路径粘贴进去,逐一确认:
C:\Program Files\nodejs:如果卸载后还存在,直接删除。C:\Users\你的用户名\AppData\Roaming\npm:全局模块目录。如果你确认以后不再需要这些全局工具,整个删。C:\Users\你的用户名\AppData\Roaming\npm-cache:老版本 npm 的缓存目录,删。C:\Users\你的用户名\AppData\Local\npm-cache:新版 npm 的缓存目录,删。C:\Users\你的用户名\.npmrc:npm 配置文件,不需要就删。C:\Users\你的用户名\.node_repl_history:Node REPL 历史记录,可删。C:\Users\你的用户名\.node-gyp:原生模块编译缓存,删。
删除的时候如果提示文件被占用,多半是某些全局命令还在后台运行,比如yarn、nodemon、tsc。打开任务管理器,搜索名字,全部结束进程再来一次。这里我建议你在卸载前先用npm ls -g --depth=0把全局包列表导出一份,避免后面重装时忘了自己装过什么。
2.3 注册表与“已安装同版本”的坑怎么处理
卸载步骤走完后,还有一个很多人容易忽略的地方:注册表残留。某些 MSI 安装的软件卸载后,注册表项不一定都清干净。你重装时如果遇到“Node.js is already installed”或者“Another version is already installed”,十有八九是注册表里还有旧版本信息。
在Win + R里输入regedit打开注册表编辑器,重点查看:
HKEY_CURRENT_USER\Software\Node.jsHKEY_LOCAL_MACHINE\SOFTWARE\Node.jsHKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Node.js
如果存在,先右键导出备份,再删除。不要只删一个就跑,三个位置都检查一遍。不过手动编辑注册表对新手不友好,推荐先装一个 Geek Uninstaller 或者 Revo Uninstaller 这类工具,他们能在卸载主程序后扫描文件系统和注册表残留,把和 Node.js 相关的项列出来,你勾选确认后删除,比手动regedit安全得多。
说到底,这个思路和清理一些“你以为卸载干净、其实后台还在运行”的软件是一样的。很多工具类的软件卸载后还会留下服务、计划任务、配置文件,Node.js 虽然没有服务,但注册表和环境变量残留一样会闹脾气。
2.4 清理系统环境变量,别让旧路径残留
最后一个重点:环境变量。打开“系统属性 -> 高级 -> 环境变量”,检查上下两个Path列表。
系统 Path 里常见残留项:C:\Program Files\nodejs\。
用户 Path 里常见残留项:C:\Users\你的用户名\AppData\Roaming\npm。
这两个都删掉。另外还要检查有没有NODE_PATH这个系统变量或用户变量,如果存在,也删掉。很多人重装之后出现“npm 不是内部或外部命令”,就是因为只删了旧的C:\Program Files\nodejs,忘了用户 Path 里还留着一个旧全局目录,新装的 npm 和旧路径对不上。
改完环境变量,一定要把已经打开的终端窗口、IDE 全部关掉,再重新打开。Windows 的环境变量是在进程启动时读取的,你不重开终端,等于没改。如果重启后还是有问题,再检查一下系统变量和用户变量的 Path 顺序,不要出现两个 node 路径同时存在的情况。
3. macOS和Linux平台的卸载:各家有各家的坑
3.1 macOS:从pkg安装包卸载的官方姿势
如果你是从官方下载的.pkg安装包装的 Node.js,那它默认写在/usr/local目录下。问题是,macOS 的 pkg 安装程序一般不会生成“应用程序”图标,所以你在“应用程序”文件夹里找不到卸载入口。只能手动删文件。
先确认一下 node 的位置:
which node ls -l /usr/local/bin/node如果/usr/local/bin/node是真实文件,不是符号链接,可以执行:
sudo rm -rf /usr/local/bin/node sudo rm -rf /usr/local/bin/npm sudo rm -rf /usr/local/bin/npx sudo rm -rf /usr/local/lib/node_modules sudo rm -rf /usr/local/include/node sudo rm -rf /usr/local/share/doc/node sudo rm -rf /usr/local/share/man/man1/node.1如果ls -l显示这是一个符号链接,指向~/.nvm/versions/node/...,那千万不要执行上面的删除命令,说明你实际是用 nvm 装的,要去 3.4 节看 nvm 的卸载方式。
删完系统目录后,再清理用户主目录里的缓存和配置:
rm -rf ~/.npm rm -rf ~/.node-gyp rm -rf ~/.npmrc rm -rf ~/.node_repl_history rm -rf ~/Library/Caches/node还有一点:旧版 pkg 安装包可能在/Library/Receipts里写安装记录。如果你希望系统完全忘记旧版本,可以在/Library/Receipts里搜索node相关的.pkg文件,如果有,一并删掉。这个步骤不是必须,但会影响后续 pkg 安装时是否提示已安装。
3.2 使用Homebrew安装的Node.js如何干净卸载
Homebrew 装的 Node.js,卸载很简单:
brew uninstall --ignore-dependencies node brew cleanup注意--ignore-dependencies不要省略。Homebrew 在安装 node 时可能顺带装了icu4c等依赖,如果直接brew uninstall node,Homebrew 会把这种“不再被依赖”的库也删掉,万一其他工具也在用,就麻烦了。所以先只删 node,之后确认系统里没有其他工具需要那些依赖,再执行brew autoremove。
Homebrew 卸载后,/usr/local/Cellar/node和/usr/local/opt/node一般会自动清理,但~/.npm和~/.node-gyp仍然要手动删。另外,如果你用 Homebrew 安装过nvm,建议把它也卸掉,换成官方脚本安装方式。Homebrew 版 nvm 在升级和维护上经常出问题,很多“nvm 命令找不到”的情况都是 Homebrew 版引起的。
3.3 Linux发行版的卸载:apt、dnf、源码安装三路并讲
Debian/Ubuntu 系,用 apt 安装的 Node.js:
sudo apt-get remove nodejsremove会保留配置文件,如果想把配置也删掉:
sudo apt-get purge nodejs sudo apt-get autoremove如果你之前是通过 NodeSource 的源安装的,卸载后建议把/etc/apt/sources.list.d/nodesource.list也删掉,否则每次apt update都会访问一个已经没有使用的源。同时可以检查一下/etc/apt/keyrings/nodesource.gpg是否残留,一并删除。
RedHat/CentOS/Fedora 系:
sudo dnf remove nodejs老版本用sudo yum remove nodejs。
如果你是从源码编译安装的,卸载方式是在解压源码的目录里执行:
sudo make uninstall前提是你还留着当时下载的源码目录,并且版本和已安装的版本一致。如果源码目录已经不在了,只能手动删除常见路径:
sudo rm -rf /usr/local/bin/node /usr/local/bin/npm /usr/local/bin/npx sudo rm -rf /usr/local/lib/node_modules sudo rm -rf /usr/local/include/node无论用哪种包管理器安装,最后都别忘了清理用户目录:
rm -rf ~/.npm ~/.node-gyp ~/.npmrc ~/.node_repl_history3.4 nvm或fnm这类版本管理工具管理的Node.js怎么卸
如果你用了 nvm 或 fnm 这类版本管理器,卸载逻辑就完全不一样了。不要让系统的包管理器去卸载 Node,否则 nvm 的符号链接会指向一个不存在的路径,天天报错。
macOS/Linux 的 nvm,卸某个 Node 版本:
nvm uninstall 18.19.0如果要把 nvm 本身也删掉,顺序很重要:先nvm deactivate解除当前版本,然后删除~/.nvm目录,再打开~/.bashrc或~/.zshrc,把里面和 nvm 相关的加载语句删干净:
export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"最后重开终端,执行command -v nvm,没有输出就说明清理干净了。
fnm 也是类似:先fnm uninstall <版本号>,然后删除 shell 配置里的eval "$(fnm env)",再删除~/.local/share/fnm数据目录。如果你用了n这个轻量版本管理工具,卸载方式则是sudo n rm <版本号>或手动删除/usr/local/n目录。总而言之,先搞清自己是用什么装的,再决定动手路线,这是卸载阶段最重要的一句话。
4. 从零开始安装Node.js:官方包、版本管理器和包管理器的选择
4.1 官方安装包和LTS/Current到底选哪个
全新安装时,选对版本比安装本身更重要。官方下载页会给你两个选择:LTS(长期支持版)和Current(最新特性版)。我的建议非常明确:日常开发选 LTS。
LTS 版本是 Node.js 官方承诺长期维护的版本,稳定性和兼容性都经过大量项目验证。Current版本一般只适合尝鲜,或者某个工具明确要求新特性时才用。你在生产环境里、公司项目里、写教程里,都优先选 LTS,能少踩 90% 的坑。
Windows 下载.msi,macOS 下载.pkg,Linux 可以选择二进制压缩包,或者直接用发行版自带的包管理器安装。安装时 Windows 的 MSI 向导会问你是否“自动安装必要的工具”,如果你没有装过 Python 和 Visual Studio Build Tools,建议勾选。很多原生模块在npm install时需要通过 node-gyp 编译,没有本地构建工具链会直接报错。如果你已经装了 VS Code、Git、Python,那可以不勾,但要注意后续若出现python not found或者MSBuild相关的报错,还是要回来补装。
4.2 使用nvm-windows实现多版本切换
如果你经常同时维护多个项目,一个用 Node 14,一个用 Node 20,那不建议用官方安装包,直接用 nvm-windows 管理。
下载nvm-setup.exe,安装到D:\nvm这种纯英文无空格的目录。装完后打开终端,先看可用版本:
nvm list available然后安装、切换:
nvm install 20.11.0 nvm install 18.19.0 nvm use 20.11.0nvm list可以看当前已安装的版本,带*的是当前使用的版本。如果nvm use之后切换不生效,检查一下是不是没有执行nvm on,nvm-windows 有nvm on/off两个状态,只有on时才接管 Node 版本。还可以通过nvm alias default 20.11.0设置默认版本,这样新开终端时会自动使用指定版本。
用 nvm-windows 有一个非常关键的原则:不要再用npm config set prefix去改 npm 全局目录。nvm-windows 的全局包是放在每个 Node 版本自己的目录下的,你自定义 prefix 之后,切换版本时全局命令经常找不到,排查起来极其痛苦。以后要装全局工具,就在确定版本后npm install -g <包名>直接装,简单粗暴。
4.3 macOS/Linux下的nvm和fnm安装配置
macOS/Linux 上最流行的还是 nvm。官方安装方式:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash安装完脚本会自动往~/.zshrc或~/.bashrc里写入加载代码。如果新开终端后nvm命令找不到,手动把下面这两行加进去:
export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"然后source ~/.zshrc或重开终端。安装 Node:
nvm install --lts nvm use --lts nvm ls如果你所在网络访问官方下载源很慢,可以设置镜像:
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/也可以把这一行直接写进 shell 配置文件里,让 nvm 每次下载都走镜像。实测下来速度提升明显。
如果你喜欢更快、支持自动切换.nvmrc的版本管理器,可以试试 fnm。它用 Rust 写的,启动速度快,但配置稍微复杂一点。安装后需要在 shell 配置里加eval "$(fnm env)",然后fnm install 20、fnm default 20。个人建议:不想折腾就用 nvm,想追求速度再考虑 fnm。
4.4 配置npm全局目录和国内镜像,避免后续踩坑
安装完 Node.js 后,别急着跑项目,先做几个很基础但很关键的配置。
第一步,查看当前配置:
npm config get prefix npm config get cache npm config get registry第二步,设置镜像。如果你在国内,默认的https://registry.npmjs.org/速度可能会很慢,可以用 npmmirror:
npm config set registry https://registry.npmmirror.com/这个命令会把配置写进~/.npmrc,对所有项目生效。当某个包在镜像上同步不及时,临时用官方源装一次就好:
npm install <包名> --registry=https://registry.npmjs.org/第三步,关于全局目录。如果你用的是官方安装包,且想把全局包从 C 盘移走,可以用:
npm config set prefix D:\nodejs\node_global但改完之后,记得把D:\nodejs\node_global加进系统 Path,否则npm install -g安装的命令无法直接执行。如果你用的是 nvm 或 fnm,这一步反而不要做,理由前面已经说过。全局目录这种设置,能不动就不动,只靠 npm 默认目录,大多数情况下最省心。
5. 安装后的第一轮体检:版本号、环境变量、全局命令的全链路验证
5.1 node -v / npm -v 好使不等于环境就对了
很多人在新终端里看到node -v输出了版本号,就以为大功告成。其实这只是最基础的一步。完整的体检,至少要执行这些命令:
node -v npm -v npx -v which node # Windows 用 where node which npm # Windows 用 where npm npm config get registry npm root -g以 Windows 为例,where node必须只输出当前新装的路径,如果出现了多个路径,说明环境变量里还有旧残留。npm root -g应该指向一个实际的全局 node_modules 目录,而不是不存在的路径。
更严谨的做法是写一个测试脚本,验证实际执行路径:
// test.js console.log(process.version); console.log(process.platform); console.log(process.execPath);然后运行node test.js。如果process.execPath显示的是你新装的路径,才算真正通过。这一步能提前发现很多环境配置问题,尤其是那些“明明node -v对,但工具里还是调用旧版”的诡异情况。
5.2 经典报错:'node' 不是内部或外部命令,也不是可运行的程序
这个报错基本可以锁定到环境变量问题。具体分三种情况:
- 刚装完还没重开终端。Windows 的终端进程启动时读取环境变量,所以请把所有终端、IDE、VS Code 全部关掉,再重新打开。
- Path 里根本没有 Node.js 安装目录。手动把
C:\Program Files\nodejs\加到系统 Path 或用户 Path,注意路径和反斜杠别写错。 - 安装路径包含中文或空格,导致某些脚本解析异常。这种情况只能卸载,重装到纯英文路径。
还有一个隐藏场景:你用了 nvm-windows,但当前没有激活任何版本。执行nvm list,看看列表里有没有带*的版本;如果没有,nvm use <版本号>再试。如果nvm list提示没有安装任何版本,先nvm install <版本号>。
macOS/Linux 上如果node提示 command not found,先执行which node确认路径;如果 nvm 输出的node路径是你nvm use之前的老路径,检查 shell 配置加载顺序,确保 nvm 初始化语句在 PATH 设置之后。
5.3 npm install 卡住不动、报错ERESOLVE、node not found的处理思路
重装环境后第一件事往往是npm install,但这一步最容易暴露问题。
如果你发现npm install卡在sill idealTree buildDeps这种阶段很久不动,大概率是网络问题,或者 npm 缓存损坏。先执行npm cache verify,然后把 registry 切回国内镜像,删除项目里的node_modules和package-lock.json,重新npm install。如果还不行,检查一下是不是某个依赖下载地址被卡住了,可以单独设置代理或走镜像。
如果是ERESOLVE unable to resolve dependency tree,这是 npm 7 之后对 peerDependencies 检查变严格导致的依赖冲突。临时解法是先跑:
npm install --legacy-peer-deps但这个只是临时绕过,不是根本解决。长期来看要升级冲突的包,或者让依赖版本对齐。如果你看到ERR! Error: not found: python这类消息,说明系统缺少原生模块编译工具链,需要按操作系统的标准方式安装 Python 和 C++ 编译工具。
还有一种“Node.js not found,但node -v明明有输出”的情况。这通常发生在 IDE 内置终端里:编辑器是在你重装 Node 之前启动的,内部终端也继承了旧的环境变量。解决方式很简单,重启编辑器。如果重启后还不行,检查编辑器设置里是否指定了某个固定的 Node 路径,改成自动检测或指向新路径。
6. 从卸载到重装,我建议你这样安排工作流(给菜鸟的最终建议)
6.1 记录当前项目依赖和全局工具清单
动手卸载之前,请先给自己留五分钟,把当前环境完整记录下来。不要高估记忆力,重装完以后你大概率想不起来自己装过哪些全局包。
执行:
npm ls -g --depth=0把输出保存到一个文本文件里,或者截图。如果你用 Yarn,另外