1. 三条路径:系统代理、环境变量与 TUN 的关系
Node生态里的 HTTP 客户端普遍会读标准代理变量;是否同时尊重「系统代理」取决于运行时与版本。Clash在 Windows 上常见三种出口形态:系统代理(把 WinHTTP/IE 代理指向本机端口)、仅内核入站(mixed-port 开着但应用未配置)、以及 TUN模式抓整机流量。对 npm与 pnpm来说,最可控、也最容易写进团队文档的通常是:在 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 本机上的 npm、pnpm与 Clash组合。
2. Clash 侧前置:端口、监听地址与系统代理
先把「代理入站」当成一个普通 TCP 服务:npm与 pnpm通过 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 ping或 pnpm config get registry,避免把「节点不可用」误判为 registry或 NO_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_PROXY或 Clash 分流规则允许这些主机名走代理,否则会表现为元数据很快、下载 tarball 卡住。
常用自检命令:npm config get registry、pnpm 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.org、npm.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漏写内网域名,pnpm报 407 Proxy Authentication Required或 TLS 握手失败。此时应先临时清空代理变量验证内网直连是否恢复,再逐项把后缀补回 NO_PROXY。
第三类:公司安全软件或 SSL 检查中间人替换了证书,而你在 .npmrc里仍强制系统 ca。此类问题与 Clash无关,但若叠加代理,更容易被误判为「节点问题」。建议用浏览器与 curl -v对照同一 URL 的证书链。
第四类:PowerShell 与 Git Bash 会话各有一套环境,IDE 内置终端继承其一;团队文档应写清「以哪个终端为准」。统一后,npm与 pnpm的行为会与 README 描述一致,减少排障成本。
7. 可打印排查清单
把 Windows终端里的 npm与 pnpm接到本机已在跑的 Clash,本质是两层配置对齐:HTTP_PROXY家族解决进程是否走本地入站,NO_PROXY守住国内 registry与内网;分流规则则在出口侧为 registry.npmjs.org等海外主机名选好策略组,避免「一半直连一半绕路」带来的随机超时。相比临时改 hosts 或反复切换系统代理开关,把变量与规则写进可版本化的团队约定,长期维护成本更低,也更利于新成员上手。若你仍在对比各桌面客户端与导入流程,也会发现一套稳定内核配合清晰分流,在浏览网页与拉取依赖之间切换时,体验上往往比零散脚本拼凑更连贯。
相关阅读 · 同主题集群
按主题相关度匹配的延伸阅读,覆盖同分类下的实战配置文章。
Clash 已开但浏览器仍直连?在 Windows 上关闭安全 DNS 并校准系统代理
Clash 与系统代理已开,Chrome、Edge 却像本地直连?说明浏览器「使用安全 DNS」与 DoH 如何绕开 mihomo 的解析栈;分步关 Chrome、Edge 与 Windows 加密 DNS,再对照 mixed-port、系统代理与 fake-ip。与订阅 TLS 拉取、TUN+UWP 文互补,专盯「只…
阅读全文WSL2 终端如何走 Windows Clash:镜像网络与 localhost 代理配置实测(2026)
在 WSL2 里用 apt、git、curl、npm 时让流量走 Windows 上已运行的 Clash:说明 WSL2 与宿主机网络命名空间、127.0.0.1 与宿主机可达 IP、mixed-port 与 allow-lan,对照传统 NAT 与镜像网络(mirrored)下 resolv.conf 与 DNS,并…
阅读全文Docker 容器走宿主机 Clash:HTTP 代理环境变量与网关两种配置实测(2026)
本地开发与 CI 不想在镜像里再装代理?对比 HTTP_PROXY 指向宿主机 mixed-port 与 Linux 网关/路由思路,说明 host.docker.internal、allow-lan、NO_PROXY 及 Git/npm/pip 排错,附与 Ubuntu 安装、策略组专栏的衔接。
阅读全文