news 2026/10/22 5:18:46

Windows下pnpm踩坑指南:环境变量、store路径与脚本兼容全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows下pnpm踩坑指南:环境变量、store路径与脚本兼容全解析

最近帮朋友调一个 Windows 下的前端工程,之前在 Linux 流水线上跑得稳稳的,挪到 Windows + Node + pnpm 后,一连串报错让人头皮发麻。仔细排查才发现,真正的问题几乎都不在业务代码里,而是工具链在 Windows 平台上的适配。这篇踩坑记录覆盖安装、路径、脚本、缓存、版本升级五个最容易翻车的环节,适合刚把开发机切回 Windows 原生环境、或者团队要求全组统一使用 pnpm 的开发者参考。

1. 环境准备与安装选择的那些坑

1.1 Windows 下 Node 版本管理到底怎么选

很多人的第一台 Windows 开发机是直接用官方安装包装 Node,一路 Next 到底。这个方式本身没错,但当你有多个项目需要不同 Node 版本时,问题就来了:不同项目的依赖可能只在特定大版本下表现稳定,你要么反复卸载重装,要么硬着头皮用一个可能带兼容问题的版本。

我在踩过几次坑之后的建议是:用版本管理工具统一管 Node。Windows 上常见的工具是 nvm 的 Windows 发行版,安装时它会把 Node 的切换逻辑通过环境变量实现,而不是直接替换文件。这个细节带来的直接后果是:切换版本之后,已经打开的命令行窗口不会立刻生效,必须新开终端。很多同学在这里以为工具坏了,其实只是没刷新环境变量。

另一个容易忽略的坑是:如果你电脑上已经用官方安装包装过 Node,再安装 nvm 之前最好先把旧 Node 卸载干净。否则就会出现两个安装目录同时存在于系统里,node -v读取的永远是旧路径,而 nvm 管理的是另一个目录。这种“双 Node”残留导致的路径冲突,在 Windows 上尤其顽固。

如果你不想引入额外的版本管理工具,也可以直接用 corepack 配合 Node 自带的版本管理。corepack 是 Node 官方配套的包管理器管理工具,后面安装 pnpm 时我会详细说。这里先记住一个结论:不要用官方安装包装多版本 Node,实在太难清理。

1.2 pnpm 的三种安装方式和我的选择

pnpm 在 Windows 下安装方式有好几种,每种都有各自的适用场景:

  • 通过 npm 全局安装:npm install -g pnpm。这种方式最简单,但会把 pnpm 安装到 npm 的全局目录,之后如果再用其他方式安装 pnpm,就可能出现两个 pnpm 并存的情况。
  • 通过 corepack 管理:启用 corepack 后,用corepack prepare pnpm@latest --activate安装。这种方式的好处是可以用 package.json 里的packageManager字段锁定 pnpm 版本,团队协作时特别有用。
  • 通过官方安装脚本:在 PowerShell 里执行下载脚本,通常会把 pnpm 安装到%USERPROFILE%\AppData\Local\pnpm,并要求设置PNPM_HOME环境变量。这种方式对环境变量控制最直接,但也最容易因为执行策略而失败。

我个人现在的选择是用 corepack,前提是 Node 版本自带 corepack 并且已启用。原因很简单:团队项目里每个人安装的 pnpm 版本如果不一致,很容易把 lockfile 搞乱,而 corepack 可以按照项目声明自动切换版本,避免很多无意义的 diff。

如果你手里已经有一个用 npm 全局装好的 pnpm,也不一定马上卸载。可以先看一眼之后的版本冲突问题,再决定从哪条路径收口。

1.3 安装后先做三件事,免得后面人仰马翻

装好之后别急着跑pnpm install,在干净的终端窗口里先做三件检查:

  1. node -v能否稳定输出版本号。
  2. pnpm -v能否稳定输出版本号。
  3. where.exe pnpm能看到几个结果,分别指向哪个目录。

