npm ls -g 仅显示顶层全局包,真正占用磁盘的是项目内 node_modules 中重复解压的嵌套子依赖;pnpm 通过硬链接共享包文件并扁平化映射,可将磁盘占用降至 npm 的 1/3~1/5,但需同步配置 vscode 的 files.watcherexclude 和 search.followsymlinks 以避免符号链接误判导致内存泄漏。

为什么 npm ls -g 里看不到真正吃空间的嵌套包
全局 npm ls -g 只显示顶层安装的包,但真正撑爆磁盘的是项目内 node_modules 中重复解压的子依赖。比如一个项目用 webpack@5,它依赖 acorn@8;另一个用 eslint@8,又带了 acorn@7 —— 这俩 acorn 不会共用,而是各自解压进 node_modules/webpack/node_modules/acorn 和 node_modules/eslint/node_modules/acorn,体积翻倍还不算,V8 缓存和语言服务器(如 TypeScript 的 tsserver)还会为每个副本单独加载 AST 解析器。
用 pnpm 替代 npm/yarn 是最直接的解法
pnpm 默认启用硬链接 + 符号链接仓库(~/.pnpm-store),所有项目共享同一份物理包文件,子依赖嵌套层级被扁平化映射,实际磁盘占用通常只有 npm 的 1/3~1/5。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 安装:
npm install -g pnpm,然后在项目根目录执行pnpm install - 验证是否生效:运行
pnpm ls acorn,看到的路径应类似node_modules/acorn → ~/.pnpm-store/v3/…/acorn/8.12.0/node_modules/acorn,而不是多层嵌套 - 注意:某些依赖(如含原生模块的
sqlite3)需加--unsafe-perm或配置.npmrc,否则构建失败
VSCode 里必须同步关掉旧监听逻辑
即使切到 pnpm,VSCode 默认仍按 npm 方式扫描整个 node_modules 目录树——它不认识硬链接结构,会把每个符号链接当真实目录递归监听,触发数万 inotify 句柄泄漏,最终拖垮 Extension Host 内存。
- 在项目根目录的
.vscode/settings.json中强制排除:"files.watcherExclude": { "**/node_modules/**": true } - 额外加一条:
"search.followSymlinks": false,防止 VSCode 沿符号链接钻进~/.pnpm-store扫描 - 别信“重启窗口”就完事——必须关掉所有 VSCode 窗口,再用终端启动:
code --disable-extensions .,确认内存回落后再逐步启用扩展
删残留 node_modules 时别漏掉 .pnpm 子目录
从 npm 迁移到 pnpm 后,旧的 node_modules 目录要彻底删除,但很多人忽略 node_modules/.pnpm 这个隐藏目录——它是 pnpm 的本地符号链接索引,若保留旧版内容,会导致新安装包错误复用过期缓存,甚至引发 Cannot find module 'xxx' 报错。
- 安全清理命令(Linux/macOS):
rm -rf node_modules && rm -rf .pnpm - Windows PowerShell:
Remove-Item -Path "node_modules", ".pnpm" -Recurse -Force - 执行前确认已提交或备份
package-lock.json或pnpm-lock.yaml,否则重装会丢失精确版本
files.watcherExclude,光换包管理器只是把问题从磁盘转移到内存。










