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

    "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,不用安装了,对把??事实是上可以的,我就是想要再确认一下,这种情况下有没有潜在的问题?还是跟安装之后再使用完全没有区别??

阅读 4.1k
4 个回答

不要在项目中使用幽灵依赖,项目中使用的第三方包都应该显式的在 package.json 中指明。

使用幽灵依赖会导致:
如果有一天 redux 发布了一个 patch 版本,并且将 immer 从 redux 的依赖列表中删除,那么你的项目将不能正常启动。

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

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

当然你自己确定没问题直接引用也不会有执行问题

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题