第三点特别重要。在 PowerShell 里执行where.exe pnpm,会列出所有可能命中的 pnpm 路径。如果同时出现多个,说明系统 Path 和用户 Path 里都配置了相关目录,而且路径优先级还不一样。这时候,重点不是马上删除某一个,而是先确认执行pnpm -v时命中的到底是哪一个。否则你会遇到“刚在 A 位置更新了版本,命令行用的还是 B 位置的旧版本”这种诡异现象。

这里的经验是:永远相信where.exe的输出,而不是你脑子里的安装记忆。Windows 环境变量里的路径排序,才是命令行最终看到的世界。

2. 环境变量与路径配置:最容易翻车的区域

2.1 系统 Path 和用户 Path 的优先级,决定了你看到哪个版本

Windows 的环境变量有个规则经常被忽略:最终组合出来的 Path,是系统变量 Path 加上用户变量 Path 拼接而成的,而且系统变量的条目排在用户变量前面。也就是说,如果系统变量里有一个旧版 pnpm 目录,用户变量里有一个新版 pnpm 目录,那么命令行实际执行的,大概率是系统变量里的旧版。

这种问题在 CMD 和 PowerShell 里表现还不一样,因为有些缓存了会话级别的环境变量。排查方法是在终端里执行:

$env:Path -split ';'

按顺序看每个路径,基本就能定位到是哪一个目录在起作用。我之前遇到过一次“pnpm 版本不变”的怪现象,执行这个命令后发现第一个 Path 条目还是一个三个月前手动创建的安装目录,而新的 pnpm 排在后面。清理掉重复目录后,版本立刻正常。

2.2 PNPM_HOME 的作用,以及 pnpm 命令找不到的连锁反应

pnpm 独立安装之后,所有全局命令都会被放到一个固定的目录,这个目录由PNPM_HOME环境变量指定。如果PNPM_HOME没有设置,或者这个目录没有被加入 Path,输入pnpm就会提示“无法识别”。

正常的操作顺序是:先设置PNPM_HOME,再把PNPM_HOME本身追加到用户 Path,最后新开终端。很多人只改了当前会话的临时变量,一关终端就失效;也有些人图方便,直接去改系统变量,导致权限弹窗和杀毒软件干扰。我的建议是:这类工具目录一律配置在用户变量,不要动系统变量。

有一个细节值得注意:PNPM_HOME和store-dir是两个完全不同的东西。PNPM_HOME管的是 pnpm 全局脚本的位置,而store-dir管的是依赖包缓存仓库的位置。很多教程混在一起写,结果用户把PNPM_HOME设成了 D 盘依赖目录,全局命令反而找不到了。

2.3 store-dir 应该放在哪里,放错会有什么后果

pnpm 的 store 是全局内容寻址仓库,不同项目安装同一个版本的同一个包时,只会在这个仓库里保留一份内容,其他项目通过硬链接引用。Windows 上默认的 store 路径在%LOCALAPPDATA%\pnpm\store,也就是 C 盘用户目录下。一旦项目多、依赖重,这个目录会越滚越大。

修改 store 路径的方法是在项目或用户的.npmrc文件里写:

store-dir=D:/pnpm-store

注意这里强烈建议使用正斜杠,不要用反斜杠。有人写成D:\\pnpm-store,结果 pnpm 转义处理后把它当成了奇奇怪怪的路径字符串,实际配置完全没生效。想确认当前生效路径,执行:

pnpm store path

还有一个 Windows 特有的硬限制:硬链接不能跨分区。如果 store 在 D 盘,项目在 C 盘,pnpm 无法跨盘创建硬链接,最终会退化为复制文件。表面上看也能安装成功,但安装变慢、磁盘占用翻倍,store 的意义也少了一大半。所以规划 store 路径时,最好把它和常用项目放在同一个盘里。

2.4 带空格的中文路径:能绕就绕,别硬刚

Windows 的路径里带空格非常常见,比如用户目录C:\Users\Zhang San,或者安装路径C:\Program Files\nodejs。Node 本身能处理这种路径,但很多脚本不会自动加引号,一旦手动拼接路径就会出错。

