• node_modules包路径查找规则,依赖版本生效规则


    规则

    1. 如果导入的模块不是nodejs的内置模块,如fs(文件读写模块),path(路径模块),http(服务器模块),也不是以/,…/ 或者./ 开头的本地模块,而是第三方模块(通过npm下载的模块)
      那么nodejs会尝试从当前模块所在目录开始,尝试在它的 node_modules 文件夹里加载相应模块,根据模块的package.json来加载对应的模块;如果没有找到,那么就再向上一级目录移动,查找上一级目录的node_modules下有无对应的模块,直到文件系统的根目录为止。

    例如,假设在 /root/home/user/bottomBar/index.js 文件里调用了:

     import bar from  'bar.js' 
    
    • 1

    那么 nodejs 查找其位置的顺序依次为:

    /root/home/user/bottomBar/node_modules/bar.js
    /root/home/user/node_modules/bar.js
    /home/node_modules/bar.js
    /root/node_modules/bar.js
    /node_modules/bar.js

    若果追踪到文件系统的根目录也没有找到对应的依赖,那么nodejs就会找不到对应模块的报错。

    案例1:
    安装的模块里又引用了其他的模块,这个模块会按照规则先在自己的node_modules里查找它自己引用的模块,找不到再向上查找。

    简而言之,当前的模块的node_modules找到了自己的依赖里使用的这个包,就不会再向上查找了,所以你即使在最外层的模块里加载了最新的这个包,那么它也不会生效。

    这里我们以react脚手架工具自动构建的空项目举例。
    在这里插入图片描述

    在这里插入图片描述
    就拿clean-stack这个模块来说
    在这里插入图片描述
    我们的_aggregate-error模块内部使用的是2.2.0版本
    即使你在项目最外层的package.json里引入了2.2.0以上的版本,那么它并不会被向上加载到。

    案例2:
    当多个同级模块都引入了同一个模块,但它们的版本不一样。模块之间是互相独立的,他们都会在它自身的node_module里先找,如果都找到了,那他们所用的模块确实是不同版本的。如果没找到就会向上查找。

    至于模块版本安装的规则* ^ ~ 以及锁定版本,可以先基础的了解下:

    1. *意味着安装最新大版本的依赖包
    2. ^ 指的是只要不修改 [major, minor, patch] 三元组中,最左侧的第一个非0位,都是可以的
    ^1.2.3 匹配 >=1.2.3 < 2.0.0
    
    ^0.2.3 匹配 >=0.2.3 <0.3.0
    
    ^0.0.3 匹配 >=0.0.3 <0.0.4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. ~ 简而言之就是允许修改最后一位被指定的版本号
    ~1.2.3 匹配 >=1.2.3 <1.3.0
    
    ~1.2 匹配 >=1.2.0 <1.3.0 (Same as 1.2.x)
    
    ~1 匹配 >=1.0.0 < 2.0.0
    
    ~0.2.3 匹配 >=0.2.3 <0.3.0
    
    ~1.2 匹配 >=1.2.0 <1.3.0 (Same as 0.2.x)
    
    ~0 匹配 >=0.0.0 < 1.0.0(Same as 0.x)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 不带标志,1.2.3则意味着指定版本的依赖包,即锁定版本号。

    安装依赖规则参考原文链接:https://blog.csdn.net/cindy647/article/details/105228158
    https://blog.csdn.net/cindy647/article/details/105228158

  • 相关阅读:
    设计模式-11-模板模式
    【CesiumJS入门】(12)Vite+Vue3+Cesium 简易安装与配置
    信息安全管理与评估 21年国赛真题解析答案(待更新)
    C++ 11 模板改进
    c语言对三个数进行比较找出其中的最值
    企业如何选择Windows网络监控工具
    【总结】助力2022年全国大学生数学建模 — 优化模型总结篇(万字总结)
    【精读Uboot】异常向量的设置
    c++编程实例
    【英语:基础进阶_语法进阶提升】F5.定语从句
  • 原文地址:https://blog.csdn.net/qq_43682422/article/details/126537788