资讯动态

LONGER问题全解析:从pnpm弃用到Windows长路径

发布时间:2026/9/8 17:16:32 来源:尧图企业网站定制
1. LONGER不是一个Bug而是四件每天都在发生的事1.1 上周复现的真实场景升级依赖之后的整屏警告上周五下午我把一个躺了大半年的老项目重新拉起来改需求。准备开工第一件事就是升级依赖结果pnpm install一跑终端里呼啦冒出一大片警告最显眼的一条长这样pnpm dev [warn] the pnpm field in package.json is no longer read by pnpm. the following keys were ignored: pnpm.overrides. see https://pnpm.io/settings for the new home of each setting.同一屏里还混着 node-sass 的 deprecation 报错、某个在线工具提示 this client is no longer supported、以及 Windows 同事发来的长路径截图。我盯着满屏英文突然意识到这些看似八竿子打不着的报错背后全是一个词LONGER。不是指某个具体 Bug而是工程世界里普遍存在的四类更长问题支持链路不再更长的 no longer、任务执行比预期更长的 takes longer、文件路径超过 260 字符的 longer than 260、以及项目生命周期里那些还能撑多久的隐性倒计时。这篇文章就把这四类问题一次性捋清楚包括每类问题的成因、现场现象、解决步骤和避坑经验。内容不挑技术栈前端、后端、客户端方向都能用得上尤其适合那种长期维护老项目、经常被依赖升级和系统限制折磨的开发者。1.2 先把LONGER拆成四个看得懂的工程问题我第一次把这几条报错放在一起时本来想用过时变慢超长三个词归纳一下但聊着聊着发现不对它们对应的根本不是同一类问题处理方式也不能混着来关键词实际含义典型案例处理思路no longer功能或接口被移除旧写法失效pnpm 不再读 package.json 里的 pnpm 字段迁移配置到新位置deprecated官方认为该方案过时但暂未删除node-sass 被标记为废弃替换为现代方案takes longer性能退化等待时间变长AI 编码工具响应缓慢定位瓶颈并优化longer than 260受系统限制路径超长无法工作Windows 无法访问深层目录开启系统长路径支持这四个象限看起来互不相干但如果你在同一个项目里待得够久大概率会依次撞上。而且它们都有一个共同点报错信息往往只是警告级别不会立刻让构建挂掉于是很多人选择无视直到某个深夜发布前突然演变成 Error。下面我按这个框架把每个象限都拆开讲清楚。2. No Longer家族旧习惯集体失效的现场还原2.1 pnpm v10 不再读取 package.json 里的 pnpm 字段完整迁移步骤先处理最关键的 pnpm 警告。pnpm 在 v10 之前允许在 package.json 里写一个pnpm字段用来放overrides、packageExtensions、patchedDependencies、onlyBuiltDependencies这些配置。很多人图省事把它当默认配置位用了好几年比如{ name: legacy-project, version: 1.0.0, scripts: { dev: vite --port 5173 }, pnpm: { overrides: { lodash: ^4.17.21, minimist: ^1.2.8 } } }从 pnpm v10 开始这个字段直接不读了配置必须挪到项目根目录的pnpm-workspace.yaml里。我第一次看到警告时以为只是元数据校验问题结果pnpm run dev一切正常但pnpm install之后发现 lodash 根本没被 override 到指定版本依赖还是旧的——这就是配置静默失效最坑的地方警告不会让你构建失败但行为已经悄悄变了。迁移其实很简单两步第一步在项目根目录创建pnpm-workspace.yaml没有就新建packages: - . overrides: lodash: ^4.17.21 minimist: ^1.2.8第二步把 package.json 里的pnpm字段整体删掉。这样 pnpm install 就不会再报这个 warn 了。为什么 pnpm 要这么做原因是配置归属的单一真相源问题。package.json本质上是描述包依赖与元信息的文件而 pnpm 的偏好设置属于项目管理配置把它们塞进 package.json 会让各种工具对同一个文件的解析规则产生混淆。把设置统一挪到pnpm-workspace.yaml之后编辑器、CI、其他脚本都能用同一份文件识别工作区和配置语义更干净。官方在警告里给出的地址https://pnpm.io/settings就是完整的配置迁移对照表如果项目里用到的配置不止 overrides挨个对照着挪就行。这里提个容易漏的细节很多老项目把onlyBuiltDependencies用来白名单化构建脚本的包也写在pnpm字段里。迁移时漏掉这一项安装时就会看到 pnpm 询问是否允许某个包执行 postinstall 脚本CI 里还会因为交互式提示直接卡住。所以迁移完建议执行一次pnpm install把脚本确认类的问题一并处理掉。2.2 node-sass 的黄昏为什么必须换掉它同样是旧习惯失效node-sass 的情况更典型。我那台老项目的依赖树里有node-sass4.14.1一遍又一遍地刷警告DeprecationWarning: node-sass4.14.1 is deprecated: Node Sass is no longer supported.这条警告从几年前就开始出现了到现在依然有成千上万的项目还在用。原因不难理解node-sass 底层是 LibSass用 C 实现的 Sass 编译器二进制版本必须跟着 Node 的 ABI 走每升级一次 Node 就要重新下二进制、重新编译。如果项目里再牵扯到私有镜像源缺包、内网环境禁止下载装一次能折腾一下午。更重要的是功能层面LibSass 已经停止维护而 Dart Sass 成了官方唯一的实现新语法比如use、forward以及math.div代替/做除法只在 Dart Sass 里可用。只要你的代码还写着import或者用/做除法node-sass 也许还能凑合跑但一旦依赖链里某个包升级SCSS 语法兼容性立刻暴露问题。我的建议是长痛不如短痛直接把 node-sass 换成 sassDart Sassnpm uninstall node-sass npm install -D sass然后处理三处常见语法差异import改成use/forward避免全局变量互相污染。/除法改成math.div(a, b)记得use sass:math;。rgba(..., 0.5)这类老写法逐步迁移到color-mix()或现代色值函数。替换完成后用npx sass --version确认生效再跑一遍完整构建。实测一个中等规模项目替换后构建时间基本持平但团队以后不会再被 Node 版本升级绑架。唯一要注意的是如果项目里深度依赖了 node-sass 的render同步 API 做自动化脚本需要把调用方式同步改成 sass 的异步接口。2.3 在线服务也有生命周期从 Teams 和 Gemini 的退出提醒说起还有一类 no longer 不在代码里而在你依赖的在线服务上。前两天我同事打开某协作工具的免费版弹出一条公告免费个人版不再可用另一个同事则是在某个 AI 工具里看到 this client is no longer supported 的登录失败提示。这两条消息放在一起看很有意思免费个人版和某个老版本客户端都属于服务方主动终结支持。原因一般不外乎三点免费版商业模式扛不住、维护成本过高、以及为了强制用户迁移到新版。对普通用户来说只是换个入口但对把这类服务接进自动化脚本、机器人流程的开发者来说这就是一次不折不扣的 breaking change。我的经验是接到这类no longer通知后不要只看第一行要往下翻到底确认三件事服务停止的具体日期以及有没有宽限期。官方提供的替代方案是什么数据能不能迁移、怎么导出。你正在用的 API 或集成是否有对应的新版端点鉴权方式有没有变。把这些信息记到项目 README 或运维文档里比转发到群里让大家各自留意可靠得多。任何在线服务的使用周期都不由你控制唯一能做的就是在周期终结前给自己留好退路。特别是那些接入了 Webhook、定时同步脚本的项目建议在服务停用前一周就把切流方案演练一遍别等到服务真的断掉才发现数据导不出来。3. Takes Longer当工具比预期更慢怎么定位真正的原因3.1 AI 编码工具卡顿的真相慢在四个环节No longer 处理完接着就是另一个更让人抓狂的 longer工具跑得比预期慢。很多人应该都遇到过 AI 编码工具在生成代码时盯着光标等了十几秒心里已经默认它卡死了。实际上这几个月我用下来发现它的耗时基本由四段组成请求排队、模型推理、响应流式返回、以及编辑器本地渲染。其中大部分项目根本轮不到模型推理就已经慢了。比如打开一个巨大的 monorepo编辑器在后台做全量索引CPU 被打满你再发一个补全请求本地渲染和补全请求去抢线程于是观感就是转圈转了半天。想确认是不是本地索引拖后腿一个简单办法是打开任务管理器看编辑器进程 CPU 是否长时间处于高位同时观察界面右下角的索引进度状态。如果索引持续好几个小时就要考虑减少它的扫描范围了。3.2 定位慢工具的通用排查顺序不仅仅是 AI 编码工具任何takes longer than expected的开发工具我都会按同一套顺序排先看是不是全局性的。重启编辑器后如果立刻变快说明是会话期的缓存堆积如果重启也慢进入下一步。看资源占用。CPU、内存哪个被打满对应到是索引、编译还是同步任务。在 macOS 上用活动监视器在 Windows 上用任务管理器重点看进程名对应的线程数变化。看网络。工具如果依赖远程服务先 ping 或看请求日志确认是不是服务端响应问题。这一步很容易被忽略很多人以为是本地问题折腾半天结果发现是公司出口带宽或者代理配置的问题。缩小范围。把项目拆小、把某些目录排除看慢的是不是某一类特定文件。比如只慢在.md文件可能是 Markdown 预览插件的问题只慢在大型 JSON可能是语法高亮解析的问题。以编码工具为例最有效的一招是加忽略规则。像.cursorignore这类文件作用跟.gitignore类似可以排除掉node_modules、dist、.next等生成目录让索引器专注在真正要改的业务代码上。加完之后索引体积能砍掉一大半补全速度体感明显提升。3.3 一个降低等待感的实际配置组合这里分享一个我现在一直在用的组合方案适用于大部分 AI 编码工具和前端项目在.cursorignore或等效文件里排除node_modules/、dist/、build/、.git/、coverage/。把 monorepo 中不常改的包子应用单独排除只保留当前工作包。避免一次性吞入过大的上下文提问时明确指定文件而不是丢一整包路径让它自己找。后台自动更新关闭避免它趁你写代码时偷偷下载新版本。这一套做完响应速度通常会有可感知的提升。如果还慢再考虑是不是要换更好的硬件或者换轻量模式。另外有个容易被忽略的细节如果你开着多个项目的窗口每个窗口都在做索引内存占用是叠加的。我习惯只开当前工作的窗口其余项目窗口关掉索引线程数立刻降下来。4. 突破 260 字符Windows 长路径实战4.1 MAX_PATH 的前世今生No longer 和 takes longer 都处理完了最后聊一个最物理、最直接的限制Windows 上路径长度不能超过 260 字符。这个数字来自 Windows API 里的MAX_PATH常量是早期文件系统设计的产物。当年硬盘那么大点目录嵌套十几层已经很夸张了260 字符绰绰有余如今在node_modules这种生成目录面前260 字符就是个笑话。我在老项目上经常碰到这种情况pnpm install装到一半报ENAMETOOLONG或者 Git 拉代码时提示Filename too long甚至某些 Windows 工具直接拒绝访问一个明明存在的文件。根因都一样完整绝对路径超过 260 字符。这个问题虽然历史悠久但 Windows 10 1607 之后的版本已经内置了长路径支持只是默认关闭需要我们手动打开。很多人不知道这个开关白白被这个限制折磨很多年。4.2 三步开启 Win32 长路径支持开启方式并不复杂按下面三步来第一步修改注册表。在开始菜单搜索注册表编辑器打开后定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem找到LongPathsEnabled这个 DWORD 值双击把数值数据从 0 改成 1点确定重启系统。如果没有这个值就在右侧空白处右键新建 DWORD32 位值命名为LongPathsEnabled再改成 1。第二步确认组策略同步开启。有些精简版系统注册表改了但策略没放行保险起见在运行框输入gpedit.msc打开组策略编辑器找到计算机配置 → 管理模板 → 系统 → 文件系统 → 启用 Win32 长路径把它设为已启用。第三步验证是否生效。重启后打开 PowerShell执行(Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem).LongPathsEnabled返回1就说明成功了。之后访问超过 260 字符的路径就不会再被系统层拦截。需要提醒的是注册表和组策略只是系统允许具体的应用程序还得声明自己支持长路径。Windows 自带记事本、新版资源管理器都能处理长路径但第三方老工具不一定。所以改了系统设置不等于所有程序都能访问超长路径这一点务必要有预期。4.3 开启后仍要处理的三个配套项除了系统开关我建议顺手做三件配套的事避免后续反复踩坑。第一件给 Git 开长路径。在 Git Bash 里执行git config --global core.longpaths true这样仓库内出现超长路径时Git 不会直接拒绝 checkout。很多团队在 Windows 上拉完代码后发现某些文件不翼而飞其实就是 checkout 时被静默跳过了开了这个配置才能避免。第二件给 Node 项目配置缓存目录。npm 和 pnpm 的全局缓存路径通常都在用户目录下用户名一长缓存路径也跟着长。可以通过设置环境变量把缓存挪到短路径下比如npm config set cache D:\.npm-cachepnpm 同理在.npmrc里配置store-dirD:\.pnpm-store这一步对 CI 环境尤其有用。很多 Windows 构建机因为用户目录层级深硬生生把安装路径堆到了 260 字符随手改个短路径构建成功率能提升一大截。第三件重新审视项目目录结构。源文件路径尽量短比如src/components/ui/buttons/primary而不是src/app/features/ui/core/components/buttons/primary-submit-button。长路径系统支持打开了但短路径依然是成本最低、最稳的做法。团队里如果还有人用旧系统短目录能让所有人都少碰一鼻子灰。另外npm 生态里很多老包对长路径支持仍然不佳路径短一截兼容性问题就少一截。5. 面对 LONGER 类问题我沉淀的排查清单5.1 先完整读警告再动手搜处理了这么多年 LONGER 类问题我最深的体会是大多数人包括以前的我看到报错第一反应是复制粘贴去搜索引擎或者直接去问 AI。但 pnpm 那条警告里其实已经写清楚了——字段被忽略、键名是什么、官方设置文档在哪里。node-sass 那条也一样deprecation 信息里直接说了 no longer supported。所以我现在的习惯是先不搜先把报错完整读三遍。确认三件事这是 error、warn 还是 deprecation 提示影响构建还是只影响体检消息里是否带了官方文档 URL消息里是否指定了具体的包名、版本号、配置键名把这三个信息抓出来再动手效率至少翻一倍。很多报错根本不需要搜索引擎答案就在报错信息本身。5.2 按错误信息里的 URL 去找官方迁移指南稍微老练一点的同学会发现新版工具在废弃旧功能时几乎都会在警告里附带官方文档链接这是处理 no longer 类问题最权威的入口。pnpm 那条警告的 URL 是https://pnpm.io/settings打开就是完整的设置迁移对照表。我的建议是把这些 URL 存进项目的docs/目录或者 README 里不要只存在终端历史里。等下一次有人遇到同样问题直接把链接甩过去就是最好的团队沉淀。这块的收益是复利式的每解决一个问题项目里的防御性文档就厚一层后面新成员上手踩坑的概率就低一截。另外还要注意一个细节报错信息里的 URL 所指向的文档可能和当前版本不完全一致。访问时如果看到 latest 字样最好确认一下页面里标注的版本号别拿新版的说明去适配旧版配置。有些工具会在文档页提供版本切换器切到跟项目匹配的版本再看。5.3 给老项目做一次去 LONGER 化体检最后如果你手里也有那种躺了很久的老项目我推荐花一个下午做一次去 LONGER 化体检。我自己的固定流程是执行pnpm outdated或npm outdated看依赖是否大版本落后。全局搜报错信息里常见的 deprecated、no longer 字样范围包括package.json、构建日志、CI 输出。检查构建日志里有没有非致命的警告这些最容易被人无视也最容易被忽略到某一天突然变成 Error。检查有没有把配置塞在已经不再被读取的位置比如旧版 pnpm 的 package.json 字段。如果用了在线服务翻一下官方公告确认没有临近的生命周期终结。这套体检不保证让项目变成最新最酷但能保证它在下一次被拉起来改需求时不需要再花一个下午处理满屏的 LONGER 警告。我做过很多次类似清理最快的一次只花了四十分钟却省下了后面整整一周的返工时间。最后再分享一个习惯我现在处理任何报错都会先在本地新建一个notes/文件把报错原文、解决步骤、官方链接一并记下来。等这类问题第三次出现时我就能直接翻笔记而不是又从头搜一遍。这大概是面对所有 no longer、takes longer、longer than 260 类问题最省时间也最稳妥的做法。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价