最常见的翻车场景是 package.json 的 script 里有人直接写了"C:\Program Files\nodejs\node.exe" app.js,后面再拼接其他参数时,路径被空格拆成了两段,命令直接失败。还有原生模块编译时,Python、C++ 构建工具对中文目录的兼容性参差不齐,一旦编译环境里的路径带中文,报错信息会很晦涩。

我的建议很简单:开发目录尽量用英文,且不带空格。如果实在绕不开,就在所有引用路径的地方统一使用带引号的完整路径,不要依赖相对路径隐式补全。项目目录问题看起来是小事,实际能坑掉一整天。

3. 命令执行与脚本兼容性:Windows 和 Linux 的真实差异

3.1 PowerShell 执行策略限制,让 pnpm 直接“消失了”

在 Windows 上装好 pnpm,执行pnpm -v却报错,大概率是下面这种情况:

pnpm : 无法加载文件 C:\Users\xxx\AppData\Local\pnpm\pnpm.ps1,因为在此系统上禁止运行脚本。

这不是 pnpm 没装好,而是 PowerShell 默认执行策略不允许运行本地 .ps1 脚本。pnpm 给 PowerShell 生成的包装脚本恰好是 .ps1,所以被挡了下来。解决办法是在当前用户范围放开执行策略:

Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

RemoteSigned的含义是:本机生成的脚本可以运行,从互联网下载且没有签名的脚本需要签名。pnpm 的包装脚本是本机生成的,不会触发签名校验。执行完记得新开终端。

这里有个容易混淆的点:node -v能运行,不代表pnpm -v也能运行。因为 node 是 .exe 可执行文件,而 pnpm 在 PowerShell 里走的是一层 .ps1 脚本包装。很多老手也会在这里愣一下。

3.2 package.json 脚本在 Windows 下的“水土不服”

pnpm run 在 Windows 默认调用 cmd.exe,不是 PowerShell,也不是 Bash。这个差异会带来两个典型问题:

  • rm -rf、cp -r、ls这类 Linux shell 命令不可用。
  • 写export NODE_ENV=production这种设置环境变量的语法不可用。

所以项目里的脚本要尽量跨平台。例如删除目录用rimraf替代rm -rf,设置环境变量用cross-env。我在一个项目里见过这种写法,Windows 和 Linux 都能稳定运行:

{ "scripts": { "clean": "rimraf dist", "build": "rimraf dist && cross-env NODE_ENV=production vite build" } }

有人觉得自己反正只在 Windows 上开发,写 cmd 语法就行。但团队里总有队友在 Linux 或 macOS 上,总有一天 CI 也会跑在 Linux 上,到那时返工成本比一开始写跨平台命令高得多。把跨平台当成默认要求,是成熟项目的底线。

3.3 CRLF 与 LF 换行符:一个看不见的杀手

Git 在 Windows 上默认开启core.autocrlf=true,从仓库拉取代码时,很多文件会被自动转成 CRLF 换行。普通代码文件通常没问题,但有两类文件在 CRLF 下会出怪事:

  • shell 脚本:如果后缀是.sh,在 Linux 或 Git Bash 下可能会报bad interpreter,因为文件里混入了\r。
  • 配置文件:.npmrc被 pnpm 解析时,CRLF 可能导致某个配置项的值末尾带上回车符,出现“配置看起来写了,但实际没生效”的诡异问题。

最省事的做法是在仓库根目录维护一份.gitattributes:

* text=auto *.npmrc text eol=lf *.sh text eol=lf package.json text eol=lf pnpm-lock.yaml text eol=lf

这样即使开发机是 Windows,Git 也会把这些关键文件按 LF 提交和检出,从源头避免换行符问题。我踩过最明显的一次是:项目从仓库克隆下来后,pnpm install 一直报某个包的哈希不匹配。排查了很久,最后发现是 pnpm-lock.yaml 被 CRLF 污染,提交变更时行尾不一致导致的。

3.4 .npmrc 中的路径变量和环境变量替换

.npmrc 文件本身很简单,但 Windows 下有几个陷阱。首先,不要用${HOME}这种类 Unix 变量,pnpm 解析时不一定能把它替换成用户目录。更可靠的是用相对路径,或者写死绝对路径。

