Node 使用与维护
一句话总结:环境装好之后的日常——装包命令速查(npm / pnpm / yarn / npx)、镜像源、维护与清理(删除项目、回收磁盘空间、卸载)、注意事项。
本文档基于 2026-10-03 重装后全机实测,所有路径均为本机真实路径。
📎 配套文档:《Node 安装与配置》—— Node/npm/pnpm 的安装、路径配置、D 盘八个文件夹的职责、pnpm 省磁盘机制都在那边。本文档中标注
《Node 安装与配置》7.x的引用请到该文档查阅。
一、npm 装包
常用参数
| 参数 | 简写 | 作用 | 例子 |
|---|---|---|---|
--save-dev |
-D |
装到开发依赖 | npm i -D vitest |
--global |
-g |
全局安装 | npm i -g pnpm |
--save-exact |
-E |
锁定精确版本 | npm i -E lodash@4.17.21 |
--registry |
无 | 临时指定镜像源 | npm i --registry=https://registry.npmmirror.com |
--no-save |
无 | 只装不写入 package.json | npm i --no-save puppeteer |
版本号语法
^4.17.21表示 ">=4.17.21 且 <5.0.0";~4.17.21表示 ">=4.17.21 且 <4.18.0"。生产想完全锁死用-E。
二、pnpm 装包
与 npm 的关键差异
| 对比项 | npm | pnpm |
|---|---|---|
| 磁盘占用 | 每个项目各存一份 | 全局 store 一份,项目里硬链接,巨省空间 |
| 安装速度 | 较慢 | 快,依赖复用 |
| 依赖隔离 | node_modules 平铺,可能幽灵依赖 | 严格隔离,装不到的包就真的没有 |
| 本机 store | — | D:\APP\Node\pnpm_store |
本机 pnpm store 缓存目录已指向 D 盘,避免了旧版本往 C 盘写 dlx 缓存的问题。
三、yarn(老牌,已边缘化)
新项目不建议再入坑 yarn classic(维护停滞),yarn berry(PnP 模式)又和生态有摩擦。npm 或 pnpm 二选一即可。
四、npx / pnpx:临时执行,不装进任何项目
不是安装命令,是"临时拉取并执行"——没装的 CLI 想用一次,用它最合适。
| 要点 | 说明 |
|---|---|
| 缓存位置 | npm cache 的 _npx\<hash>\(本机 D:\APP\Node\node_cache\_npx) |
| 缓存命中条件 | 包名 + 版本完全一致;想更新须显式 @latest 或清缓存 |
| 与全局安装的区别 | npx 用完即走不污染全局;要反复用、想敲短命令才值得 -g |
| pnpm 版 | pnpx <包>=pnpm dlx <包>,走 pnpm 的缓存体系 |
⚠️
pnpm add -g <包> --dry-run不支持(实测报unexpected argument '--dry-run')。--dry-run只在项目目录下的pnpm install --dry-run可用。
五、速查总表
| 想干什么 | npm | pnpm |
|---|---|---|
| 装全部依赖 | npm install |
pnpm install |
| 装一个包 | npm i lodash |
pnpm add lodash |
| 装开发依赖 | npm i -D vitest |
pnpm add -D vitest |
| 全局装 | npm i -g tsx |
pnpm add -g tsx |
| 精确版本 | npm i -E lodash@4.17.21 |
pnpm add -E lodash@4.17.21 |
| 卸载 | npm uninstall lodash |
pnpm remove lodash |
| 升级 | npm update |
pnpm update |
| 看装了啥 | npm ls |
pnpm list |
| 临时执行 | npx tsx a.ts |
pnpm dlx tsx a.ts |
真实场景
实测
pnpm init生成的package.json会自动带上"packageManager": "pnpm@12.8.1"、devEngines和"type": "module",这是 pnpm 12 的新行为,用于锁定包管理器、防止队友误用 npm。
最该记住的三条
- 日常装包用 pnpm(快、省空间),命令是
pnpm add,不是npm i。 - 想临时跑一次不安装,用 npx / pnpx,别
npm i -g。 - 全局装之前问一句:这工具我会反复用、想在任意目录敲短命令吗?是 →
-g;否 → npx。
六、镜像源配置(本机已配腾讯云)
本机现状(2026-10-03 实测):npm 与 pnpm 都已指向腾讯云镜像
npm ping 实测返回 PONG 497ms,连通正常。
6.1 配置命令(两处都要改)
⚠️ 必须分别执行两条。pnpm 虽然会顺带读
.npmrc,但pnpm config set registry会把值固化进自己的auth.ini,两处保持一致才最稳妥。 只改.npmrc→ pnpm 可能读到也可能读不到(取决于版本与作用域);只改 pnpm → npm 完全不受影响。
6.2 其他可选镜像
⚠️ 注意区分两个腾讯域名:旧资料里常见的
https://mirrors.tencent.com/npm/是老的公网镜像;本机用的是腾讯云域名https://mirrors.cloud.tencent.com/npm/。两者都是腾讯的,都能用,但建议全机统一写同一个,免得以后排查时混淆。
6.3 验证
6.4 关于 registry 的两个小知识
pnpm config list里的registries块是 pnpm 12 的新格式,会把默认源按作用域列出来(@jsr→ jsr.io、@→ 当前 registry、gh→ GitHub Packages 等)。看到"scopes": ["@"]指向腾讯云是正常现象,表示作用域包默认也走腾讯云。npm doctor若提示"registry 不是官方源":那是 doctor 只认官方源的误报,本机是故意配的腾讯云镜像,忽略即可。
七、维护与清理
7.1 日常维护命令
npm doctor里的 "Use newer npm/node version" 是版本建议、"registry 不是官方源"是镜像误报,都不是错误,理由详见 6.4。
7.2 清理分级
一级:零风险,随时可做
二级:需谨慎
旧版本 pnpm 曾把本体也放 store 里,导致
store prune可能误删 pnpm 自身。本次重装后 pnpm 由 npm 装在node_global,与 pnpm store 无引用关系,理论上不再受影响——但这条命令本身没什么必要,store status显示 untouched、磁盘也不紧张时就别跑它。
三级:禁止操作
| 禁止动作 | 原因 |
|---|---|
直接删 D:\APP\Node\pnpm_store 的子目录 |
只删 files/ 留下 index.db,索引会指向不存在的文件,状态不一致(要删就整个目录一起删,见 7.3) |
直接删 D:\APP\Node\node_global |
会连 pnpm 本体一起清掉 |
corepack disable pnpm |
Windows 上报 EPERM,白报错 |
pnpm add -g pnpm |
pnpm 12 拦截,报 ERR_PNPM_GLOBAL_PNPM_INSTALL |
无验证地跑 pnpm store prune |
见上 |
7.3 彻底清理:删项目 + 回收 store 空间
场景:测试项目、长期不用的项目要清掉,想把磁盘空间真正要回来。 这一节是本机实测踩出来的,三个坑都很容易踩,第三个最阴。
坑 1:pnpm cache prune 清的不是包内容
pnpm 有两套"缓存",名字长得像,作用完全不同:
| 命令 | 清的是什么 | 在哪个目录 | 能回收包体积吗 |
|---|---|---|---|
pnpm cache prune |
registry 元数据缓存(包名→版本→下载地址的索引) | pnpm_cache |
❌ 不能 |
pnpm store prune |
store 里没人引用的包内容 | pnpm_store |
✅ 能 |
用错命令的后果:你以为清了 262 MB,实际只清了"黄页电话簿",包本身一个字节都没动。
坑 2:删项目本身几乎回收不了空间
因为 node_modules 里是硬链接,删掉项目文件夹只是去掉几条引用,数据本体还在 pnpm_store 里躺着。以本机实测的三个项目为例:
| 删除对象 | 实际回收 | 为什么 |
|---|---|---|
C:\...\test-pnpm |
✅ ~274.7 MB | 它是跨盘退化出的真实副本,删了就真回收 |
D:\11 |
❌ 仅 ~3.2 MB + 目录元数据 | 其余 271.5 MB 是硬链接,数据仍在 store |
D:\22 |
❌ 仅 ~3.2 MB + 目录元数据 | 同上 |
这是《Node 安装与配置》7.3 那条结论的反面印证:共享意味着删除也要一起删才回收。只删项目、不动 store,D 盘那 262 MB 一分都不会回来。
坑 3:项目"删进回收站"=没删,prune 会拒绝回收 ⚠️ 最阴的一个
这是本机实测撞出来的,很多人根本意识不到。
如果你是从资源管理器删除项目文件夹(或右键 → 删除),文件只是进了回收站——在磁盘上还好端端待着,硬链接依然有效。pnpm 一看:"这些包在磁盘上还有别的链接指着呢",判定仍被引用,拒绝回收。
本机实测两轮对照(同样的命令,只差"项目是否真删"):
| 轮次 | 前置条件 | pnpm store prune 输出 |
实际回收 |
|---|---|---|---|
| 第 1 轮 | 项目删进了回收站 | Removed 3874 files (2931046 bytes) |
仅 2.9 MB ❌ |
| 第 2 轮 | 清空回收站后 | Removed 4514 files (268321527 bytes) |
255.9 MB / 121 个包 ✅ |
第 1 轮为什么只回收 2.9 MB? 对比 store 的构成就清楚了:
| store 构成 | 文件数 | 字节 | prune 结果 |
|---|---|---|---|
| 独占文件(链接数=1,磁盘上无其他主人) | 3877 | 6.5 MB | ✅ 被删(实测删掉 3874 个) |
| 共享文件(链接数>1,回收站里还有主人) | 4514 | 255.9 MB | ❌ 动不了(实测保留 4514 个) |
根因:回收站里的副本让硬链接数保持 >1,pnpm 判定包"仍被引用"。pnpm 的判断完全正确——回收站里的文件确实还在占磁盘,此时删了 store 的副本反而会让回收站里的东西变成孤儿。
怎么破:
⚠️ 清空回收站前先确认里面没有还要的东西(本机实测回收站里除了测试项目,还有
.dsh的配置与 skills、旧项目残留等)。只想清项目的话,可以在回收站里单独选中再删。
✅ 正确顺序
删项目时记得"真删"(
Shift+Delete,或删完清空回收站),否则第 ② 步只能回收几个 MB——见坑 3。
预期回收(按本机三个测试项目实测):
| 盘 | 回收 |
|---|---|
| C 盘 | ~274.7 MB(test-pnpm 是跨盘退化出的真实副本,清空回收站后即回收) |
| D 盘 | ~268 MB(store 里的 255.9 MB / 121 个包 + 项目残留) |
本机完整实测结果(含"回收站"这个变量):
| 阶段 | 操作 | D 盘可用空间 |
|---|---|---|
| 起始 | 三个项目存在,store 262.4 MB | 208.7 GB |
| 第 1 轮 | 删项目(进回收站)→ pnpm store prune |
几乎无变化(只回收 2.9 MB) |
| 第 2 轮 | 清空回收站 → pnpm store prune |
209.0 GB(回收约 310 MB) |
最终状态:pnpm_store\v11\files\ 已清空(0 个文件),store 只剩 index.db(约 1.7 MB);pnpm store status 仍报 Packages in the store are untouched(健康,只是空了)。
⚠️ 第 ② 步执行前后务必验证
pnpm --version。本机的 pnpm 本体装在node_global(npm 装的)、不在 store 里,理论上不会被误删,但这条命令历史上出过事,验证一下零成本。
关于"想整个清空"
既然项目都删光了,store 就成了纯缓存(没有任何项目引用它)。此时直接删整个 D:\APP\Node\pnpm_store 目录也可以,pnpm 下次装包会自动重建。
但两个前提:
- 要删就整个目录一起删(含
index.db)。只删files/留下index.db,索引会指向不存在的文件,状态就不一致了; - 仍推荐走
pnpm store prune,让 pnpm 自己决定删什么、自己维护索引一致性。
📌 顺带纠正一个常见误解:删
pnpm_store并不会让已有项目挂掉。硬链接之间是"平等的兄弟"关系,只要还有一条链接在,数据就不会丢(可自行验证:echo x > a.txt→mklink /H b.txt a.txt→ 删a.txt→b.txt依然完好)。不手删 store 的真正理由只有两条:白删(下次要重下)+ 容易留下不一致的索引。
7.4 维护节奏建议
| 频率 | 做什么 | 命令 |
|---|---|---|
| 装包前随手 | 确认 pnpm 存活 | pnpm --version |
| 每月 | 更新 pnpm 本体 | npm update -g pnpm |
| 每月 | 清 registry 元数据缓存 | pnpm cache prune |
| 每月 | 跑一次完整体检 | 见文末体检命令 |
| 每季度 | npm 官方自检 | npm doctor |
| 磁盘紧张时 | 清 npm 缓存 | npm cache clean --force |
| 装 Node 新版后 | 确认 PATH 无新增重复项 | reg query "HKLM\...\Environment" /v Path |
7.5 C 盘现在还剩什么(逐项定性)
| 路径 | 内容 | 能否删 |
|---|---|---|
C:\Users\YWH18\.npmrc |
prefix / cache / registry 三行 | ❌ 必须保留 |
C:\Users\YWH18\AppData\Local\pnpm\config\config.yaml |
五个 D 盘路径(169 B) | ⚠️ 建议保留(删了会重建,无收益) |
C:\Users\YWH18\AppData\Local\pnpm\config\auth.ini |
腾讯云 registry(48 B) | ⚠️ 建议保留(同上,删了镜像源会退回官方) |
C:\Users\YWH18\AppData\Local\pnpm-store-operation-locks\ |
锁文件 | ✅ 可删,自动重建 |
C:\Users\YWH18\AppData\Local\npm-cache\ |
只剩 _logs 残留 |
✅ 可删(旧默认缓存目录残留) |
已确认不存在(干净):C 盘的 pnpm.exe / pnpm.cjs、AppData\Roaming\npm、Program Files\nodejs。
判断口诀:C 盘只要没有任何 pnpm.exe,就说明 pnpm 本体没落在 C 盘。 AppData\Local\pnpm\config\ 是配置位不是安装位。
与本文档无关的 C 盘目录(别误伤):
AppData\Local\claude-cli-nodejs\(Claude Code 自己的缓存)、AppData\Local\node-addon-native-custom-loader\(其他工具的 native addon 缓存)。
八、注意事项(踩过的坑)
- PATH 里加的是目录不是文件:加
D:\APP\Node,不是D:\APP\Node\node.exe。 - 改完环境变量必须新开命令行:旧窗口不会刷新。
npm config set不建文件夹:配置路径的目录要先手动建好。- pnpm 的路径项不读
.npmrc:store-dir/global-bin-dir等必须用pnpm config set单独配。 pnpm root -g末尾带v11是正常的:那是按 Node 版本隔离的子目录。where pnpm命中node_global而非pnpm_bin是正常的:因为 pnpm 由 npm 安装。- 不要用
pnpm add -g pnpm自举:会被 pnpm 12 拦截,改用npm update -g pnpm或pnpm self-update。 - 不要执行
corepack disable pnpm:Windows 上会报EPERM ... unlink(corepack 误把真实安装目录当 shim 删)。忽略报错即可。 - PowerShell 执行策略:新开的 PowerShell 跑
npm/pnpm若报.ps1被禁,先执行Set-ExecutionPolicy -Scope Process Bypass(仅当前窗口有效)。 - Windows 路径不区分大小写:
D:\APP\node与D:\APP\Node视为同一路径,统一写大写只是为了整洁。 - 重装后旧全局包会失效:如果之前在别的路径装过全局包,路径变了会导致
.cmd快捷方式失效,重新npm i -g <包>一次即可。 - 项目必须建在 D 盘:硬链接不能跨盘符,项目建在 C 盘 pnpm 就完全不省空间(详见《Node 安装与配置》7.4 / 7.6)。
- 别用资源管理器判断省没省空间:它显示的是逻辑大小,硬链接会被重复计算(详见《Node 安装与配置》7.5)。
- 删项目要"真删":走资源管理器删除只会进回收站,硬链接仍有效,
pnpm store prune会拒绝回收(本机实测只回收 2.9 MB)。用Shift+Delete,或删完清空回收站(详见 7.3 坑 3)。