Node 环境配置说明
本文档基于 2026-08-18 实际检查与配置结果编写(当日已恢复 pnpm 官方 standalone 结构),所有路径均为本机真实路径。 目标:Node 生态全部统一放在 D 盘
D:\APP\Node下。
一、npm 是什么,pnpm 是什么
npm(Node Package Manager)
- Node.js 官方自带的包管理器,安装 Node.js 时自动携带,无需单独安装。
- 作用:下载、安装、卸载、管理 JavaScript 包(依赖库、命令行工具等)。
- 核心命令:
npm install(装依赖)、npm install -g <包>(装全局工具)、npm run(运行脚本)。 - 特点:生态最大、最通用,任何 Node 项目都能用。
pnpm(Performant npm)
- 另一款流行的包管理器,用来替代 npm 完成同样的工作,但更"聪明"。
- 三个核心优势:
- 省磁盘:所有包内容以"内容寻址"方式存进一个全局 store,多个项目共享同一份,不重复下载;
- 快:包通过硬链接/符号链接从 store 引入,不用反复拷贝;
- 隔离严格:项目的
node_modules结构更规范,杜绝"幽灵依赖"(没声明却能用)问题。 - 核心命令与 npm 几乎一致:
pnpm install、pnpm add -g、pnpm run,可无缝上手。 - pnpm 本身也需要 Node.js 环境,它不替代 Node,只替代 npm。
二、它们各自放在哪里
| 组件 | 位置 | 说明 |
|---|---|---|
| Node.js 本体 | D:\APP\Node |
运行时,npm/pnpm 都靠它执行 |
| npm 本体 | 随 Node.js 内置 | 无需单独安装 |
| npm 全局安装目录(prefix) | D:\APP\Node\npm-global |
npm 全局装的包都放这里 |
| npm 缓存(cache) | D:\APP\Node\node-cache |
npm 下载的包缓存 |
| pnpm 命令入口 | D:\APP\Node\pnpm\bin\pnpm.cmd |
PATH 中的 %PNPM_HOME%\bin |
| pnpm 本体 | D:\APP\Node\pnpm\global\v11\<hash>\node_modules\@pnpm\exe\pnpm.exe |
pnpm 自身作为全局包(@pnpm/exe)装在内容仓库里,pnpm.cmd 只是转发它的 shim |
| pnpm store(包仓库) | D:\APP\Node\pnpm\store |
pnpm 所有包内容的唯一仓库 |
| pnpm 全局包目录 | D:\APP\Node\pnpm\global |
pnpm 全局安装的项目 |
| pnpm 配置主目录(PNPM_HOME) | D:\APP\Node\pnpm |
环境变量 PNPM_HOME 指向这里 |
| 镜像源 | https://mirrors.tencent.com/npm/ |
npm 和 pnpm 共用的腾讯镜像 |
关于 global\v11 里的"数字文件夹":里面只有两类东西——
- 带
-1a013c...长尾巴的真实文件夹(如66e0-...、5894-...):每个全局包一个"全局项目"(66e0-...是 pnpm 本体 @pnpm/exe,5894-...是 cowsay); - 纯 64 位十六进制的符号链接(如
6032a739...、65d4af...):指向上面真实文件夹的"稳定标识",pnpm.cmd引用链接名而非目录名,目录名变化时 shim 不用改。
真实包文件最终都躺在 store\v11 里,global\v11 只是指针(包括 pnpm 自身),所以这些 hash 不用理解,只需要知道链接指向哪里。
配置写入位置:
- npm 的配置写在
C:\Users\YWH18\.npmrc(prefix、cache、registry三项)。 - pnpm 的
store-dir/global-bin-dir/global-dir三项写在 pnpm 自己的全局配置文件里(不读.npmrc)。
三、它们下载、安装的包会放到哪里
npm 的包去向
| 场景 | 包内容放哪 | 命令入口放哪 |
|---|---|---|
项目安装(npm install) |
项目的 node_modules\ 目录 |
项目的 node_modules\.bin\ |
全局安装(npm install -g <包>) |
D:\APP\Node\npm-global\node_modules\ |
D:\APP\Node\npm-global\<命令>.cmd(例如 eslint.cmd、vite.cmd) |
| 下载缓存 | D:\APP\Node\node-cache\_cacache\ |
— |
pnpm 的包去向
| 场景 | 包内容放哪 | 命令入口放哪 |
|---|---|---|
项目安装(pnpm install) |
包内容进 D:\APP\Node\pnpm\store\v11\(全局唯一一份),项目 node_modules\ 里是硬链接指向 store |
项目的 node_modules\.bin\ |
全局安装(pnpm add -g <包>) |
包内容进 store,全局项目记录在 D:\APP\Node\pnpm\global\v11\ |
D:\APP\Node\pnpm\bin\<命令>.cmd(例如 cowsay.CMD) |
| 下载缓存 | store 本身即内容仓库,另有无数据缓存 | — |
一句话总结:npm 全局的包"实打实"放在 npm-global 里;pnpm 的包全部集中在 pnpm\store 里,别处只有链接。
四、npm 和 pnpm 的相互关系
-
共用同一套 Node.js 运行时:两者都只是 Node 之上的工具,执行任何脚本最终都靠
D:\APP\Node里的 Node。 -
安装方式独立:pnpm 本体通过官方安装脚本 install.ps1 安装到 D 盘(
iwr https://get.pnpm.io/install.ps1 -useb | iex),不需要 npm 参与;两者可以独立安装、卸载,互不依赖。 -
共享镜像源:
registry=https://mirrors.tencent.com/npm/在.npmrc里,npm 和 pnpm 都读它,下载源一致。 -
全局包互不干扰:
- npm 全局工具 →
D:\APP\Node\npm-global - pnpm 全局工具 →
D:\APP\Node\pnpm\bin+pnpm\global -
两者各自管理,同一个包可以分别在两边各装一份,互不影响。
-
命令入口分层:PATH 中
D:\APP\Node\pnpm\bin(pnpm 系命令)排在D:\APP\Node\npm-global(npm 系命令)之前,同名命令优先命中 pnpm 侧。 -
项目内通常二选一:一个项目用 npm 还是 pnpm 管理,取决于
package-lock.json(npm 的锁文件)还是pnpm-lock.yaml(pnpm 的锁文件)。混用可能引起依赖结构混乱,不推荐。
五、npm、pnpx 和 pnpm 的关系
三者是"两个管理器 + 一个执行器"的关系:
| 命令 | 归属 | 是什么 | 典型用途 |
|---|---|---|---|
| npm | npm 自带 | 包管理器 | 安装/卸载/管理包 |
| npx | npm 自带 | 临时执行器 | npx <包名> 临时下载并运行一个包,用完即走,不装进全局 |
| pnpm | pnpm 自带 | 包管理器 | 与 npm 同类的装包工具 |
| pnpx | pnpm 自带 | 临时执行器 | pnpm 版的 npx,等价于 pnpm dlx |
关系要点:
- npm ↔ npx 是一对:npm 负责"装",npx 负责"临时跑"。
npx cowsay hi会临时拉取 cowsay 运行,但不永久安装。 - pnpm ↔ pnpx 是同样的关系:
pnpx cowsay hi等价于pnpm dlx cowsay hi,临时执行,不污染全局。 - npx 与 pnpx 的功能对等:都是"临时执行工具",区别只是底层仓库不同——npx 临时下载的包走 npm 的缓存(
node-cache),pnpx 走 pnpm 的 store(pnpm\store)。 - npm 与 pnpm 功能对等:都可以装包、跑脚本、管理依赖;pnpm 在性能、磁盘占用、依赖隔离上更优,命令习惯上几乎兼容。
本机现状速查(2026-08-18 全项体检通过):
- Node.js 版本:v24.19.0(本体在
D:\APP\Node\node.exe);npm 版本:11.17.0;pnpm 版本:11.22.0 - npm 全局已装(7 个):
@colbymchenry/codegraph@0.9.6、@modelcontextprotocol/server-github@2025.4.8、eslint@10.3.0、playwright@1.60.0、tavily-mcp@0.2.21、typescript@6.0.3(提供 tsc/tsserver 命令)、vite@8.0.11(在npm-global) - pnpm 全局已装:
@pnpm/exe@11.22.0(pnpm 本体)、cowsay@1.6.0(含 cowthink 命令)(在pnpm\bin,包内容在 store) - pnpm 本体:@pnpm/exe 11.22.0(官方 standalone,位于
pnpm\global\v11,由pnpm.cmd转发调用) - 环境变量:
PNPM_HOME=D:\APP\Node\pnpm(当前会话与注册表持久化一致);PATH 中D:\APP\Node\pnpm\bin排在D:\APP\Node\npm-global之前 - store 状态:
pnpm store status= "Packages in the store are untouched"(完整无损) - 镜像连通:npm ping / pnpm ping 均正常响应(腾讯镜像)
- PowerShell 执行策略:各作用域均 Undefined(默认受限,新窗口跑 npm/pnpm 可能报
.ps1被禁,可用Set-ExecutionPolicy -Scope Process Bypass临时放行)
附:注意事项(踩过的坑,记在这里)
pnpm store prune会误删 pnpm 自身:prune 只按 store 引用记录判断,pnpm 本体不在记录里,会被当垃圾清掉。执行 prune 前后务必验证pnpm --version。- pnpm 自更新:
pnpm self-update从 GitHub 下载,国内网络可能很慢(卡住可改用 npm 方式临时恢复);更新的是pnpm\global\v11里的 @pnpm/exe 本体。 - PowerShell 执行策略:新开的 PowerShell 窗口跑
npm/pnpm若报.ps1被禁,先执行Set-ExecutionPolicy -Scope Process Bypass(仅当前窗口有效)或-Scope CurrentUser RemoteSigned(永久)。 - 全局命令查找顺序:保证
D:\APP\Node\pnpm\bin在D:\APP\Node\npm-global之前(当前已满足)。 - 官方安装脚本依赖 GitHub:
install.ps1从 GitHub 下载 standalone 包,网络不通时会长时间卡在 "Downloading pnpm from GitHub..."(2026-08-18 改网络环境后已成功)。卡住时用 npm 方案临时恢复:npm install -g --prefix "D:\APP\Node\pnpm\bin" pnpm@11.22.0。
附:环境体检命令(一键检查)
下方命令块可整体多行复制,直接粘贴到 CMD 窗口运行,逐段执行。执行结果与各节"期望值"对照,全绿即环境健康。2026-08-18 实测全部通过。
期望值对照:
| 段 | 期望 |
|---|---|
| 一 | node v24.x / npm 11.x / pnpm 11.22.0;where 三条都指向 D:\APP\Node 下 |
| 二 | prefix=D:\APP\Node\npm-global、cache=D:\APP\Node\node-cache、registry=腾讯镜像 |
| 三 | 三项固化配置为 D:\APP\Node\pnpm\store / \bin / \global;store path=store\v11;store status="untouched" |
| 四 | PNPM_HOME=D:\APP\Node\pnpm(两条一致);Path 中 pnpm\bin 在 npm-global 之前 |
| 五 | npm-global 有 7 个包 shim;node-cache 有 _cacache;pnpm\bin 有 pnpm/pn/pnpx/pnx + cowsay/cowthink 且无 node_modules;store\v11 有 files/links/index.db/projects;global\v11 有 @pnpm/exe 与 cowsay 两个项目 |
| 六 | pnpm.cmd 转发到 global\v11\...\@pnpm\exe\pnpm.exe;"本体存在";cowsay 正常输出 |
| 七 | projects 下所有 JUNCTION 指向存在的路径(无 D:\AI\pnpm\... 死链接) |
| 八 | 均返回 PONG |
| 九 | 各作用域 Undefined 属正常(默认受限),非异常 |
2026-08-18 状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 | |