当前位置: 首页 > 知识库问答 >
问题:

前端 - 一些库的子依赖,是不是我不用安装就直接可以用?

楚嘉胜
2023-05-20
    "node_modules/@reduxjs/toolkit": {
      "version": "1.9.5",
      "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz",
      "integrity": "sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==",
      "dependencies": {
        "immer": "^9.0.21",
        "redux": "^4.2.1",
        "redux-thunk": "^2.4.2",
        "reselect": "^4.1.8"
      },

今天我用immer的时候,发现没有安装成功也可以直接用,给我惊奇坏了,一搜索发现是redux的一个依赖,我粘贴的这段代码是package-lock.json不是package.json,package.json里面完全找不到immerjs,也就是说我根本没安装过。这种情况下,我就直接可以用immer,不用安装了,对把??事实是上可以的,我就是想要再确认一下,这种情况下有没有潜在的问题?还是跟安装之后再使用完全没有区别??

共有2个答案

郭麒
2023-05-20

的确,由于npm包的扁平化方式,所以在node_modules中所有包及包的依赖包会被拍平至顶层,所以你才可以不显式安装也可以访问,但是正是由于扁平化的方式,导致你引入的包的版本是不确定,这取决于你依赖的包中谁先安装,然后会以它依赖的那个版本为顶层包,这就是潜在的风险,所以现在有个包管理工具pnpm就禁止了这个行为,你没有依赖是访问不到的,我的建议是不要这么做。

麹浩瀚
2023-05-20

这个在依赖管理叫传递依赖。也就是A依赖B,B依赖C,隐含A依赖C,理论上A可以直接调用C提供的函数。

代码和执行层面没有问题,不过sonarlint默认规则会给你警告,认为是隐式依赖,你最好显式声明该依赖。这也是有一定道理的,因为隐式依赖并不由你控制依赖版本,可能因为你的依赖库升级造成你的依赖破坏

 类似资料:
  • 我在文件夹只有这个json文件,我npm i的时候他是最新的axios,但是pnpm i的时候他就是1.1.3版本,这是为什么 这个json文件时通过npm和pnpm分别构建的,我试过清除pnpm的缓存但是没有用,lock文件和node_modules都删除了,但是Pnpm安装的不是最新的

  • 我想知道我是否可以在任何web服务器上安装或使用Laravel PHP框架,而不必每次都使用Composer(PHP包/依赖关系管理器)? 我希望能够将我的应用程序放到任何web服务器上(就像不访问命令行的共享服务器)。 如果我第一次(本地)运行,那么所有依赖项都应该存在,对吗? 然后,我应该能够把它放到任何服务器上的所有文件(包括供应商目录)?

  • 我需要一个不可重入的读写锁,因为锁可能由获取它的线程以外的线程释放。(我意识到这一点时,我开始间歇性地获取非法监视器状态异常。) 我不确定不可重入是否是正确的术语。ReentrantLock允许当前持有锁的线程再次获取它。我不想要这种行为,因此我称之为“不可重入”。 上下文是我有一个使用线程池的套接字服务器。每个连接没有一个线程。请求可能由不同的线程处理。客户端连接可能需要在一个请求中锁定,在另一

  • react安装依赖包报如下图 大佬们这该怎么解决这个问题呢

  • 我有一个实体,它的字段可以是存储为字符串的整数,也可以是GUID。我根据字段是GUID还是整数执行不同的方法。如果值是GUID,则可以确保int.TryParse始终返回false。NewGuid()是否返回可解析的整数?