深入解析:npm、yarn幽灵依赖问题

news/2025/10/6 16:47:12/文章来源:https://www.cnblogs.com/yxysuanfa/p/19127729

很好!我们来专门讲讲**幽灵依赖(Phantom Dependency)**是什么,以及为什么 pnpm 对该问题非常严格。


? 什么是幽灵依赖?

幽灵依赖(Phantom Dependency),指的是:

你在代码中使用了某个依赖包,但它并没有在当前项目的package.json“间接依赖”被安装到了 node_modules 中,导致你能用,但其实不应该能用。就是中声明,只

✅ 看个例子:

你的工程 package.json 是这样:

{
dependencies”: {
webpack”: “^5.0.0”
}
}

但你在代码中写了:

import lodash from ‘lodash’;

你没有显式安装 lodash,但项目里却能跑成功,因为 webpack 的某个插件内部依赖了 lodash,所以它“顺便”被装进 node_modules。

幽灵依赖:你没声明,框架却能跑。就是这就


? 为什么幽灵依赖是个大坑?

问题 说明

❌ 不确定性 有一天 webpack 不再依赖 lodash,你任务就炸了。
? 团队协作不可控 别人的机器跑不了,因为依赖缺失。
? CI/CD 出现诡异 bug 因为依赖未声明,构建环境装不全。
? 不符合模块化规范违反了“谁用谁声明”的原则。


? 不同包管理器的处理方式

工具 幽灵依赖能不能用? 原因

npm 可以 扁平结构,默认能访问“上层”依赖。
yarn 可以 结构跟 npm 类似,默认不阻止。
pnpm ❌ 不允许 模块是“严格隔离”的,你没声明就不能访问。

? pnpm 的完成方式:

pnpm 的 node_modules 是使用 符号链接(symlink)+ 嵌套结构 搭出来的,你只能访问你自己声明的依赖。

比如:

/node_modules
└── lodash -> 只有你明确写了才会在这出现

否则你访问会直接报错:

Cannot find module ‘lodash’


✅ 怎么避免幽灵依赖?

  1. ✅ 安装时务必用 pnpm add xxx 或 npm install xxx 明确声明;

  2. ✅ 在代码检查时结合工具,比如:

ESLint 插件 import/no-extraneous-dependencies

TypeScript设置 noImplicitAny, esModuleInterop 等


? 小结一句话:

能帮你自动规避这个坑。就是幽灵依赖 = 看得见用得上,看不见 package.json,极易出问题; pnpm 的最大好处之一,就


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/929515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

营销网站的案例分析wordpress用图床好还是

在快节奏的现代生活中,个人债务问题似乎已成为许多人不得不面对的挑战。正确处理个人债务,不仅关系到个人信用和财务状况,更是实现财务自由的重要一步。本文将为您提供一些实用的建议,帮助您优雅地解决个人债务问题,走…

10.6 模考 T4(QOJ 1836)

题意:给定 \(n\) 个点 \(m\) 条边的无向图,定义“花”为一个拥有 \(4\) 个结点的导出子图,这个导出子图有 \(1\) 条边或 \(5\) 条边。定义“叶”为一个拥有 \(4\) 个结点的导出子图,这个导出子图有 \(3\) 条边,且…

iTunes 无法备份 iPhone:10 种解决方法 - 详解

iTunes 无法备份 iPhone:10 种解决方法 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

实用指南:【Node.js 深度解析】npm install 遭遇:npm ERR! code CERT_HAS_EXPIRED 错误的终极解决方案

实用指南:【Node.js 深度解析】npm install 遭遇:npm ERR! code CERT_HAS_EXPIRED 错误的终极解决方案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

关于调和级数估算前n项的和

我们要估算 \(\displaystyle\sum^n_{i = 1}\dfrac{1}{i}\)。 我们知道 \(\displaystyle\sum^n_{i = 1}\dfrac{1}{i}\approx \int_1^n\dfrac{1}{i} = (\ln\left|i\right|)\bigg |^n_1 = \ln n - \ln 1 = \ln n\)。 因此…

专业的网站优化黑马前端学费多少

CCIE理论-第五篇-SDA-2 DNA Center 展示一下web的界面哈 其实就类似平时弄的web的防火墙呀,其他设备等 弹性子网 这一章来讲讲弹性子网 stretched subnets allow an ip subnet to be :stretched:vla the overlay 拉伸子网允许通过覆盖“拉伸”IP子网1基于主机IP的流量…