其次是文件编码。.npmrc最好保存为 UTF-8 无 BOM。如果文件带 BOM,第一行 key 前面会多一个不可见字符,导致该配置失效。这个问题很隐蔽,因为看起来文件内容完全正常。

最后是配置层级的叠加。项目级.npmrc、用户级.npmrc、全局配置三者会叠加,项目级优先级最高。如果全局配置里设置了某个 store-dir,项目里又写了另一个,就会出现“我以为在 D 盘,实际 C 盘还在涨”的错觉。想确认所有配置的最终生效值,执行:

pnpm config list

这个命令会明确列出配置来源,排查配置类问题时比猜要高效得多。

4. 依赖安装阶段的常见错误和排查思路

4.1 安装慢:不一定是网络问题,可能是 pnpm 在解析元数据

pnpm 安装慢有两个常见原因。第一是 registry 下载速度慢,可以检查当前配置:

pnpm config get registry

如果指向官方默认源,但网络环境不稳定,可以换成公共镜像服务。团队里统一使用同一个 registry 非常重要,否则 lockfile 里引用的 tarball 地址不同,同步代码后依赖解析结果不一致,容易出现“我这边好好的,你那边一直报错”。

第二是 Windows 上常见的杀毒软件实时扫描。node_modules 里通常有成千上万个小文件,安全软件逐个扫描会占用大量磁盘 I/O。如果你发现pnpm install时 CPU 不高但磁盘跑满,大概率是安全软件在背后工作。可以为项目目录增加排除项,或至少在首次安装依赖时暂时关闭实时防护。

不要一慢就怀疑网速,先看任务管理器里的磁盘和 CPU 占用,很多时候问题不在网络,而在本地扫描。

4.2 原生模块编译失败:node-gyp、Python 和 Build Tools

Windows 上跑依赖安装时,最硬的骨头是遇到带原生模块的包,比如含 C++ 源码的加密库、sqlite3、sharp 这类。报错典型长这样:

gyp ERR! find Python gyp ERR! stack Error: Can't find Python executable

原因很直接:node-gyp 在 Windows 上需要 Python,并且需要 C++ 构建工具链。解决办法是:

  1. 安装 Python,勾选“Add Python to PATH”。
  2. 安装 Visual Studio Build Tools,在“单个组件”里选择 Windows SDK 和 MSVC 相关组件;不需要装完整 Visual Studio。
  3. 安装完成后,关闭并重新打开终端,让环境变量生效。

如果项目里安装的是预编译包,但仍然触发了源码编译,可以检查npm_config_build_from_source是否被设置成了true。我遇到过有人在用户环境变量里加了这一项,导致所有包都去源码编译,速度慢到怀疑人生。

另外,这些原生模块往往也依赖 prebuild 下载资源。如果下载慢,和 registry 慢是同一类问题,需要检查预编译资源的下载地址是否能够正常访问。总的来说,Windows 原生模块编译的三件套是 Python、C++ 构建工具、正确的环境变量,缺一个都会报出看似无关的错误。

4.3 幽灵依赖在 Windows 下更容易暴露

npm 和 Yarn 默认会把 node_modules 做成扁平结构,很多间接依赖会被提升到顶层,项目代码即使没有直接声明某个依赖,也能 require 到。pnpm 默认构建的是.pnpm虚拟目录结构,间接依赖不会被提升,于是那些偷偷用了幽灵依赖的项目,在 pnpm 下会立刻暴露出来,报MODULE_NOT_FOUND。

解决原则是“把幽灵依赖变成显式依赖”,也就是让代码里用到的每个依赖,都出现在 package.json 的 dependencies 或 devDependencies 中。临时绕开可以配置node-linker=hoisted或者shamefully-hoist=true,但这是把 pnpm 最核心的依赖隔离优势关掉了。

我在一个项目里见过团队为了省事,直接打开shamefully-hoist=true,结果依赖结构退化成和传统包管理器差不多。依赖隔离是 pnpm 的一个重要价值,遇到幽灵依赖,宁可多花半小时补齐声明,也不要轻易关掉隔离机制。

