开发者场景 · · 约 16 分钟阅读

Windows 上让 npm 与 pnpm 走 Clash:环境变量与分流规则完整步骤(2026)

Windows上做前端或 Node 开发时,npmpnpm拉包经常卡在「一半直连、一半走代理」:registry指向国内镜像却仍有 tarball 从海外 CDN 回源,或全局开了系统代理后内网私服被误送出国,表现为 ETIMEDOUTECONNRESET与证书相关报错。本文按本机 Shell 环境变量Clash 分流规则两层拆开:先用 HTTP_PROXYHTTPS_PROXYNO_PROXY把「应用显式代理」写清楚,再在 mihomo里为 registry.npmjs.orggithub.com等主机名单独建规则,让国内 registry保持直连、海外源稳定走节点。全文默认你已在 Windows 上跑通客户端与订阅,只是把同一套出口延伸到终端里的包管理器

1. 三条路径:系统代理、环境变量与 TUN 的关系

Node生态里的 HTTP 客户端普遍会读标准代理变量;是否同时尊重「系统代理」取决于运行时与版本。Clash在 Windows 上常见三种出口形态:系统代理(把 WinHTTP/IE 代理指向本机端口)、仅内核入站(mixed-port 开着但应用未配置)、以及 TUN模式抓整机流量。对 npmpnpm来说,最可控、也最容易写进团队文档的通常是:在 PowerShell 或 CMD 会话里显式导出代理变量,再配合 NO_PROXY把国内 registry与内网主机名排除出去。

若你更依赖图形客户端一键「系统代理」,建议仍打开终端执行 echo %HTTP_PROXY%(CMD)或 echo $env:HTTP_PROXY(PowerShell)核对:有些场景下 GUI 已切换系统代理,但当前终端会话并未继承你期望的值。与容器里通过变量指向宿主机 mixed-port 的做法对照,可阅读 Docker 宿主机 Clash 与 HTTP_PROXY一文,理解「显式变量」与「整网段默认路由」的边界;在纯 Windows 本机上,结论同样成立:变量解决的是 Node 进程愿不愿意走代理TUN 解决的是操作系统里哪些包默认进内核

若你还在 WSL2 里并行开发,宿主机与 Linux 子系统的回环与 DNS 并不相同,可另读 WSL2 与 Windows Clash专文;本文只覆盖 Windows 本机上的 npmpnpmClash组合。

2. Clash 侧前置:端口、监听地址与系统代理

先把「代理入站」当成一个普通 TCP 服务:npmpnpm通过 HTTP_PROXY=http://127.0.0.1:端口发起 CONNECT 或代理请求时,Clash必须在对应地址上监听。绝大多数用户会把 mixed-port或独立 HTTP 端口绑定到 127.0.0.1,本机终端场景足够;若你还在局域网其他设备上复用同一入站,需要打开 allow-lan并理解监听网段,细节可参考 allow-lan 与 Windows 防火墙专文。

使用 Verge Rev等桌面发行版时,「系统代理」开关与内核配置是两套 UI,容易只开其一。若你希望从图形界面理解 Windows 11 上系统代理与 TUN 的配合,可先扫一遍 Windows 11 Verge Rev 系统代理与 TUN,再回到本文用变量做「最小可复现」的终端侧接线。

订阅与基础连通若仍异常,请先完成 订阅导入与基础连接,确认浏览器侧访问正常,再测 npm pingpnpm config get registry,避免把「节点不可用」误判为 registryNO_PROXY问题。

3. Windows 上持久写入 HTTP_PROXY、HTTPS_PROXY、NO_PROXY

临时会话(当前窗口有效)在 PowerShell 中可以这样写(端口请改成你的 mixed-port):

# PowerShell session: point Node tooling at local Clash HTTP inbound
$env:HTTP_PROXY  = "http://127.0.0.1:7890"
$env:HTTPS_PROXY = "http://127.0.0.1:7890"
$env:ALL_PROXY   = "http://127.0.0.1:7890"
$env:NO_PROXY    = "localhost,127.0.0.1,::1,.local,npmmirror.com,registry.npmmirror.com"

NO_PROXY里建议同时包含:本机回环公司内网域名后缀(如 .corp.example.com)、以及你实际使用的国内镜像主机名。注意部分工具只认大写 NO_PROXY,部分文档写 no_proxy;若团队里混用 Git Bash、CMD 与 PowerShell,最好在 README 里规定「以哪一套为准」,并在 CI 与本地用同一列表,减少「我机器上能装、同事超时」的隐性差异。

需要写入用户级持久环境变量时,可用「系统属性 → 高级 → 环境变量」图形界面,或使用 setx(注意 setx后需新开终端才生效)。更进阶的做法是把上述几行放进 PowerShell Profile,使每次打开开发终端自动注入;无论哪种方式,请避免把含密码的代理 URI 提交进公共仓库。

HTTPS_PROXY在 Node 生态里通常仍写成 http://127.0.0.1:端口,含义是「到本地 HTTP 代理端口的隧道」,而不是要求代理本身提供 HTTPS 监听。若你误写成 https://127.0.0.1:...而本地入站只有 HTTP CONNECT,会出现握手阶段即失败。

4. npm 与 pnpm 的 registry、缓存与代理继承

