当前位置:首页 > 科技  > 软件

在前端中,什么是幽灵依赖?

来源: 责编: 时间:2024-04-22 09:15:59 241观看
导读前言大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心。幽灵依赖?前几天在公司的技术分享会上,我总是听到大佬们在提起一个名词——幽灵依赖,起初我没有太在意,以为这个不太重要,所

前言

大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心。fET28资讯网——每日最新资讯28at.com

幽灵依赖?

前几天在公司的技术分享会上,我总是听到大佬们在提起一个名词——幽灵依赖,起初我没有太在意,以为这个不太重要,所以就没怎么去了解这个名词。fET28资讯网——每日最新资讯28at.com

直到我在做项目pnpm迁移的时候,我突然很想知道它跟幽灵依赖到底有什么关系呢?fET28资讯网——每日最新资讯28at.com

其实在了解什么关系之前,我应该去了解一下什么是幽灵依赖,我们接着聊!!!fET28资讯网——每日最新资讯28at.com

什么是幽灵依赖?

比如我现在,我在开发一个项目A,项目A中我装了npm-lsx这个包,而这个npm-lsx的包依赖了npm-test,咱们来看看这两处packages.jsonfET28资讯网——每日最新资讯28at.com

依赖关系是:A <- npm-lsx <- npm-testfET28资讯网——每日最新资讯28at.com

// A/packages.json{  "name": "A",  "dependencies": {    "npm-lsx": "^1.0.0"  }}// A/node_modules/npm-lsx/packages.json{  "name": "npm-lsx",  "dependencies": {    "npm-test": "^1.0.0"  }}

node_modules规则

如果按照node_modules的规则的话,那么目录的结构应该是这样的fET28资讯网——每日最新资讯28at.com

node_modules├── npm-lsx |   └── node_modules|       └── npm-test

但是如果依赖关系很长的话,那么会导致目录深度非常深,所以我们常用的npm、yarn解决了这个问题fET28资讯网——每日最新资讯28at.com

npm、yarn

它们是怎么解决这个问题的呢?npm、yarn为了解决依赖关系过长时,导致的目录结构过深,采用了扁平化,也就是所有依赖都被拍平到node_modules目录下。这样的好处就是,不再有层级过深的问题。fET28资讯网——每日最新资讯28at.com

现在目录结构变成这样了fET28资讯网——每日最新资讯28at.com

// A/node_modulesnode_modules├── npm-lsx ├── npm-test

幽灵依赖

接着上面的示例,继续聊,请看下面的代码fET28资讯网——每日最新资讯28at.com

const lsx = require('npm-lsx')const test = require('npm-test')lsx()test()

你们觉得这段代码有问题吗?其实运行起来是没问题的。但是问题来了,我们项目中居然能直接引用npm-test这个包!!!fET28资讯网——每日最新资讯28at.com

我们都知道依赖关系是:fET28资讯网——每日最新资讯28at.com

A <- npm-lsx <- npm-testfET28资讯网——每日最新资讯28at.com

按理说,A是不能直接引用npm-test的,因为没有直接依赖关系啊!!!但是因为前面说了,npm、yarn会将依赖拍平在A的node_modules中,这导致了A可以直接require('npm-test')fET28资讯网——每日最新资讯28at.com

我们称这个npm-test为幽灵依赖!!!fET28资讯网——每日最新资讯28at.com

幽灵依赖的坏处?

某天 npm-lsx 不依赖 npm-test 了

已知你现在代码是这样fET28资讯网——每日最新资讯28at.com

const lsx = require('npm-lsx')const test = require('npm-test')lsx()test()

某天npm-lsx升级了!它不再依赖npm-test了!那么此时A的node-modules中变了!fET28资讯网——每日最新资讯28at.com

// 以前node_modules├── npm-lsx ├── npm-test// 现在node_modules├── npm-lsx

那么你的代码会报错!fET28资讯网——每日最新资讯28at.com

const lsx = require('npm-lsx')const test = require('npm-test') // 没有lsx()test() // 报错!!!

其实这个情况还好,因为这种情况在打包上线过程中就会报错依赖找不到了,所以不太会造成线上的报错崩溃fET28资讯网——每日最新资讯28at.com

多项目引用同一个幽灵依赖

我现在有两个项目A和BfET28资讯网——每日最新资讯28at.com

A中的node_modules目录为,现阶段npm-test的版本为1.0.0fET28资讯网——每日最新资讯28at.com

// A/node_modulesnode_modules├── npm-lsx ├── npm-test 版本号:1.0.0

A中某个文件的代码为fET28资讯网——每日最新资讯28at.com

const test = require('npm-test')test()

B中某个文件的代码为fET28资讯网——每日最新资讯28at.com

const test = require('npm-test')test()

当有一天npm-lsx所依赖的npm-test升级了!版本升级为了2.0.0fET28资讯网——每日最新资讯28at.com

// A/node_modulesnode_modules├── npm-lsx ├── npm-test 版本号:2.0.0

此时test的用法也变了~而因为A项目已经回归过了,所以他知道,也改了对应的代码fET28资讯网——每日最新资讯28at.com

const test = require('npm-test')test.run() // 修改代码

而B项目就没那么好运了,它并没有进行回归,所以并没有去改代码!!!!fET28资讯网——每日最新资讯28at.com

const test = require('npm-test') // 有test() // 直接报错

这就惨了,B项目在打包阶段并不会因为依赖不到npm-test而报错,所以它会顺利上线。。然后,等到了线上运行起来,直接报错!!!这是非常严重的的事故!fET28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-84468-0.html在前端中,什么是幽灵依赖?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 频繁切换v-show,不频繁使用v-if?面试的时候可别再这么说了!

下一篇: 美团一面:什么是CAS?有什么优缺点?我说我知道AtomicInteger

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己&ldquo;当家&rdquo;的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • 小米MIX Fold 3配置细节曝光:搭载领先版骁龙8 Gen2+罕见5倍长焦

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 三星显示已开始为AR设备研发硅基LED微显示屏

    7月18日消息,据外媒报道,随着苹果首款头显产品Vision Pro在6月份正式推出,AR/VR/MR等头显产品也就将成为各大公司下一个重要的竞争领域,对显示屏这一关
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top