1. 环境准备:先搞清楚Node.js在系统里到底存了些什么
很多朋友第一次接触Node.js是在教程里看到的,跟着命令行敲两行、跑一个node -v,然后就以为安装完事了。等到某天想升级版本,或者因为某个全局包把环境搞坏了想卸载重装,才发现在Windows、macOS、Linux上删起来完全不是一个套路,删不干净的情况比比皆是。这篇内容就围绕Node.js的安装与卸载做一次完整的拆解,把原理、步骤、坑和排查方法一次说清楚。
先说清楚Node.js到底是个什么角色。它本质上是把JavaScript从浏览器里搬到了操作系统层面,让你可以用JS写后端服务、命令行工具、自动化脚本。你现在看到的前端工程化工具,比如Webpack、Vite、esbuild,底层都是跑在Node.js上的。所以它不是一个“装完就忘”的软件,它是你开发环境的地基。地基不稳,上面盖什么都晃。
那它安装之后在你的电脑里放了哪些东西?我拆开讲。
Node.js的核心由三部分组成:可执行文件(node命令本身)、包管理器npm(负责下载和管理第三方库)、以及全局目录(全局安装的依赖包都放在这里,命令行工具就是靠这个机制运行的)。在Windows上,它还会往注册表、环境变量PATH、AppData目录写入一堆配置;在macOS上,如果用的是pkg安装包,它会把文件散落在/usr/local/bin、/usr/local/lib、/usr/local/include这些目录里;在Linux上,如果用包管理器安装,它会注册到系统的dpkg或rpm数据库里。
这也就解释了为什么“卸载”比“安装”麻烦——安装是往系统里添加文件,卸载是让这些文件以及它们留下的痕迹全部消失。删不干净是常态,删干净是技术活。
对于新手来说,我推荐的方式永远是用版本管理器来安装Node.js,而不是直接下载官方安装包。原因后面细说,先记住这个结论就行。
注意:下面所有操作都以Node.js 20 LTS为基准来写。LTS(Long Term Support)是官方长期维护版本,功能稳定、安全补丁及时,生产环境一律选LTS,别追最新大版本,那是给自己找事。
2. 安装:Windows、macOS、Linux三大平台方案对比
2.1 Windows安装Node.js的三种途径
Windows上装Node.js,通常有三条路:官方安装包(msi文件)、压缩包(zip免安装版)、以及nvm-windows版本管理器。
官方安装包这条路最简单的操作是去 nodejs.org 下载LTS版本的.msi文件,双击,一路Next,完事。这个方案适合那种“我不需要折腾,装上就不管了”的场景。但有两个坑需要提前躲开:一是MSI安装时它会主动修改系统PATH环境变量,如果你机器上装了多套Node版本(比如用nvm装过、又手动装过),PATH里的顺序就决定哪个版本生效,很容易出现版本错乱的情况;二是卸载的时候,旧的MSI安装记录如果没删干净,Windows Installer会报“另一个版本正在安装中”之类的错误。
压缩包方案是很多老手的做法——下载zip格式的Node发行版,解压到一个固定目录,比如D:\nodejs,然后手动把这个目录加进PATH。这样做的最大好处是卸载的时候直接把目录删掉、把PATH里的记录清掉就完了,不碰注册表,不留下隐患。坏处是你需要自己维护环境变量,稍微麻烦那么一点点。
nvm-windows方案是我最推荐的Windows做法。它本质上是一个命令行工具,专门用来管理多个Node.js版本。你装它只需要去GitHub上找到nvm-windows的releases页面,下载nvm-setup.exe,安装到C:\Users\你的用户名\AppData\Roaming\nvm这个默认目录。装完后验证一下:
nvm version然后安装并使用某个Node版本:
nvm install 20.18.1 nvm use 20.18.1 node -v注意,nvm use这一步必须用“管理员权限打开PowerShell或CMD”来执行,否则它会提示权限不足。为什么?因为它要改系统级的环境变量和目录符号链接,普通权限做不到。我早期不知道这个坑,卡了整整一个下午,后来发现右键“以管理员身份运行”就好了,心态直接崩了十几分钟。
2.2 macOS安装Node.js要用哪种方式
macOS上的选择更多,官方提供pkg安装包,unix环境里也可以用Homebrew装,还有基于shell脚本的nvm、以及后来流行的fnm、volta。
先说说为什么我不推荐pkg安装包。pkg会把Node.js安装到/usr/local目录,这个目录在Apple Silicon处理器的新版macOS上,因为系统完整性保护(SIP)的存在,往里面写文件本身就要额外授权,而且卸载的时候文件散落各处,你很难记得它到底动过哪些地方。如果你已经用pkg装过了,后面卸载章节我会给出针对这个情况的清理清单。
Homebrew方案是macOS用户最常用的:```bash brew install node@20
Homebrew的优势是它的文件路径集中管理,同时`brew uninstall node@20`可以完成大部分清理工作,所以对新手特别友好。但它有一个后期会踩的坑:**Homebrew默认安装的是当前最新版,不是LTS**。如果你只是想在macOS上跑一个稳定环境,建议先看下nodejs.org官方目前推荐的LTS版本号,然后指定版本安装。 nvm在macOS上的安装方式是通过curl执行一段远程脚本:```bash curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash执行完之后,刷新shell配置,比如执行source ~/.zshrc,然后验证:
nvm ls-remote nvm install 20 nvm use 20ls-remote会把远端可以安装的所有版本列出来,一般我只推荐用户装LTS节点对应的版本号,比如v20.x系列末尾的小版本。
2.3 Linux发行版安装Ubuntu 20+的完整步骤
Linux用户,尤其是Ubuntu服务器,一般是为了部署生产环境,操作要更规范。
Ubuntu 20.04、22.04以及24.04都有现成的软件源,直接sudo apt install nodejs会装到一个很旧的版本,这不能满足Node 20+的需求。所以正确姿势是从NodeSource官方源安装。
先更新索引并安装依赖:
sudo apt update sudo apt install -y ca-certificates curl gnupg导入NodeSource的GPG密钥:
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/nodesource.gpg添加NodeSource 20.x的软件源(NodeSource官方的主命令其实一条就搞定,但手动拆开能让你看清它修改了哪些系统配置,出问题也好排查):
echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list再更新一次软件源,就可以安装:
sudo apt update sudo apt install -y nodejs安装完成后跑node -v,如果输出的版本号以v20开头,就说明成功了。
这里插一句,有些云服务器厂商提供的一键安装脚本,里面可能会通过换源、改PATH等方式装Node,我见过不少因此导致的版本不一致问题。建议还是用手动步骤,别偷懒,你的服务器不是试验场。
2.4 版本管理器选型对比
既然前面反复提到nvm,这里把手头常用的几个版本管理器做个对比。
| 工具 | 平台支持 | 安装方式 | 特点 |
|---|---|---|---|
| nvm | Linux/macOS | shell脚本 | 老牌工具,教程最多,版本切换靠改PATH软链,原理简单 |
| nvm-windows | Windows | exe安装包 | 与nvm命令几乎一致,底层实现不同,但确实是Windows上最主流的方案 |
| fnm | 全平台 | 二进制 | 用Rust写的,速度很快,支持自动切换版本,配置一次之后体验很好 |
| volta | 全平台 | 安装脚本 | 除了版本管理还能锁定项目的Node和npm版本,团队协作很好用,但学习曲线陡一些 |
我的建议很简单:Windows用户用nvm-windows,macOS和Linux用户用nvm,追求效率可以试试fnm,项目协作需求重的直接上volta。核心思路永远是:不要让手动装的Node.js和版本管理器管的Node.js同时存在于系统里,那是灾难的开始。
警告:不同版本管理器之间也不要混用。比如你先装了nvm,又装了volta,它们会互相覆盖对node命令的指向,排查起来非常痛苦。
3. 缓存、全局包与版本切换的细节处理
3.1 npm的全局包到底装在哪个目录,怎么卸载
npm是Node.js自带的包管理器。平时项目里用到的依赖,是装在项目自己的node_modules目录里的,跟系统无关;但如果你执行了npm install -g,它装的包就进入一个全局共享目录。
查看全局目录的路径:
npm root -gWindows下通常是C:\Users\你的用户名\AppData\Roaming\npm\node_modules,Linux/macOS下通常是/usr/local/lib/node_modules或者nvm管理的~/.nvm/versions/node/v20.x.x/lib/node_modules。这个路径很重要,因为你手动清理的时候要知道去哪里找文件。
删全局包的命令长这样:
npm uninstall -g <包名>比如我想卸载一个叫create-react-app的全局包:
npm uninstall -g create-react-app这个命令会把包从全局目录里移除,同时删掉它在bin目录里的符号链接。执行后还可以用npm ls -g --depth=0查看当前所有全局包,确认真的卸载干净了。
有一个常见的坑:手动删除全局包文件夹,而不执行npm uninstall -g。比如有朋友直接在node_modules目录里把某个包文件夹删了,但bin目录里的命令链接还留着,导致你再敲那个命令时,系统会报错“文件不存在”,却不知道去哪找问题。所以标准动作必须先执行npm命令卸载,再考虑手动清理残余。
3.2 npm缓存、日志与残留目录清理
npm还有一个隐形的空间占用大户——缓存目录。npm会把下载过的包都缓存在本地,时间长了动辄几个GB。查看缓存位置:
npm config get cacheMac/Linux下默认是~/.npm,Windows下是%LocalAppData%\npm-cache。清理缓存的标准命令是:
npm cache clean --force这个命令会清空缓存目录里所有内容,下次npm install时速度会慢一些,但如果你磁盘剩余空间不够,清理效果立竿见影。
另外还有一类残留:.npmrc配置文件。npm会从全局配置~/.npmrc或者项目目录下的.npmrc读取配置,用户名、注册表地址、token等信息可能在里面。卸载Node.js的时候,如果不清这个文件,重新安装的npm还是会读取旧配置。所以请记住:卸载不仅是删程序文件,配置文件、日志、缓存通通要清。
3.3 Node版本切换的正确方式
nvm的核心功能就是版本切换。但很多朋友在切换完版本后执行node -v,发现还是旧版本,第一反应是“切换失败了”,其实大概率是当前shell的PATH缓存没有刷新。
在Linux/macOS中,修改PATH之后需要重新加载配置文件:
source ~/.bashrc # 或者,如果你用的是zsh: source ~/.zshrc然后执行which node确认当前node命令的完整路径,它应该显示~/.nvm/versions/node/v20.x.x/bin/node这样的路径,如果你看到的是/usr/bin/node,说明有两个Node在抢占,系统PATH顺序优先级决定了哪个生效。
在Windows的nvm-windows中,类似的排查命令是:
where.exe node nvm listwhere.exe node会把所有能找到的node路径列出来,nvm list显示已经安装的版本。如果where输出的不止一个路径,就需要手动检查系统环境变量PATH,把不需要的那个给移除。
这里分享一个我自己的习惯:每次切换完Node版本后,在项目里重新完整执行一次npm install。因为不同Node版本对应的npm版本可能不同,依赖的lock文件里的版本解析逻辑也可能有差异,不重新安装就想当然地跑旧依赖,出各种玄学bug的概率极高。
4. 卸载:不是删除文件夹那么简单
4.1 Windows彻底卸载Node.js以及残留清理
Windows卸载Node.js分两种场景:用MSI安装包装的,和用nvm-windows或压缩包方案的。
如果你是用官方MSI装上去的,最不推荐的方式就是“直接在Program Files文件夹里删除node.exe”。那会留下注册表、环境变量、npm缓存等一堆残渣。正确操作是:
第一步:卸载npm全局包。先用管理员权限打开PowerShell,执行:
npm uninstall -g <全局包名>如果全局包太多不想挨个卸载,直接把全局目录清空也行,但一定要配合下一步操作把环境变量里的全局路径删掉。
第二步:通过控制面板/设置卸载程序。进入“设置-应用-已安装的应用”,找到Node.js条目,点卸载。这一步会触发MSI的卸载流程,把安装时放入的文件和注册表条目大体清掉。
第三步:手动清理残留目录。检查并删除以下目录(如果存在):
C:\Program Files\nodejsC:\Users\你的用户名\AppData\Roaming\npmC:\Users\你的用户名\AppData\Roaming\npm-cacheC:\Users\你的用户名\AppData\Local\Temp下的node相关临时文件
第四步:清理环境变量。打开“系统属性-环境变量”,在系统变量和用户变量的Path里,把所有指向nodejs、npm、AppData\Roaming\npm的条目全部删除。
第五步:清理注册表(可选但推荐)。按Win + R输入regedit打开注册表编辑器,搜索关键字“nodejs”,找到相关项删除。这一步风险比较大,宁可谨慎操作,也不要大面积删除不确定的项。不熟悉注册表的朋友跳过这一步即可,影响不大。
如果你用的是nvm-windows,那步骤更简单:先用nvm把所有已安装的版本删掉:
nvm uninstall 20.18.1然后打开nvm的安装目录(默认%AppData%\Roaming\nvm),手动删除这个文件夹。再进环境变量,把nvm和C:\Program Files\nodejs的路径一并移除。
4.2 macOS彻底清除Homebrew和pkg安装的Node.js
macOS上如果用的是Homebrew安装的:
brew uninstall node@20这条命令会移除Node、npm以及它们装在/usr/local或/opt/homebrew目录下的依赖。但Homebrew卸载后,还有一些符号链接可能残留,需要手动清理:
sudo rm -rf /usr/local/bin/node sudo rm -rf /usr/local/bin/npm sudo rm -rf /usr/local/lib/node_modules如果你是Apple Silicon处理器,路径是/opt/homebrew开头的,相应换成/opt/homebrew/bin/node、/opt/homebrew/lib/node_modules这些路径。
提示:执行rm命令之前先多确认两遍路径。尤其是
sudo rm -rf,路径打错一个字母可能就是整台电脑的灾难。我不止一次见过有人把/usr/local里的local拼漏了,直接向/usr开炮,画面太惨烈。
macOS还有一个东西叫.npmrc配置文件和~/.npm缓存,删完程序后顺手清掉:
rm -rf ~/.npm rm -f ~/.npmrc如果你之前用pkg安装包装的Node.js,那清理起来最麻烦。需要手动删除以下目录和文件:
/usr/local/lib/node_modules(全局包目录)/usr/local/lib/dtrace/node.d(dtrace相关)/usr/local/share/doc/node(文档)/usr/local/share/man/man1/node.1(帮助文件)/usr/local/bin/node/usr/local/bin/npm/usr/local/include/node~/Library/Preferences/io.nodejs(偏好设置)~/Library/Caches/nodejs(缓存)~/Library/Saved Application State/io.nodejs.savedState(应用状态)
4.3 Linux系统上Debian/Ubuntu卸载与PPA/源清理
Linux卸载Node.js的方式取决于当时是怎么装的。
如果用的是apt从软件源装的:
sudo apt remove nodejs还要连带把npm清理掉:
sudo apt remove npm如果项目里通过源码或二进制包安装的,先找到安装位置:
which node which npm这两个命令会输出node和npm的路径,通常在/usr/local/bin下面。删除:
sudo rm -rf /usr/local/bin/node sudo rm -rf /usr/local/bin/npm同时清理/usr/local/lib/node_modules、/usr/local/include/node这些目录。如果之前配置过环境变量,也要一并从/etc/profile.d/下的脚本或~/.bashrc里移除。
还有一个关键点:如果你之前是通过Nodesource官方源装的Node,卸载Node后建议把对应的软件源也删掉,否则apt update每次都会去检查这个已不用的源。
sudo rm -f /etc/apt/sources.list.d/nodesource.list sudo rm -f /etc/apt/keyrings/nodesource.gpg4.4 彻底清除系统级变量与隐藏配置
最后说一个跨平台通用的原则:不管在哪个系统,卸载Node.js之后都要检查终端的启动文件里是否还留着关于node的配置。
比如你在~/.zshrc里写了一个把node_modules/.bin加入PATH的片段,或者在~/.bash_profile里设置了NODE_HOME变量,这些配置不会因为卸载Node而自动消失。下次打开终端,它可能还会报错说找不到node命令,你又会误以为是没卸载干净。
所以卸载后别急着收工,打开你的shell配置文件,搜索node、npm、nvm、NODE这几个关键词,把相关行全部注释或删除,然后再新开一个终端验证一下。
5. 常见问题排查与避坑经验
5.1 安装时报错“node.js v24.21.0 is not yet released”
这个错误我最近看到不少人在问,出错的形式是在用某个工具安装Node时,终端里蹦出一行“error installing 24.21.0: node.js v24.21.0 is not yet released or is not available”。
这个问题的本质是版本号不存在于官方仓库。出现这种提示通常有两种情况:一是你手动指定了一个特别新的版本号,但这个版本在nodejs.org上还没发布(或者刚release还没同步到所有镜像源);二是一些开发工具(比如AI编程助手Codex这类命令行工具)在初始化时会默认锁定一个Node版本,而这个版本在你当前使用的操作系统架构上不存在对应版本。
排查方式是先访问 nodejs.org/dist 查看可用的版本目录:
curl -s https://nodejs.org/dist/ | grep 24如果确实没有24.21.0这个版本,就得把版本号改成已存在的版本,或者改用LTS版本。另外,如果你是通过一个自定义的安装脚本来装的,脚本里可能硬编码了过时的版本号,这时候需要去改脚本配置,而不是硬等。
5.2 nvm安装版本后node命令没反应
这又是一个高频问题。执行了nvm install 20,看着终端滚了一堆输出,但node -v仍然报“command not found”。
先执行nvm list看看版本是否真的装上了。如果还没装上,检查网络环境是不是没有连上nodejs.org。如果已经装上了,那就是nvm没有把软链接指过去。
在Linux/macOS下可以手动验证:
ls -l ~/.nvm/versions/node/v20.x.x/bin/node如果文件存在,再确认nvm在shell配置里的加载语句是否生效了。常规做法是在~/.bashrc或~/.zshrc里加一行:
export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"加完之后source一下配置文件,问题通常就解决了。
Windows的nvm-windows偶尔也会出现类似问题,原因是系统PATH里还没有C:\Program Files\nodejs这个软链目录。进入“环境变量”检查一下,确认PATH里存在这个路径,然后以管理员身份重新执行nvm use 20.18.1。
5.3 npm全局包卸载后命令仍然存在
如果你执行了全局卸载命令,但继续敲那个包的命令,系统还是能调起来,说明卸载只移除了node_modules里的包文件,但没有清理/usr/local/bin或%APPDATA%\Roaming\npm下的环境变量链接。
在Unix系统里,npm全局包会在bin目录下创建一个符号链接,比如你全局装了typescript后,/usr/local/bin/tsc就指向了实际的模块入口。正常npm uninstall -g typescript会把链接也删掉。如果确实没有删掉,手动删:
sudo rm -f /usr/local/bin/tscWindows下类似,检查C:\Users\你的用户名\AppData\Roaming\npm下是否还存在同名的命令文件,一并删除。
5.4 我整理的避坑心得
第一,不要同时使用两个版本管理器。我见过有人在macOS上装了nvm,后来又因为好奇装了volta,结果两个工具互相改了PATH,最后node命令时好时坏,排查半天才发现是它们的符号链接在打架。
第二,每半年清理一次npm缓存。npm缓存目录体积膨胀得比你想的快,尤其是经常创建新项目、反复安装依赖的人。命令固定下来:
npm cache clean --force第三,卸载Node.js前先备份项目依赖清单。如果你电脑上有很多项目,卸载前打一份全局包列表:
npm ls -g --depth=0 > backup.txt以后重装Node后,可以按这个清单一条条恢复,避免漏了某个工具。
第四,别在生产服务器上乱卸载。如果你的Linux服务器上跑着Node服务,卸载前先确认哪些服务在依赖它。ps aux | grep node看一下进程,先把服务停了,再考虑卸载。卸载完顺手跑一下sudo apt autoremove清理依赖,别给系统留垃圾。
第五,安装新版本前一定先备份全局配置。如果你在~/.npmrc里配置了公司私有registry地址,卸载重装会导致配置文件丢失,到时候装包全都从官方源下载,速度可能让你怀疑人生。提前把.npmrc里的内容复制一份到剪切板,重装完再粘贴回去。
6. 新机器的一键恢复与日常维护建议
前面花了大量篇幅讲安装和卸载的细节,最后一个部分说点日常能用的恢复策略。
我自己的习惯是维护一份初始化脚本,放到一个云笔记里,任何一台新电脑拿到手里,装完nvm之后,把这份配置跑一遍,开发环境就恢复了:
nvm alias default 20 npm install -g typescript eslint prettier nodemon npm install -g pnpm npm install -g @vue/cli npm install -g create-react-app当然,具体装哪些全局包跟你的技术栈有关,别照抄。
日常维护方面,建议每三个月做一次“体检”:
node -v npm -v npm ls -g --depth=0如果发现系统里有多个无法解释的Node版本路径跑到了PATH里,趁早清理。环境这个东西就像家里的厨房,平时懒得擦,等哪天要做大菜的时候,到处是油污,反而更浪费时间。
最后分享一个小经验:很多人卸载Node是因为遇到了莫名其妙的报错,以为是环境坏了,其实大部分报错可以通过换掉全局包版本或者清理旧缓存来解决。真到了必须卸载重装的地步,也别慌,按照上面每个系统的清理步骤走一遍,重新装一个新的LTS版本,基本都能恢复如初。我自己服务了几年开发环境,最大的感受就是:Node本身的安装和卸载并不难,难的是把那些散落在各个角落的“影子文件”清干净。掌握好版本管理工具,养成定期清理的习惯,这套东西就能一直稳定跑很多年。