1. 为什么每个开发者的电脑上都值得拥有Node.js
还没有装Node.js的电脑,说实话,干很多前端和后端杂活都会觉得绑手绑脚。现在聊到node.js安装教程,网上一搜一大把,但大多数教程要么停留在“下一步下一步”的傻瓜式操作,要么直接甩给你一堆命令让你复制粘贴,压根没讲清楚为什么这么装、装完怎么验证、后续怎么维护。今天我就把Node.js这件事从头到尾讲透,从官网下载到环境配置,从版本管理器到常见坑排查,一次说清楚。
Node.js不是框架,不是库,它本质上是JavaScript的运行时环境,让JavaScript从“只能在浏览器里跑”变成了“在服务器上也能跑”。这意味着你不仅能写前端页面,还能用一个语言写后端接口、写命令行工具、写脚本处理文件、起本地Mock服务。我以前最早接触Node是因为想自己搭一个工具函数接口服务,后来一发不可收拾,很多搛代码的活儿都交给Node来处理,确实省心。
这篇稿子适合谁?打算入门前端或后端的初学者,想在自己的电脑上把Node.js环境配好的学生党,以及经常需要在不同机器之间切换Node版本的开发者。我会把Node.js安装说的比较完整,覆盖Windows、macOS、Linux三种系统,你在网上搜node.js官网下载版本的时候经常会看到一堆版本号,也能对照这里给出的思路做选择。
磨刀不误砍柴工,先把Node.js能干什么彻底搞明白,后面装环境才有动力,而不是稀里糊涂装完就放着吃灰。
2. 动手之前先想清楚:装系统版还是用版本管理器
这是新手最容易踩坑的地方,也是很多教程根本不提的地方:直接用官网安装包装最新版Node.js当然可以做,但实际干几年你会发现,版本管理比版本本身更重要。
Node.js的版本更新速度非常快,每半年左右发布一个大版本,但是很多老项目仍然停留在Node 12、Node 14甚至更老的版本。你今天用最新版本把项目跑起来,明天接手一个老项目,可能直接报错。原因很简单:npm包之间的依赖关系,以及原生模块的编译结果,都跟Node版本有或多或少的关联。
我的建议是,一开始安装Node.js的时候最好就不要直接装系统版本,而是通过nvm(macOS/Linux用nvm,Windows上常用nvm-windows)来做版本管理。这套方案的好处是什么呢?你可以在同一台电脑上,随时安装多个Node.js版本,想切哪个切哪个。我举个例子,我在自己电脑上同时装了Node 14和Node 18,跑老项目时nvm use 14,跑新项目时nvm use 18,一个命令切换完毕,非常快。
如果你确定自己暂时不需要多个版本共存,比如只是刚接触想体验一下,那直接去node.js官网下载安装包也行,装起来最省事。但哪怕你选择了这条最简单的路,我也建议安装完成后看一眼Node.js的安装目录、环境变量配置情况,知道它装到哪儿了,后续出了问题才好排查。
其实把这层关系想明白了,后面很多东西就顺了。Node.js是运行时,npm是包管理器,nvm是版本管理器,三者各司其职但又强相关。网上很多教程只讲“npm安装依赖命令”,不讲“Node与npm的版本匹配”,导致很多新手在安装node-sass这类老包时崩溃,后面我会细说这个问题。
3. 手把手完成Windows/macOS/Linux的Node.js安装
3.1 Windows系统安装Node.js的推荐路径
Windows用户最常见的安装方式就是去node.js官网下载Windows Installer(.msi)安装包,双击进去一路Next就完事。这确实是最省心的方式。不过有三个细节值得留意。
第一,官网下载页默认推荐的LTS版本其实是最稳妥的选择。LTS是长期维护版本,它不像Current版本那样追新,但是很稳,很多企业级项目都跑在LTS版上。我的经验是,日常开发选LTS版本就够了,除非你需要用一些刚出的新特性,才建议用Current版本试试水。
第二,安装的时候安装向导会到了一个“Destination Folder”的步骤,这时候建议留意一下安装路径。有时候默认会装到C:\Program Files\nodejs\,这个路径本身没问题,但如果你后续要安装一些全局npm包,或者要让某些IDE工具识别到Node路径,尽量不要把路径改到带中文或特殊字符的位置。老话“纯净路径”,在Node生态里确实是越早执行越少踩坑。
第三,安装类型默认包含npm和“Add to PATH”选项,保持勾选就可以了。Node.js往系统环境变量PATH里写入自己的安装目录后,你才能在命令行里直接敲node -v、npm -v。如果以后打开cmd或PowerShell发现这两个命令不可用,多半就是这一步没做好。
装完之后再打开一个新的终端窗口(注意是新的窗口,不是装之前打开的那个),输入:
node -v npm -v如果能各自输出版本号,说明安装成功。如果提示“node不是内部或外部命令”,先检查一下系统环境变量PATH里是否有Node.js目录。
3.2 macOS安装Node.js的两种思路
macOS的安装思路分成两种:一种是用官方pkg安装包,另一种是用Homebrew。很多用Mac的开发小伙伴更喜欢Homebrew,因为它后续卸载和管理都方便。
用Homebrew安装Node.js只需要一条命令:
brew install node装好后同样验证:
node -v npm -vHomebrew会自动把node和npm装到合适的位置,并且帮你处理依赖。这个方法的好处是后面想卸载执行brew uninstall node就行,干净利落。不过要注意,Homebrew装的Node.js版本可能不是你最想要的那个,如果你想选择性装某个特定版本,最好还是用nvm。
如果你希望用官方pkg安装包,那就去官网下载macOS Installer,双击跑完同样没问题。但我会提前说一句,pkg安装包的卸载比Homebrew麻烦一些,需要手动清除一堆目录。所以小白的话,我更推荐用Homebrew,或者直接用nvm管理。
3.3 Linux环境下的Node.js安装细节
Linux多种发行版的差别导致了安装方式的碎片化,这里我给出几个常见做法。
如果你用的是Ubuntu/Debian系列,网上很多教程会让你用apt install nodejs,但这里有个大坑:apt源里的nodejs版本通常比较旧,可能装下来才v10、v12。你再去跑一些新项目,就会发现很多API不支持。所以我个人更推荐两个方法。
方法一,使用NodeSource源安装,相对稳定。大致流程是先添加NodeSource仓库,再通过apt安装。NodeSource仓库里有较新的Node.js版本,还区分了LTS和Current,比较实用。
方法二,直接用nvm安装。这也是我推荐所有Linux新手采用的方式。nvm本质上是一个Shell脚本,安装后它会在你的用户目录下维护多个Node版本。常见三连:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash然后加载一下当前Shell环境:
source ~/.bashrc再用:
nvm install --lts安装LTS版本,完事验证一下。
Linux用户容易遇到的问题就是权限。如果你用系统包管理器直接安装的全局npm包,可能报EACCES权限错误,这时候别想着sudo chmod一堆目录硬刚权限,用nvm装Node才是治本的办法,因为所有文件都会在你自己用户目录下,不需要root权限。
3.4 nvm才是版本管理的终极方案
单独开一小节推荐nvm,实在是因为这个工具在我实际开发中帮了大忙。前面提到nvm支持存多个Node版本,那你切版本的时候项目里的依赖会不会出问题?答案是看情况。如果项目是纯JavaScript包,切到其他大版本很可能仍然能跑;但如果项目里有用到node-sass、node-gyp这些原生模块,那你切换Node大版本后,最好执行npm rebuild或者干脆删掉node_modules重装依赖。
nvm这个工具还有个很实用的地方,是支持给不同项目写.nvmrc文件,里面写上你项目需要的Node版本号。这样团队里每个人进入项目目录后执行nvm use,nvm会自动读取.nvmrc并切换对应版本。我自己的项目都会在根目录放一个.nvmrc,例如:
v18.20.2这对多人协作非常友好,大家在同一个Node版本下跑项目,互相之间少了一批“在我机器上明明是好的啊”的玄学问题。
4. 安装完成不等于结束:验证环境与应对常见坑
4.1 用几个命令验证Node.js环境是否真的可用
很多人装完Node.js后只敲了node -v就不管了,其实还需要进一步的验证,至少确认npm能正常访问、npx可以用,以及Node.js能执行一个简单的JavaScript文件。
先看npm源配置,有时候由于网络原因,默认源访问很慢,国内用户会说换镜像源。这个操作其实很简单:
npm config get registry如果你看到输出是官方的https://registry.npmjs.org/,访问速度又不是太理想,那可以考虑切换为镜像源。我一般不建议用全站全局镜像一劳永逸的方式,更推荐自己在某个项目里用.npmrc文件维护源地址,这样公司项目和私人项目不会互相污染。
接着验证Node.js真正能跑脚本,创建一个临时文件:
echo "console.log('hello node')" > test.js node test.js如果能输出hello node,说明解释器没问题。这一步很基础,但经常被忽略。我遇到过不少小伙伴,环境变量PATH明明配好了,node -v也正常,结果因为工作目录不对或者文件名字写错,导致node xxx.js执行不了,然后就开始怀疑安装过程有猫腻。其实先确认眼前路径下文件存在,再做判断会更稳。
4.2 为什么说npm版本和Node版本存在匹配关系
npm是随Node.js一起安装的包管理器,但npm本身在持续迭代。新版Node会内置一个较新的npm,而你项目里的依赖往往需要特定npm版本才能正常解析。这种版本匹配关系在日常开发中,很容易带来一些隐蔽问题。
最常见的一个场景:老项目里用package-lock.json锁住了依赖版本,你的npm版本过新,可能在npm install的时候会发出audit报告或者强制调整一些依赖关系,导致最终安装出来的node_modules跟锁文件预期不一致。比较安全的做法是让项目的npm版本尽量靠近开发时的npm版本。你可以用npx npm@版本号临时指定npm版本来执行安装,比如:
npx npm@8 npm install这种方式适合临时验证,如果你长期维护某个老项目,还是建议直接把内置npm版本通过npm install -g npm@8这种方式固定下来,避免每次安装依赖都提心吊胆。
4.3 环境变量与PATH配置的坑
前面已经提了PATH,这里我说说具体怎么排查。Windows用户如果打开cmd发现node -v报错,第一步打开系统环境变量,查看Path里有没有C:\Program Files\nodejs\。如果没有,就手动添加,然后重新打开命令行窗口。macOS用户如果用了pkg安装包,Node一般装在/usr/local/bin,这个路径默认在很多人的PATH里,如果不在,可以添加一行到~/.zshrc:
export PATH="/usr/local/bin:$PATH"Linux用户如果使用apt安装的老版本,node通常会在/usr/bin/node,如果后面你通过nvm安装了新版本,nvm会在Shell初始化时把自己的路径插到PATH的最前面,所以不用手动改什么,但要确认~/.bashrc里确实加载了nvm的初始化脚本。
很多人排查问题的时候,忘记了一个最基础的动作:改完环境变量之后要新开一个终端窗口,让新的环境变量生效。旧窗口里即使你执行source,有时候因为各种Shell配置差异,也可能还是旧路径,不如直接关掉重开。
5. 我踩过的几个印象深刻的坑与排查经验
5.1 运行npm install时node-gyp编译失败
在Windows上跑一些老项目,安装node-sass或sqlite3这些包含原生代码的模块,经常会出现编译失败。最常见报错是缺少Windows Build Tools或Visual Studio的C++编译环境。
早几年的解决办法是单独装windows-build-tools,但后来维护不到位了。现在我的建议是,不要跟编译环境硬杠。先看项目是否必须要特定版本的node-sass,如果有升级空间,换成dart-sass相关方案,很多问题直接消失。如果项目确实锁死了node-sass处理器,那就老老实实安装Visual Studio Build Tools,勾选“使用C++的桌面开发”。装完之后重启终端,再执行npm rebuild node-sass,基本能解决大部分编译报错。
这个坑告诉我们要明白:Node.js虽然是一门高级语言运行时,但它跟C++工具链之间的边界非常模糊,遇到编译类问题先别迁怒于Node本身。
5.2 nvm切换版本后npm命令失踪
有时候你切换到某个新安装的Node版本后发现npm -v报错,这通常是因为该版本对应npm没有正确安装。在nvm的目录里,Node版本和npm版本往往是绑定安装的,但如果你安装Node时指定了特殊参数,或者使用了错误的安装源,可能出现npm缺失。解决办法在nvm重装该版本:
nvm uninstall 18.20.2 nvm install 18.20.2装好后重新验证。这个问题我很少碰到,但一旦碰到会折腾半天,尤其是忘了备份全局npm包的时候。所以这里也顺带提个建议:用nvm切换版本前,先执行npm list -g --depth=0看一眼你当前全局装了些什么,如果有重要工具,做好记录或迁移计划。
5.3 node_modules删不掉或安装太慢
Windows上文件路径太长导致node_modules删除失败,是老梗了。因为很多npm包的嵌套依赖会把目录层级做得非常深,Windows默认的路径长度限制在260个字符上下,导致删除时直接提示“源文件名长度大于文件系统支持的长度”。解决办法比较暴力,可以用robocopy空目录镜像覆盖删除,或者用系统自带的cmd /c "rmdir /s/q 路径"在一些环境里也能成功,更省事的是用rimraf这个Node工具来删:
npm install -g rimraf rimraf node_modules至于安装太慢的问题,除了换镜像源,还可以考虑用pnpm或yarn。pnpm的硬链接机制不仅让安装速度起飞,还会把包内容存到全局存储里,多个项目共享,对我来说省了不少磁盘空间。
6. 给新手的一些环境配置建议
6.1 不要一股脑把全局包装太多
npm全局安装工具确实很爽,装完任何目录都能用,但全局包一定不要贪多。原因很简单,全局包越多,版本冲突的可能性越大,而且将来切换Node版本时,全局包并不会自动同步到新版本里。你现在装了一个全局工具包,切到另一个Node版本后发现命令找不到了,这可是很让人懵的。
我自己的习惯是,全局只装一些开发必需品,比如npm、pnpm、rimraf、http-server等。项目相关的工具全部通过npx调用或者写在devDependencies里,这样项目与项目之间干净隔离,谁也不干扰谁。
6.2 用.npmrc统一项目源和配置
在今天这个环境下,不同项目可能有不同的npm镜像源、缓存路径、甚至代理设置。我个人建议每个项目根目录里都放一个.npmrc,用于声明这个项目的npm配置。例如:
registry=https://registry.npmmirror.com这样你拉一个新项目、进入目录、安装依赖,npm会自动读取这个项目级配置,不用每次手动设置。比起全局改源的方式,这种方法可控性高很多,也能避免某些公司的私有npm源被全局配置污染。
6.3 给IDE和编辑器的Node路径设置
VS Code这类编辑器在启动调试终端时,默认会读取系统PATH。如果你用nvm切换了Node版本,但VS Code终端是旧的,有概率出现识别不到新版本的问题。解决办法很简单,在VS Code里重新加载窗口(Developer: Reload Window),或者干脆重启VS Code。
也有同事遇到更奇葩的问题:VS Code调试器跑Node程序时报“Node version not supported”,排查下来发现编辑器内置的Node路径被某个插件改了。这种问题只能逐个排查插件,没有太多捷径。所以在配置IDE的时候,我一直建议尽量少装“全家桶”插件,够用就好。
6.4 学习路径建议:装好Node.js之后该干啥
环境装好了,接下来的学习路径也要清楚。先学会使用原生Node.js核心模块,比如fs、path、http,哪怕只是写一个几十行的小脚本处理文件批量改名,手动起一个HTTP服务返回JSON,都会对Node的运行模型有直观体会。然后再接触Express或Koa这类框架,最后再看工程化工具链,比如Webpack/Vite、esbuild等。
工具链依赖于Node环境,但并没有那么高的门槛,不过如果你完全不懂Node基础就直接上脚手架,模板生成的代码只会让你一头雾水。所以我常常说,花半天时间老老实实写几个Node脚本,比刷十篇教程更有用。
7. 最后的一些个人经验和提醒
7.1 关于选择LTS版本还是Current版本
如果只是做项目、写业务代码,老老实实选LTS。你自己玩玩新技术,也要注意LTS版本在16、18、20大版本之间的API演进差异。不要因为好奇就立刻升级到最新Current版本,尤其不要用Current版本跑生产环境项目。我做个人项目时会用LTS,但会在nvm里保留一个Current版本用来测试新特性,这样一个稳定一个尝鲜,互不干扰。
7.2 保持Node.js和npm版本更新节奏
老项目最爱版本固守,但完全不更新也有安全风险。Node.js社区负责维护LTS版本,会不定期发布安全修复的小版本,比如v18.19.x、v20.x.x。建议隔一两个月就检查一下当前LTS线有没有新的小版本,通过nvm更新到最新小版本。比如:
nvm install 20.11.1 --lts像这样的工作,其实相当于给电脑上的运行环境做个小保养,成本很低,收益却很大,尤其是能避开一些已知的安全漏洞。
7.3 善用npx代替全局安装
npx是npm自带的工具,可以在不全局安装某个包的前提下临时运行这个包的命令。这个机制很适合那些偶尔用一次的工具,比如:
npx create-react-app my-app它不会在你的全局环境里留下一坨垃圾依赖。我现在的习惯是,能npx就不全局装,时间久了就发现电脑上的全局环境特别干净,遇到环境问题的概率也低很多。
7.4 保留一份自己的环境配置清单
最后分享一个小技巧:我会在自己的笔记工具或仓库里维护一份“环境配置清单”。内容包括Node.js版本、npm源配置、全局包列表、nvm常用命令、常见报错汇总。这样做的好处是,不管换了新电脑还是临时帮同事排查问题,都可以照着自己的清单快速把环境复现一遍。新电脑到手,从安装nvm到配置好Node环境,我大概只需要五分钟,因为每一步都成了肌肉记忆和书面记录。
装Node.js这件事,看起来只是下载个安装包,但背后涉及版本管理、环境变量、npm生态、原生编译工具链等一系列问题。把这块基础打牢,后面无论是做前端还是后端,都会顺畅很多。如果你在安装过程中遇到没见过的报错,也不用慌,把终端里的报错信息完整搜一下,按上面这类排查思路逐步走,绝大多数问题都能解决。