Windows install RabbitMQ via PowerShell via administrator role

//Run PowerShell as Administrator role //Run below commands respectively //First command Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.N…

Windows漏洞利用技巧:虚拟内存访问陷阱(2025更新)

本文详细介绍了在Windows系统中构建虚拟内存访问陷阱的技术方法,重点分析了Windows 11 24H2新特性如何让攻击者能够利用本地SMB服务器进行内存访问延迟攻击,为利用TOCTOU类型内核漏洞提供了新的攻击向量。Windows漏洞…

北京单页营销型网站tp3企业网站开发百度云

1 概述 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只适用于单线程环境,多线程环境可以采用并发包下的concurrentHashMap HashMap 实现了Serializable接口&#x…

深圳福田站网站用户体验模型

Flutter开发过程中,对于视频播放的三方组件有很多,在Android端适配都挺好,但是在适配iPhone手机的时候,如果设置了UIInterfaceOrientationLandscapeLeft和UIInterfaceOrientationLandscapeRight都为false的情况下,无法…

Python编译期优化:隐藏在代码背后的效率魔法

Python编译期优化:隐藏在代码背后的效率魔法 Python常被认为是解释型语言,但实际上它采用了"编译→解释"的混合执行模式。在将源代码转换为字节码的编译阶段,Python解释器会进行一系列优化,显著提升程序…

网站文件夹名百度推广关键词怎么设置好

参考:基于知识库和 LLM 的问答系统经验分享 - 知乎 (zhihu.com) 一、基于LLM的问答系统架构 比较常见的开源 LLM 的问答系统都会遵循下图这种结构去进行设计: 加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本…

无需安装的Photoshop:网页版完整使用指南与在线图片编辑技巧

​ 你还在为安装庞大的Photoshop软件而烦恼吗?面对几百兆的安装包、繁琐的配置流程,确实让人头疼。特别是当你只是偶尔需要修个图、换个证件照背景,或是简单处理头像时,真的不必大费周章安装一个“重量级”应用。今…

求阶

阶:满足 \(x^{k}\equiv 1(\text{mod}\ p)\) 的最小 \(k\)。 首先,若 \(x\not\perp p\),则无解。 令 \(f(k) = x^k\mod p\) 若有解,则由费马小定理知,\(k = p - 1\) 是 \(f(x) = 1\) 的一个解。 令其最小解为 \(k_…

wordpress 网站显示加载时长网站 公司形象

本文由178论坛会员:东东呛 转载,如果你是原作者请联系我们,我们会对原创作者给予奖励。(当然您也可以在评论回复表达看法,但是论坛会有更丰富的奖励哦。)朵朵快满级了~~~由于内测只开到50级~~~可还剩下一堆任务~所以刷怪刷到49级半…

常见的网站开发语言建设网站需要什么硬件

当我们使用Cocoa的视图的时候,我们必须继承NSView或者UIView并且重载函数drawRect:来显示任何内容。但是CALayer实例可以直接使用,而无需继承子类。因为CALayer是一个键-值编码兼容的容器类,你可以在实例里面存储任意值,所以子类实…

赛前训练 5 树形 dp

A 做树形 dp 时,尝试将题目转化为只考虑子树内. 对于这个题,因为起点到终点的路径总能拆成 起点 -> LCA -> 终点 的形式,所以我们考虑枚举 LCA 进行 dp.为了使汽油量最大,我们维护 \(dp_i\) 表示子树内跑到 \(i\…

新乡网站建设制作公司青岛谁家做网站

前言 最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到各种问题,在解决问题的过程中学到不少和运维相关的知识。 本篇博客介绍SpringCloud相关组件——nacos和sentinel的安装和配置,并分析了运行内存情况,此…

制作网站的素材wordpress登录

接上文~一、淘宝之前的大佬们是怎么试错的?我们看看在淘宝之前的大佬们是怎么试错迭代产品的。都知道飞机是莱特兄弟发明的,但很少有人知道为什么是他们。在内燃机发明后的很长一段时间内全球各地发明家都在投入研究飞机,莱特兄弟相对于其他竞争者&…

短网址网站建设兰州网络推广排行

9、电路综合-基于简化实频的任意幅频响应的微带电路设计 网络综合和简化实频理论学习概述中的1-8介绍了SRFT的一些基本概念和实验方法,终于走到了SRFT的究极用途,给定任意响应直接综合出微带电路。 1、任意幅频响应的微带电路设计用途 我们演示了采用…