创建Next.js应用遇npm弃用警告,切换Yarn解决求原因解析
问题背景
使用npx create-next-app@latest .创建Next.js 14.2.5项目时,收到一系列npm弃用警告:
npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm warn deprecated @humanwhocodes/config-array@0.11.14: Use @eslint/config-array instead
npm warn deprecated rimraf@3.0.2: Rimraf versions prior to v4 are no longer supported
npm warn deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
npm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported
这些警告不影响项目运行,但通过CLI添加Sentry时仍会弹出,尤其是inflight@1.0.6。尝试过安装警告推荐的包、将eslint版本从^8升级到^9,并执行npm install、npm install --force、npm install --legacy-peer-deps等操作,均无法消除警告。切换到Yarn后,警告完全消失。
核心原因:npm与Yarn的依赖解析逻辑差异
这些警告均来自项目的深层传递依赖(不是你直接在package.json中声明的包),Yarn和npm的依赖处理逻辑差异导致了结果不同:
版本选择策略不同
npm的依赖解析算法在处理嵌套依赖时,可能会保留满足版本范围的旧版包。比如inflight@1.0.6是glob@7.x的依赖,npm可能因为依赖树的嵌套关系,仍选择旧版glob,从而带出弃用的inflight;而Yarn会优先选择兼容的最新可用版本(比如glob@9+),从根源上避免引入已弃用的依赖。Peer依赖处理更严格
升级eslint到v9时,npm的peer依赖处理可能没有完全替换掉旧的eslint相关依赖(如@humanwhocodes/config-array);而Yarn会严格匹配新版本eslint的peer依赖要求,自动使用替代包(如@eslint/config-array),因此不会触发弃用警告。缓存与安装行为差异
npm的缓存机制可能复用了之前下载的旧版依赖包,即使重新执行安装也不会主动替换;Yarn的缓存管理更倾向于拉取符合当前依赖树的最优版本,减少旧包被复用的概率。
需要注意:直接安装警告中推荐的包无法解决问题,因为这些弃用包是深层依赖引入的,只有依赖的上游包更新版本,或者包管理器选择更优的依赖版本才能消除警告。
内容的提问来源于stack exchange,提问作者Rendo Hugh Mann Sama