4.4 删除 node_modules 时 EPERM 和文件占用

Windows 上删除 node_modules 大概率会遇到“文件正在被另一个进程使用”或者EPERM: operation not permitted。原因可能是 IDE 文件索引、终端工作目录停留在 node_modules 里面、安全软件正在扫描,或者某个 node 进程没有退出。

我的操作顺序是:

  1. 先关闭所有相关的编辑器窗口、终端窗口。
  2. 如果项目是通过 dev server 或调试进程运行的,先停掉。
  3. 在项目根目录执行npx rimraf node_modules,而不是直接用资源管理器右键删除。

rimraf能绕过一些路径过长和只读属性的问题。如果仍然报 EPERM,再考虑用管理员权限的终端执行。这里还有一个 Windows 特有的细节:不要在资源管理器的窗口正好停留在 node_modules 内部时删除上层目录,资源管理器会持有子目录句柄,非常容易失败。

5. pnpm 缓存与磁盘空间:不知不觉吃满 C 盘

5.1 store 为什么会越用越大,以及如何确认大小

pnpm 采用全局存储 + 硬链接的方式,同一个版本的同一个包,所有项目只用一份内容。这是一个优秀设计,但也意味着 store 本身可能迅速膨胀,尤其是频繁切换依赖版本、运行不同 Node 版本的原生模块时,旧版本包不会自动删除。

用pnpm store path看当前 store 位置,用系统文件管理器看目录大小。也可以执行pnpm store status检查 store 与实际项目引用的一致性,这个命令一般很少报错,但偶尔会提示某些文件缺失或异常。

值得注意的是,pnpm 的缓存并不仅存在于 store,还有%LOCALAPPDATA%\pnpm\metadata这类元数据缓存。分不清没关系,记住不要把整个 pnpm 目录手动删掉,除非你已经确定不再用 pnpm。

5.2 把 store 迁移到其他盘,不是改一个配置那么简单

想从 C 盘迁到 D 盘,正确做法是:

  1. 在用户级或项目级.npmrc里设置store-dir=D:/pnpm-store。
  2. 新开终端,执行pnpm install让 pnpm 按新路径重建 store,首次会比较慢。
  3. 确认项目安装正常后,再清理旧的 C 盘 store,不要反过来。

不要直接把 C 盘的 store 文件夹复制到 D 盘再改配置,因为 store 里可能有硬链接和路径关联信息,物理复制会破坏这些关联,甚至产生文件损坏的假象。如果确实要保留旧缓存,应该让 pnpm 重新解析下载,而不是手动拷贝。

前面提过,如果项目不在 D 盘,而 store 在 D 盘,跨盘硬链接不可用,pnpm 会复制文件到项目的.pnpm目录。优点是项目独立性更强,缺点是磁盘占用变大。所以 Windows 上规划 store 位置时,最好把频繁开发的项目也放在同一分区。

5.3 什么时候该 prune,什么时候该手动清空

pnpm store prune会从 store 中删除未被任何项目引用的孤立包。这个命令相对安全,但注意,pnpm 判断“被引用”依赖于项目中的锁文件,所以要先保证项目依赖安装完整,再执行 prune。如果 store 已经混乱到无法救起,可以彻底删除 store 目录,然后重新pnpm install。

我一般习惯的节奏是:每两周跑一次pnpm store prune,每次调整 lockfile 后关注 C 盘剩余空间。不用清理得太勤,因为 store 本身是共享设计,频繁清理只会让每个项目重新下载一大堆依赖。

另外,pnpm install --force可以强制重新构建当前项目的依赖,但不会清理 store。如果遇到存疑的文件损坏问题,先尝试pnpm install --force修复项目,再考虑清 store,这样影响范围更小。

6. 版本升级与团队协作中的兼容性

6.1 pnpm 版本差距导致的 lockfile 问题

pnpm 的 lockfileVersion 会随大版本更新发生变化。比如某个仓库用老版本 pnpm 生成的 pnpm-lock.yaml,另一位同事用新版 pnpm 执行 install,依赖解析结果可能被悄悄改写,产生大量无意义的 diff。更麻烦的是,有些同学在本地升级 pnpm 后,把 lockfile 提交上去了,团队其他人还在旧版本,安装时可能出现版本不兼容警告。

