尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Windows下Node.js安装与npm配置:环境变量、执行策略与镜像源排错指南

Windows下Node.js安装与npm配置:环境变量、执行策略与镜像源排错指南 先说一个我在帮人排查Node.js环境配置时遇到最多的现象很多朋友下载安装Node.js、连带npm安装都顺利走完了结果打开终端敲下npm -v屏幕立刻弹出一段红字——npm.ps1因为在此系统上禁止运行脚本。光是这一句报错我前后帮人远程处理过不下十次而且每次的根源还不一样有的卡在PowerShell执行策略有的压根没把Node.js写进环境变量还有的是安装路径带了空格导致后续添加镜像、装依赖全崩。所以这篇保姆级教程我决定不做那种“一路Next就完事”的简化流程而是把从下载、安装、验证、排错到配置镜像源一整条链路完整走一遍每个步骤的为什么也拆开讲清楚。这篇内容适合所有刚接触Node.js的朋友也适合那些装完npm不能用的朋友照着自己的症状对号入座。1. 动手之前先把Node.js和npm这对搭档搞清楚1.1 一句话讲清楚它们是什么关系很多教程上来就甩下载链接我觉得这样不太好。你至少要明白自己往电脑里装了什么后面排查问题才有方向。Node.js本质上是一个JavaScript运行时环境。浏览器里能跑JavaScript大家应该都知道但JavaScript只能在浏览器里跑离开浏览器就没人能解析它。Node.js等于把JavaScript的解析引擎V8单独拿了出来做成一个可以在操作系统上直接运行的环境。用大白话说装完Node.js之后你的电脑就具备了“直接用JavaScript写服务端程序、写命令行工具、跑自动化脚本”的能力。npm则是Node.js的官方包管理器。它的作用有两块一是从远程仓库下载别人写好的代码包到本地项目里二是把自己写的包发布到远程仓库分享给别人。你就把它理解成手机里的应用商店Node.js是手机操作系统npm负责装App。没有npm你写Node.js项目就得把所有代码手搓一遍这不现实。这两者通常是捆绑安装的——下载一个Node.js安装包npm会一起装好。所以你听到的“安装Node.js环境”实际就是把这两样一次性搞定。另外日常说的“环境配置”指的不只是安装完成还包括安装目录被写入系统的Path环境变量、npm的命令能被终端正确识别、镜像源被配置成可用的网络地址等。这篇会把每一项都落实到位。1.2 为什么保姆级教程也要先说版本LTS和Current怎么选去Node.js官网会看到两个下载按钮一个是LTS一个是Current。界面是英文的很多人不看说明随手点了Current这就容易踩坑。LTS全称是Long Term Support翻译过来就是“长期维护版”。它的特点是稳定性优先社区和依赖它的生态都会围绕LTS版本做兼容适配官方也会持续提供安全补丁。Current则是尝鲜版最新的功能特性会先出现在这里但相应的依赖它的包可能还没跟上某些第三方工具可能报兼容性错误。我自己装环境的原则很简单如果你是要学习、做项目、在公司环境开发一律选LTS。除非你对某个新特性有明确需求或者你就是在研究Node.js最新功能那可以考虑Current。但这个教程的定位是稳定可用所以后面所有操作都基于LTS版本展开你安装时也认准LTS就行。1.3 哪些人需要认真看这篇教程别觉得这些问题“太基础”。实际上找我排查Node.js环境问题的一半以上是已经在写代码、但环境和工具链没整明白的人。你可以对号入座一下刚准备学Vue、React等前端框架发现很多人说要先装Node.js但不知道装完怎么验证、怎么配置。已经装过Node.js但执行npm install时经常下载超时、报错、卡在某个包上。遇到npm.ps1被禁止运行、npm不是内部或外部命令之类的问题修复过但没搞懂原因。准备发布自己的npm包或者需要切换不同的仓库源来下载私有包。只要中了其中任何一条这篇教程的每一章都值得从头看到尾因为后面的排错章节会建立在前面章节的路径基础之上。2. Windows安装全程下载、双击、点选项每一步都有讲究2.1 安装包下载认准官网和LTS标识Windows用户下载Node.js最正规的入口是Node.js官网的下载页。不要从乱七八糟的第三方站点下因为安装包是要以管理员权限运行的来历不明的渠道风险太大。进入下载页之后你会看到一个大大的绿色按钮写着“Windows Installer”旁边可能还有LTS标记。这就对了直接点它下载下来是一个.msi文件。注意看下载文件名比如node-v18.20.4-x64.msi这个格式表示版本号是18.20.4架构是64位。如果你不清楚自己电脑是64位还是32位在Windows设置里搜“系统信息”看“系统类型”那一行。现在市面上绝大多数电脑都是64位选x64版本即可。32位的老机器就去下载页面找对应的x86版本不过这种情况已经很少了。2.2 安装过程哪些下一步可以无脑点哪些不能拿到.msi文件后双击运行安装向导会一路展示说明协议、安装路径、附带组件这些页面。这里我逐项给你说清楚。第一个要注意的是安装路径界面。默认路径是C:\Program Files\nodejs\我个人强烈建议不要改。为什么因为这个路径会被写进系统环境变量而且很多工具链在后续使用中会假设你装在了默认目录。如果非要改请改成纯英文、且不含空格的路径比如D:\nodejs\。有些磁盘分区工具和脚本对空格和括号特别敏感热词里那些D:\Program Files (x86)\nodejs的报错就印证了这类问题的存在。接下来是组件选择页面默认会把“npm package manager”勾上别取消。还有一个“Add to PATH”的选项看仔细了有的版本以文本形式放在说明里有的版本会有明确的勾选。确保它被勾选或者默认是启用状态这一步决定了安装完成后命令行能不能直接识别node和npm命令。早些年安装器有过不自动写Path的情况现在新版好很多但既然叫保姆级教程多看一眼总没错。还有一个容易被忽略的环节安装向导可能弹出一个“安装工具的必要组件”的选项比如勾选“下载并安装Python和Visual Studio Build Tools”。如果你只是做前端开发、写脚本、跑Node项目这个可以不用勾如果你打算以后写Node原生模块、编译C插件那可以考虑勾选。不过它体积很大对新手来说建议先不勾等真遇到编译问题再补装也不迟。2.3 安装路径的空格陷阱热词里那个D:\Program Files (x86)是怎么回事我在帮人远程排查时不止一次看到对方的Node.js被装到了D:\Program Files (x86)\nodejs\这类路径。这个路径本身有两个问题一是带了空格二是带了括号。很多底层工具处理路径时直接用空格做分隔符一旦路径里有空格就可能被错误截断。括号在命令行里也有特殊含义有些脚本解析时会把括号里的内容当成子命令或者表达式处理。虽然新版Node.js对这类路径的容错能力强了一些但谁也不知道你以后会不会遇到某个老牌的npm包在postinstall脚本里用简单方式解析路径到时候报错会相当痛苦。也有人反驳说自己装在带空格路径下用了好几年都没事。那我只能说你的项目恰好绕开了所有敏感场景。但既然能选何必给未来埋雷。这个点我在教程里特意拿出来讲就是因为它极其隐蔽不在你面前装个几十次环境根本不会意识到它还能坑人。2.4 安装完成后目录里有什么为什么npm不叫npm.exe安装完成后打开C:\Program Files\nodejs\目录你会看到node.exe这个文件它是Node.js运行时的本体。在命令行里执行node -v系统就是通过它返回版本号的。但注意这里没有npm.exe。npm在Windows上的入口是两个脚本一个是npm.cmd供命令提示符cmd使用另一个是npm.ps1供PowerShell使用。这个细节非常关键后面第四章讲“npm.ps1被禁止运行”时会重点展开。你现在只需要记住npm不是一个传统意义的exe程序它是一组脚本这决定了它和PowerShell的执行策略有天然冲突的可能。另外目录里通常还有一个node_modules子目录和若干shell脚本文件那是npm自身的模块组织方式。看不懂没关系你只需要知道它们缺一不可就行建议不要随意删改这个目录里的任何文件。3. 安装后的首次验证一行命令让环境现原形3.1 node -v和npm -v怎么读结果安装完成后按WinR输入cmd并回车打开命令提示符。先执行node -v正常的话屏幕上会打印类似v18.20.4这样的版本号。这个命令的意思是“问node要它的版本信息”。如果它能正常回答说明Node.js本体已经成功安装且能被系统找到。接着执行npm -v正常的话会打印一个不带字母v开头的版本号比如10.8.2。npm的版本号格式早期是2.x、3.x现在跟随Node.js大版本常见是9.x、10.x不同LTS版本对应不同npm大版本这不重要。如果你在这两步中得到了版本号那么恭喜你环境配置已完成了八成。接下来只剩镜像源配置和进阶验证。如果你得到了报错别慌直接跳到第四章那里有完整的排查链路。3.2 npm环境变量PATH的底层逻辑很多朋友对“环境变量”四个字没有概念出了问题也不知道从哪修这里我用最直白的方式讲清楚。Windows在执行命令时会按系统环境变量Path里记录的目录顺序逐个去查找“有没有一个叫作node的程序”。找到就执行找不到就提示“不是内部或外部命令”。所以“怎么让系统认识node”这个问题本质上是“怎么把Node.js的安装目录写进Path”。在安装Node.js时勾选“Add to PATH”就是在做这件事——安装器会把C:\Program Files\nodejs\追加到系统Path里。如果你安装时没勾选或者用的是绿色解压版、手动放置的Node.js那你就需要手动去配置。手动配置的路径是右键“此电脑” → 属性 → 高级系统设置 → 环境变量。在“系统变量”列表里找到Path双击编辑点“新建”把Node.js安装目录完整填进去比如C:\Program Files\nodejs\然后一路确定。改完后必须关掉所有已经打开的终端窗口重新打开一个新的。因为已经运行的终端读取的还是修改前的环境变量快照这个“改了却没生效”的陷阱我见过太多人踩进去。假如新开终端后还是不行那就直接重启电脑一步到位。3.3 可选操作顺手把全局包下载缓存目录也配明白npm默认会把全局安装的包放在Node.js安装目录下的node_modules里。这本身没什么问题但有一种情况如果你用了npm install -g安装全局工具Windows可能会因为权限问题提示你“操作被拒绝”。这是因为C:\Program Files目录需要管理员权限才能写入而你的终端不是管理员权限。我能给的方案有两个。方案一是始终用管理员身份打开终端再执行全局安装简单但每次都要手动右键。方案二是把npm的全局目录改到当前用户目录下这样就不需要额外权限了。这个方法不算必须但建议配好省得后面踩权限坑。执行npm config set prefix C:\Users\你的用户名\npm-global然后再配置模块查找路径npm config set globalconfig C:\Users\你的用户名\.npmrc如果你想马上动手又不想折腾先跳过这个也行不影响前面几章的路径排查。这个属于锦上添花不算环境配置的必需项。我在实际项目中更推荐方案二因为全局工具装在自己的用户目录下权限问题会少很多而且以后重装Node.js也不会弄乱全局工具。3.4 用VSCode集成终端的隐患很多人习惯打开VSCode用它的集成终端来跑node命令。这里有个坑VSCode如果在你安装Node.js之前就已经打开它的集成终端会保存旧的环境变量装完Node后你在VSCode里跑node -v可能还是报“找不到命令”。这时候不是你的安装有问题而是VSCode没刷新环境变量。解决方法是完全关闭VSCode重新打开或者使用“命令面板”里的“重新加载窗口”。总之凡是涉及环境变量改动的场景重启一下相关软件是个好习惯。这个细节不大但能避免你怀疑人生。4. 高频报错排查实录npm.ps1被禁和npm不是命令4.1 报错一npm.ps1因为在此系统上禁止运行脚本这个报错在Windows上出现概率极高因为Windows的PowerShell默认执行策略是Restricted禁止运行任何脚本。而npm在PowerShell里的入口恰恰是npm.ps1这个脚本文件它被策略拦住了所以PowerShell就抛出了那句经典红字。完整报错可能长这样npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1因为在此系统上禁止运行脚本。请注意这里有个细节如果你用的是cmd那么调用的是npm.cmdcmd没有任何执行策略限制所以这个报错只出现在PowerShell环境里。现在Windows Terminal、VSCode集成终端默认都是PowerShell所以它成了新手最常遇到的问题。怎么解决有三种办法按推荐程度排列最简单的方法以后都使用cmd而不是PowerShell来执行npm命令。在VSCode里可以把默认终端切换为命令行提示符这样就不会碰PowerShell的脚本策略了。但治标不治本代码里如果调用了PowerShell命令还是会被拦。更彻底的方案修改PowerShell执行策略。打开一个PowerShell窗口执行Set-ExecutionPolicy -Scope CurrentUser RemoteSigned然后输入Y确认。这个命令的意思是允许当前用户运行本地创建的脚本从远程下载的脚本需要数字签名。它的作用范围只限制在当前的Windows用户不会影响整个系统安全风险相对可控。执行完你可以再跑Get-ExecutionPolicy -List查看各级策略确保CurrentUser那一行显示RemoteSigned。还有人会直接建议你执行Set-ExecutionPolicy RemoteSigned注意这个没有-Scope CurrentUser。它会把策略作用到LocalMachine级别需要管理员权限而且影响全局我个人不推荐为了装一个Node.js环境做这么大幅度的策略修改。能用CurrentUser解决的事就不要动全局。修改完策略后关掉PowerShell重开再执行npm -v这条报错就消失了。4.2 报错二npm不是内部或外部命令、无法将npm项识别为cmdlet这个报错和前面一个完全不同。前者是“找到了npm但被策略拦了”这个则是“压根没找到npm”。报错可能长这样npm 不是内部或外部命令也不是可运行的程序或批处理文件。或者无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写。根因基本就一个系统的Path环境变量里找不到Node.js安装目录。你可以按这个顺序排查第一步打开C:\Program Files\nodejs\目录确认npm.cmd和npm.ps1都在。如果不在说明你下载的安装包有问题或者安装过程被安全软件拦截了一部分。这种情况重新安装一次就好。第二步检查Path环境变量。按前面3.2节的方法打开环境变量编辑器看系统变量Path里有没有Node.js的安装目录。没有的话手动添加然后关掉所有终端重开。第三步如果你的Node.js是通过nvmNode版本管理器装的那么Path里指向的应该是nvm的安装目录和当前Node版本的软链接目录。这种情况比较特殊排查思路是执行nvm list确认当前使用的版本如果列表为空说明当前没有选中任何Node版本执行nvm use 版本号指定一个就好。这里提醒一下装完Node.js之后已经打开的PowerShell/cmd窗口不会自动感知环境变量变化。很多人添加完Path后站在原地敲命令发现还是报错以为没配成功其实只是因为没开新窗口。如果你已经重开了一次还不行再重启电脑别嫌麻烦这一步能解决90%的“明明配置了却还报错”问题。4.3 排查链路总结先判断装没装成再看哪一层断掉我把两个报错放在一起做一个表格方便你对照自己的实际情况报错现象直接原因解决路径node -v可以npm -v报PowerShell禁止运行脚本npm.ps1被执行策略拦截用cmd执行或执行Set-ExecutionPolicy -Scope CurrentUser RemoteSignednode -v和npm -v都报“不是内部或外部命令”Path环境变量没有Node.js安装目录检查并手动添加Path重启终端node -v报错但npm -v能显示版本号极少见node.exe不在Path但npm的路径被单独配置检查Path中node.exe所在目录是否被误删装了nvm但node/npm都不可用nvm未激活任何版本的Node执行nvm list、nvm use 指定版本排查的思维框架其实就一句话先定位是哪一层断了再对症下药。所有终端工具在执行命令时都会经历“查找命令 → 读取文件 → 运行命令”的过程。“npm不是命令”是在“查找命令”这一层断了“npm.ps1被禁止运行”是在“读取文件”这一层被拦了。知道是哪一层你就不至于病急乱投医。4.4 还有一类冷门报错安装目录本身损坏还有一类比较隐蔽的情况安装目录里的node_modules文件夹不完整或者npm.cmd和npm.ps1的内容被外部工具改过。这种情况常见于你手动复制过Node.js目录、或者用安全工具清理过“垃圾文件”。如果你前面排查都没发现问题、但npm就是跑不起来最直接的办法是把Node.js彻底卸载掉重新安装一次。卸载时记得把残留目录删干净不要只走“控制面板 → 卸载”还要手动检查C:\Program Files\nodejs\是否残留C:\Users\你的用户名\AppData\Roaming\npm是否残留C:\Users\你的用户名\AppData\Roaming\npm-cache是否残留都删除干净后再装新的95%的疑难杂症都能通过这个“干净重装”解决。这个方法听起来很无脑但它真的管用我甚至把它当作排查工具链问题的“终极必杀技”。5. 镜像源配置换源之后的npm才真正好用5.1 为什么你下载依赖又慢又容易失败讲一个最常见的场景你装好Node.js兴冲冲用一个脚手架工具创建项目npm install执行了半天进度条龟速爬行最后还可能给你一个红色ETIMEDOUT或ECONNRESET错误。原因很简单npm默认的官方仓库地址是https://registry.npmjs.org/这个服务部署在境外国内网络访问它经常出现延迟高、丢包、连接不稳定等情况。就像你非要绕远路去一家超市买东西路程长不说路上还可能堵车。所以就有了“镜像源”的概念维护方把官方仓库的内容同步一份到国内服务器上你从国内的地址下载网络路径短、速度快。这个过程叫“添加镜像”或“切换registry源”。5.2 最直接的换源命令两行代码搞定目前国内最常用、维护最稳定的是npmmirror镜像源地址是https://registry.npmmirror.com/它以前叫淘宝镜像现在换了个面向开发者更专业的牌子但干的事一样同步官方源的内容让国内开发者能快速拉取依赖包。打开终端执行npm config set registry https://registry.npmmirror.com/没有任何输出就是成功。然后确认一下npm config get registry如果打印出https://registry.npmmirror.com/说明配置生效了。此时你再去执行npm install体感的下载速度会有非常明显的变化从动不动超时变成几十秒甚至几秒完成。还有一个值得提的细节npm的配置是分层的。你执行npm config set registry xxx改的是用户级配置存储在当前用户目录下的.npmrc文件里。除此之外项目目录下也可以放一个.npmrc文件里面的配置只对该项目生效优先级高于用户级配置。如果你想针对某个项目强制使用官方源就在项目根目录创建.npmrc写上registryhttps://registry.npmjs.org/而命令行中临时加的参数优先级最高比如npm install --registryhttps://registry.npmmirror.com/知道这个优先级关系的好处是当你在某个项目里发现npm行为异常时先看看项目根目录有没有.npmrc文件很多“明明换源了却不生效”的疑问就出在这里。5.3 用nrm管理多个源以及换源后的缓存问题如果你经常需要在不同镜像源之间切换比如公司内部有一个私有仓库或者要测试不同源的同步情况一个个手敲npm config set registry也不是不行但效率太低。这里可以装一个nrmnpm install -g nrm如果你还没配置镜像源、原始网络又慢这个安装命令可能会卡住。可以先执行一次5.2节的换源操作或者临时指定npm install -g nrm --registryhttps://registry.npmmirror.com/装完之后执行nrm ls可以看到一个源列表里面包含了官方源和几个常用镜像源。切换源只需要nrm use npmmirror如果你需要添加公司内部源nrm add company http://内部地址这个工具的便利性在于它把“查看有哪些源、当前用的是哪个、一键切换”整合到一个命令里比手动改配置直观。我个人建议如果你平时不完全固定在某个源用nrm管理会省很多心。换源之后还会遇到一种情况有些依赖包在下载过程中因为网络原因留下了损坏的缓存文件重启项目后仍然报“无法解析依赖树”或者ETARGET错误。这时候不要急着重装整个依赖先清缓存试试npm cache clean --force再不行就删除项目里的node_modules目录和package-lock.json文件重新执行npm install。这里提醒一下不要轻易删除package-lock.json它记录了依赖的精确版本对生产环境一致性很重要。只有在缓存损坏确凿、且实在无法修复时才考虑删掉重装。5.4 镜像源的安全边界哪些包不建议从镜像装镜像源好用归好用但它毕竟是对官方源的同步有一个小问题同步时机。官方源刚发布一个超新版本的包镜像源可能延迟几分钟甚至更久才同步过去。绝大多数情况下这点延迟不影响开发但如果你刚好在等待一个刚发布的重要修复补丁那可以先临时用官方源拉这一次npm install 某个包 --registryhttps://registry.npmjs.org/这样只对该包的下载使用官方源不会破坏全局的镜像配置。还有一类情况是公司内部的私有包它只会发布在内网仓库不会同步到任何公共镜像上这种时候就需要配置内网源或者每个项目单独的.npmrc。我见过不少团队把公共镜像源地址直接写死在项目配置文件里后来公司换了一个内网代理源结果所有开发机的npm都还指向旧地址改起来费劲。所以我的习惯是全局配置一个公共镜像私有仓库用项目级.npmrc来控制两条线分开互不干扰。这个习惯在团队协作时能省下不少沟通成本。5.5 顺带一提yarn和pnpm的镜像配置方式现在很多新项目用的是pnpm或者yarn担心“是不是也要单独配一次镜像”。答案是它们的共用一套.npmrc配置逻辑。pnpm默认读取项目级和用户级的.npmrc文件所以你在5.2节设置的用户级registry对pnpm同样生效。如果你希望pnpm使用独立的配置可以在pnpm的配置里单独指定但一般没必要保持统一反而更好管理。yarn则有自己的配置文件.yarnrc而且老版本yarn的npm registry配置项有些差异。如果你用的是yarn 1.x执行yarn config set registry https://registry.npmmirror.com/如果你用的是yarn 2及之后的Berry版本它的配置逻辑变化比较大通常在项目级.yarnrc.yml里通过npmRegistryServer字段指定。我的态度是如果你刚开始接触工程化选pnpm或npm任何一个都行不必为了包管理器纠结太久它们本质上都在干同一件事。5.6 配置完成后进行一次实测前面说了那么多最后当然要做一次完整的实战验证。我建议你新建一个临时目录执行mkdir npm-test cd npm-test npm init -y npm install lodash如果一切正常你会看到node_modules目录被创建lodash被安装进去。用命令验证node -e console.log(require(lodash).VERSION)如果打印出lodash的版本号说明你的环境配置、镜像源配置、命令执行链路全部畅通。这一步做完你就可以放心去跑任何Node.js项目了。顺便说一下如果你遇到安装过程中某个包特别慢或者卡住可以打开npm install的详细日志来看npm install --verbose它会打印每一步的请求地址和耗时能看到它具体卡在哪个包上。如果发现某个包一直从官方源拉取检查一下项目级.npmrc文件看是不是被人为指定了其他registry地址。最后再分享一个我自己用下来的习惯每次拿到一台新电脑或者帮同事新建开发环境我通常不会急着把Node.js装完就开始写代码而是先把“安装路径、执行策略、镜像源、全局包目录”这四个点全部确定下来再动手。这几件事不花多少时间但能避免后面很多隐形的坑。尤其是PowerShell执行策略很多人装完环境两三天后第一次用脚手架工具才发现报错回头又要重新排查一遍。另外两个小技巧值得收藏一是修改环境变量后一定记得重启终端甚至重启VSCode别省这一步。二是如果你的公司有内网npm源优先问清楚团队用的是哪套配置别自己默默改了全局源结果和同事的锁定文件对不上那才是真正的麻烦。环境配置这事没有太多玄学无非是把每一步的原理搞明白再把验证动作做扎实。等你亲手走通一遍后面再遇到任何Node.js工具链问题心里就有一张清晰的地图了。
返回列表