首先我们在仓库 test 中 npm init 一个 package.json,然后 npm install react@16.13.1,此时 node_modules 的目录结构如下:

testnode_modules|    prop-types@15.6.2|    react@16.13.1

我们再安装一下 prop-types@15.5.0,此时的依赖图如下:

testnode_modules|    prop-types@15.5.0|    react@16.13.1node_modules|    prop-types@15.6.2

我们会发现

1、由于 npm 会扁平化的安装依赖,所以 prop-types@15.5.0 会安装到顶级 node_modules中。

2、由于顶级 node_modules 已经有了 prop-types@15.5.0,所以 react 内部所依赖的 prop-types@15.6.2 会安装在 react 内部的 node_modules 中。

假如我们再安装一个 react-xxx@3.1.0,他依赖于 prop-types@15.5.0 和 react@16.12.0,所以,此时的 node_modules 结构图如下:

testnode_modules|    prop-types@15.5.0|    react@16.13.1node_modules|    prop-types@15.6.2|    react-xxx@3.1.0node_modules|    react@16.12.0

我们发现

1、npm 在安装依赖时,首先在顶级 node_modules 下安装了 react-xxx@3.1.0 由于 prop-types@15.5.0 和顶级 node_modules下 的 prop-types 版本相同,所以不再单独安装。2、由于 react 和顶级 node_modules 下的 react 版本不一致,所以在自己 node_modules 内部单独安装 react@16.12.0

如果有其他安装包,以此类推。。。。

注意,在 package.json 中指定一个特定版本依赖是不够的,因为你希望确保最终用户获得完全相同的依赖关系树,包括其所有子依赖关系。而 package.json 中的一个特定版本保证只会发生在顶层。

在 package.json 文件只能锁定大版本,也就是版本号的第一位,并不能锁定后面的小版本,你每次 npm install 都是拉取的该大版本下的最新的版本,为了稳定性考虑我们几乎是不敢随意升级依赖包的,这将导致多出来很多工作量,测试/适配等,所以 package-lock.json 文件出来了,当你每次安装一个依赖的时候就锁定在你安装的这个版本。

注意,当需要移除 package-lock 再生成一份的时候,或者直接执行 npm install,如果 npm 包发布了新的版本,这个时候 package-lock.json 就会发生改变,安装的依赖就自动被升级了。

npm是如何处理依赖关系的相关推荐

  1. rcp(插件开发)插件B需要引用插件A中的jar包-如何处理依赖关系

    如果插件B需要引用插件A中的jar 通常需要以下几步: 1.插件B要依赖插件A 2.在插件B的build path中添加插件A的jar包 3.插件A的runtime导出插件B中使用jar的packag ...

  2. npm package.json文件中的依赖关系,devDependencies和peerDependencies之间有什么区别?

    本文翻译自:What's the difference between dependencies, devDependencies and peerDependencies in npm packag ...

  3. 流行的 NPM 包依赖关系中存在远程代码执行缺陷

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 专栏·供应链安全 数字化时代,软件无处不在.软件如同社会中的"虚拟人",已经成为支撑社会正常运转的最基本元素之一,软件的安全 ...

  4. npm 查看指定 package 的依赖关系

    npm 查看指定 package 的依赖关系 npm ls lodash 在 pnpm 中使用方法是 pnpm why lodash

  5. 如何处理好依赖关系[Reprint]

    Source: http://book.csdn.net/bookfiles/383/10038314337.shtml "依赖"是和"变化"紧密联系在一起的概 ...

  6. npm 包与模块关系 下载使用包 init命令 package.json文件 node_modules文件夹 全局安装包和本地安装包 开发依赖和生产依赖

    npm 了解npm npm 全称Node Package Manager(node 包管理器),它的诞生是为了解决 Node 中第三方包共享的问题. npm 不需要单独安装.在安装Node的时候,会连 ...

  7. python与linux关系_如何处理Linux / Python依赖关系?

    由于缺乏对我想使用的一些库的支持,我将一些 Python开发从Windows转移到Linux开发.我已经花了大部分时间搞乱了依赖关系. 问题 每当我拿起Linux,我通常会遇到一些依赖问题,通常是开发 ...

  8. linux与python什么关系,如何处理Linux / Python依赖关系?

    由于缺乏对我想使用的一些库的支持,我将一些 Python开发从Windows转移到Linux开发.我已经花了大部分时间搞乱了依赖关系. 问题 每当我拿起Linux,我通常会遇到一些依赖问题,通常是开发 ...

  9. 查看依赖树_Python中的依赖关系处理

    对许多人来说,依赖关系是一场噩梦.一些人甚至认为它们是技术债务.管理你的软件的库列表是一种可怕的体验.自动更新依赖项?-这听起来像是在说胡话. 请继续关注我,因为我将帮助你更好地掌握一些你在实践中无法 ...

最新文章

  1. 怎样使用Spring Boot项目的单元测试
  2. 【FFmpeg】FFmpeg 相关术语简介 二
  3. SolrPerformanceFactors--官方文档
  4. 白话Elasticsearch06- 深度探秘搜索技术之手动控制全文检索结果的精准度
  5. ASP.NET文件操作收藏
  6. 根据变量值取得变量的参数名
  7. 表格下拉_【职场充电】要说制作一个漂亮的表格,高手都爱WPS
  8. Segment Tree Beats 区间最值问题
  9. linux 蓝牙攻击,研究人员担心BleedingTooth蓝牙漏洞给Linux系统带来风险
  10. tree(nyoj)
  11. 已经不需要司机的Waymo无人车,何时才能摆脱后座待命的工程师?
  12. SpringMvc_@RequestMapping设置Router Url大小写不敏感
  13. 对FT证券系统故障的分析与思考
  14. js中鼠标事件mouseover、mouseenter和mouseleave、mouseout的区别
  15. 【图形学】我理解的伽马校正(Gamma Correction)
  16. 前端框架 — Bootstrap
  17. sin n次方 x 的降幂公式
  18. optaplanner学习笔记(十)约束配置:动态调整约束权重
  19. Eclipse:解决Eclipse看不了java的源码
  20. 九、redis的删除机制

热门文章

  1. 国行 iPhone 12/Pro/Max双卡模式支持5G网络;支付宝推出「晚点付」功能;MySQL 8.0.22 GA|极客头条
  2. 推动隐私计算技术,360数科提出分割式神经网络框架
  3. 致远互联携手华为云启动开发者大赛,加速企业应用定制向平台生态转型
  4. 程序员的自我救赎,GitHub 摸鱼神器一览
  5. 朱广权李佳琦直播掉线,1.2 亿人在线等
  6. 曾遭周鸿祎全网封杀的 360 猛将 :草根打工到 36 岁身家上亿的逆袭!
  7. 图灵奖公布!计算机图形学先驱 Hanrahan 和 Catmull 获奖,祝贺两位好莱坞 3D 动画大片技术元老...
  8. Wi-Fi 6 爆发的 2019
  9. 真的,关于 Kafka 入门看这一篇就够了
  10. 大数据时代已来,开发者该如何出击?