要避免这个问题,团队必须在 package.json 里声明 packageManager 字段,并且在 CI 中使用 corepack 锁定 pnpm 版本。例如:

{ "packageManager": "pnpm@9.0.0" }

配合.npmrc里的engine-strict=true,可以在安装时强制检查 Node 和 pnpm 版本,不符合就报错。这样能把“本地能跑、线上挂了”的隐患扼杀在安装阶段,而不是等部署时才发现。

6.2 多个包管理器并存:注意 PATH 残留

Windows 上最容易出现的情况是:之前用 npm 全局装过 pnpm,后来为了用独立安装脚本又装了一遍,两个 pnpm 脚本同时存在于不同目录。你执行pnpm -v时,命令可能来自 npm 全局目录;而pnpm store path显示又来自 PNPM_HOME,结果完全对不上号。

建议只保留一种安装方式。如果确定使用 corepack,就把通过其他方式安装的 pnpm 卸载或删除。排查过程用where.exe pnpm定位所有脚本,再逐个清理。这个排查不复杂,难的是耐心,因为 PATH 里可能有用户态变量、系统态变量,还有临时会话变量,三者的可见范围不同。

6.3 本地 Windows 与 CI Linux 的差异怎么收敛

即使 pnpm 版本一致,Windows 本地环境和 Linux CI 还是有很多差异。最大的几个:脚本解释器不同、路径分隔符不同、原生模块是否需要重新编译不同。为了尽量收敛,可以这样做:

  • 所有 package.json 脚本都写成跨平台版本,不要依赖 shell 的 rm 或 find。
  • CI 里执行pnpm install --frozen-lockfile,保证依赖版本不被随意升级。
  • 把.npmrc提交到仓库,确保 registry、store-dir 等配置对所有人一致。
  • 如果本地是 Windows,尽量把最终构建任务放到同一套命令里,不要在 Windows 上手工补动作。

这些看起来都是小事,但在跨平台团队协作中,每一条都能省下一个下午的排查时间。Windows 和 Linux 的差异不会自动消失,只能靠规范和工具约束来逐步拉平。

7. 常见问题速查表

7.1 高频问题与排查方向

下面这张表是我在 Windows 上整理的一部分高频问题,适合贴到团队 Wiki 里:

现象最可能原因解决办法
pnpm 命令无法识别PNPM_HOME 未配置,或未加入 Path设置用户变量 PNPM_HOME,并将脚本目录加入 Path
pnpm -v 显示旧版本多个 pnpm 安装位置,Path 优先级不对用 where.exe pnpm 找出所有路径,清理多余安装
PowerShell 禁止运行 pnpm执行策略 Restricted执行 Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
install 后依赖找不到代码使用了幽灵依赖在 package.json 显式声明缺失依赖,不要立刻开 hoist
原生模块编译失败缺少 Python / VS Build Tools安装对应构建工具,确认 PATH 生效
删除 node_modules 报 EPERM文件被编辑器或进程占用关闭占用进程,使用 npx rimraf node_modules
store 占满 C 盘默认 store 路径在 C 盘修改 .npmrc 的 store-dir,推荐放到项目同分区
.npmrc 配置没生效CRLF 或 BOM 干扰用 UTF-8 无 BOM 保存,并在 .gitattributes 统一 eol=lf
团队里 lockfile 版本不一致本地和 CI 的 pnpm 版本不同用 packageManager 字段锁定版本,CI 使用 corepack
Git 检出后脚本报错换行符变成了 CRLF在 .gitattributes 中强制指定 eol=lf

7.2 表格之外的两个排查细节

表格不是万能,但能帮你快速定位方向。如果真的遇到表格里没覆盖的问题,优先看完整报错信息里的第一个英文短句,大部分情况下,英文原文比中文翻译更准确。

另一个细节是:遇到环境变量类的问题,改完配置后不要只开一个终端测试。Windows 有一个顽固的毛病,就是资源管理器启动的进程和命令行启动的进程可能会继承不同的环境变量状态。正确做法是彻底退出相关应用程序,再重新打开。这个细节救了我很多次。