registry决定元数据与包 tarball 列表从哪台主机拉取;即便你把 registry设成国内镜像,某些作用域包或老项目仍可能把 tarball URL 指回 registry.npmjs.org或第三方 CDN。此时仅「镜像直连」不够,还需要 NO_PROXYClash 分流规则允许这些主机名走代理,否则会表现为元数据很快、下载 tarball 卡住。

常用自检命令:npm config get registrypnpm config get registry、以及 npm ping(会向当前 registry发探测请求)。企业私服若跑在 https://npm.internal.example/,务必把主机名与后缀写进 NO_PROXY,否则 pnpm会把内网请求也送进 Clash,再由规则组送到海外节点,延迟与证书错误都会变得难以解释。

pnpm的 store 与虚拟存储结构不同于 npm,但二者都走 Node 的 HTTP 栈,对 HTTP_PROXY的继承行为在绝大多数版本里一致。若你使用 npm_config_前缀在 .npmrc里关闭严格校验或指定 cafile,请与代理场景分开评估:关闭 strict-ssl会掩盖中间人风险,不建议作为长期默认值。

与 IDE 扩展市场、AI 工具链并列时,开发者主机名可对照 Cursor 与开发者域名分流一文,把「写代码流量」与「装依赖流量」分层考虑:npm侧优先保证 registry.npmjs.orgnpm.pkg.github.com等主机在规则中有明确落点。

5. 分流规则:国内镜像直连、海外 registry 与 tarball 走代理

环境变量层用 NO_PROXY声明「不要走代理的主机」;Clash层则用 分流规则声明「直连还是走哪个策略组」。二者应一致表达业务意图:国内 registry 直连海外源走代理。下面是一段示意性 mihomo片段(按你实际策略组名替换 PROXY),仅演示域名拆分思路:

# Example rules: mirror direct, npmjs/GitHub via proxy group
rules:
  - DOMAIN-SUFFIX,npmmirror.com,DIRECT
  - DOMAIN-SUFFIX,registry.npmmirror.com,DIRECT
  - DOMAIN-SUFFIX,registry.npmjs.org,PROXY
  - DOMAIN-SUFFIX,npm.pkg.github.com,PROXY
  - DOMAIN-SUFFIX,github.com,PROXY
  - DOMAIN-SUFFIX,objects.githubusercontent.com,PROXY

真实项目里 tarball 还可能落在 *.amazonaws.com*.cloudfront.net等宽泛后缀上,不建议为了装包把整段 CDN 一股脑直连或一股脑代理;更稳妥的是先在失败日志里复制实际主机名,再按主机粒度补规则或使用规则集提供方维护的「开发者 CDN」列表。策略组层面若需要按延迟自动选节点,可延伸阅读 url-test 与 fallback 策略组

HTTP_PROXY已指向本机 Clash时,流量会先进入内核再由规则决定出口;此时「直连」类规则表示从你的代理节点侧仍以直连方式访问目标,与「不经过代理变量」不是同一概念。若你希望某些域名完全绕过代理变量,应使用 NO_PROXY,而不是在 YAML 里写 DIRECT 来替代。

目标 推荐旋钮 说明
国内镜像元数据 NO_PROXY + DOMAIN 规则 减少无谓跨境;注意 tarball 仍可能出国
官方 registry tarball 规则指向 PROXY 组 与镜像混用时优先对齐日志里的主机名
内网私服 NO_PROXY 必填 避免私服经节点访问导致证书与路由异常

6. 常见混用错误与按日志缩小范围

第一类:registry已切到国内镜像,但 tarball 域名仍走代理且节点质量差,表现为进度条长时间停在某个包。处理方式是先在 Clash连接日志里确认该包对应的主机名,再决定是优化节点、改镜像同步、还是收窄规则。

第二类:NO_PROXY漏写内网域名,pnpm407 Proxy Authentication Required或 TLS 握手失败。此时应先临时清空代理变量验证内网直连是否恢复,再逐项把后缀补回 NO_PROXY

第三类:公司安全软件或 SSL 检查中间人替换了证书,而你在 .npmrc里仍强制系统 ca。此类问题与 Clash无关,但若叠加代理,更容易被误判为「节点问题」。建议用浏览器与 curl -v对照同一 URL 的证书链。

第四类:PowerShell 与 Git Bash 会话各有一套环境,IDE 内置终端继承其一;团队文档应写清「以哪个终端为准」。统一后,npmpnpm的行为会与 README 描述一致,减少排障成本。

7. 可打印排查清单

Windows终端里的 npmpnpm接到本机已在跑的 Clash,本质是两层配置对齐:HTTP_PROXY家族解决进程是否走本地入站,NO_PROXY守住国内 registry与内网;分流规则则在出口侧为 registry.npmjs.org等海外主机名选好策略组,避免「一半直连一半绕路」带来的随机超时。相比临时改 hosts 或反复切换系统代理开关,把变量与规则写进可版本化的团队约定,长期维护成本更低,也更利于新成员上手。若你仍在对比各桌面客户端与导入流程,也会发现一套稳定内核配合清晰分流,在浏览网页与拉取依赖之间切换时,体验上往往比零散脚本拼凑更连贯。

→ 立即免费下载 Clash,开启流畅上网新体验

按主题相关度匹配的延伸阅读,覆盖同分类下的实战配置文章。