8. 踩过这些坑之后,我养成的几个小习惯

写到这里,说点个人经验。我在 Windows 上用过 nvm、npm 全局安装、独立脚本、corepack 各种方式折腾过 pnpm,最终的稳定组合是:用 Node 版本管理器管理 Node,用 corepack 管理 pnpm,在项目里固定 packageManager 字段。这个组合让我很少再遇到“版本对不上”的玄学问题。

第二个习惯是:所有新增依赖、切换依赖版本后,我都会先看一眼pnpm install的输出,重点关注是否有构建脚本被跳过、是否有警告提到 lockfile 变更。Windows 下很多问题不是立刻炸出错误,而是带着隐患持续运行,比如 store 目录越来越大、某个依赖被钉在了旧版本。

第三个习惯比较冷门:我对 Windows 的“文件锁”特别警惕。任务管理器、资源管理器这类看似无害的程序,实际上会持有 node_modules 中大量文件句柄。所以在需要做大版本依赖升级或删除 node_modules 时,我宁可把 IDE 彻底退掉,再在命令行里操作。看起来麻烦,但可以避免一半以上的 EPERM 问题。

最后给刚上手 Windows 原生开发的同学一个建议:遇到问题先别急着重装 Node、清空缓存,优先看环境变量和终端缓存。pnpm 在 Windows 上暴露的坑,绝大多数不是 pnpm 本身的问题,而是宿主环境对工具链的限制。用上面这些方法逐项排查,基本都能把问题收敛到很小范围内。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 5:18:45

Windows下pnpm踩坑全记录:从环境配置到项目实操

Windows Node pnpm,这套组合光看名字平平无奇,但真要在Windows上把它跑顺,踩坑记录能写满一整页。我在接手某跨平台桌面项目时,前后折腾了差不多两周,才从“装完环境就报错”切换到“每天愉快地装包、构建、发版”的…

作者头像 李华
网站建设 2026/10/22 5:18:44

微信小程序校园二手交易平台源码部署与二次开发实战

简介:这份资源是面向高校学生与编程初学者的微信小程序校园二手交易平台完整项目包,可作为毕业设计、课程设计或小程序入门实战的参考方案。包内共1411个文件,涵盖319个png界面素材、199个js逻辑脚本、148个vue页面组件、136个java后端代码、…

作者头像 李华
网站建设 2026/10/22 5:18:27

ARM架构欧拉系统部署国密签名服务实战指南

1. 为什么是“天宫之印”?——从命名逻辑看项目本质与设计意图看到“天宫之印服务器”这个名称,第一反应不是玄学,而是系统级工程的隐喻表达。它不指向某个具体品牌或商业产品,而是一类典型国产化替代场景下的技术代号&#xff1a…

作者头像 李华
网站建设 2026/10/22 5:18:26

数据库批量导出Excel方案:从高效取数到稳定性保障

如果有人让你“每天把某张业务表导出成Excel”,你的第一反应可能是:写个Python脚本连上数据库,pd.read_sql()一行查出来,再to_excel()一行存文件,完事。但当你真正接到这个需求,面对几千万行数据、几十个字…

作者头像 李华
网站建设 2026/10/22 5:18:14

链表分段:切分、重组与边界处理实战指南

你有没有遇到过这种场景:一条很长的链表摆在面前,业务要求每隔几个节点取一组处理,或者把所有符合某个条件的节点全部挪到链的前半部分。链表分段(List Section)就是专门处理这类问题的操作。它不是在删除节点&#xf…

作者头像 李华
网站建设 2026/10/22 5:17:27

AI反爬防护引擎的检测机制与接入配置解析

现在做商业反爬防护的,AI引擎基本成了标配。以前写个脚本、挂个代理池就能轻松拿数据的日子早就不在了,主流防护产品普遍上了机器学习模型,请求还没到业务服务器,边缘节点就已经完成了风险打分。这篇文章就以一款典型的商业化AI防…

作者头像 李华