Node.js 当多个版本需要相同的模块时,NodeJS如何处理模块缓存

Node.js 当多个版本需要相同的模块时,NodeJS如何处理模块缓存,node.js,Node.js,对于具有以下结构的项目: index.js => require('debug') => require('express') node_modules debug => version 3.x.x express => require('debug') node_modules debug => version 2.x.x NodeJS加载index.js中所需的调试模块,版本为3.x.x

对于具有以下结构的项目:

  index.js => require('debug')
           => require('express')
  node_modules
    debug => version 3.x.x
    express => require('debug')
      node_modules
        debug => version 2.x.x
  • NodeJS加载index.js中所需的调试模块,版本为3.x.x
  • 当为express模块加载调试模块时,NodeJS是使用已经缓存的调试模块(v3.x.x)还是加载express模块所需的模块(2.x.x)

  • 模块缓存不仅取决于根文件名,还取决于其完全解析的路径

    因此,如果模块“A”正在加载index.js的v3.xx版本,模块“B”正在从不同的磁盘位置加载index.js的v2.xx版本,那么这两个版本都将被加载,因为模块缓存将它们识别为不同的文件并将分别缓存

    因此,由于
    index.js
    的v3.xx和v2.xx不可能存在于同一个完整路径中,因此整个系统工作正常,因为每个模块都可以
    require()
    在其附带的每个依赖模块的精确版本中

    这假设模块表现良好,并且没有做可能破坏此功能的事情,例如建立可能冲突或竞争共享资源锁定的全局函数,等等。。。如果它们是性能良好的模块,那么一个项目可以有一个使用v3.xx的模块和另一个使用v2.xx的模块。这是由于每个模块的单独作用域以及每个依赖模块分别导入它们的能力而实现的


    我在nodejs文档中读到了这一点,但我不清楚“同一个文件”是什么意思。是相同的文件名、相同的文件绝对路径、相同的文件内容吗

    它是相同的完整路径,因此类似于:

    /whatever/user/someUser/myProject/node_modules/index.js
    
    将是index.js的完整路径


    如果您没有像在
    require('index.js')中那样指定
    require()
    的完整路径
    或您指定了一个相对路径,那么它将是根据为
    require()
    指定的搜索规则(如文档中所指定)查找index.js的完整路径。

    模块缓存不仅仅取决于根文件名,还取决于其完全解析的路径

    因此,如果模块“A”正在加载index.js的v3.xx版本,模块“B”正在从不同的磁盘位置加载index.js的v2.xx版本,那么这两个版本都将被加载,因为模块缓存将它们识别为不同的文件并将分别缓存

    因此,由于
    index.js
    的v3.xx和v2.xx不可能存在于同一个完整路径中,因此整个系统工作正常,因为每个模块都可以
    require()
    在其附带的每个依赖模块的精确版本中

    这假设模块表现良好,并且没有做可能破坏此功能的事情,例如建立可能冲突或竞争共享资源锁定的全局函数,等等。。。如果它们是性能良好的模块,那么一个项目可以有一个使用v3.xx的模块和另一个使用v2.xx的模块。这是由于每个模块的单独作用域以及每个依赖模块分别导入它们的能力而实现的


    我在nodejs文档中读到了这一点,但我不清楚“同一个文件”是什么意思。是相同的文件名、相同的文件绝对路径、相同的文件内容吗

    它是相同的完整路径,因此类似于:

    /whatever/user/someUser/myProject/node_modules/index.js
    
    将是index.js的完整路径


    如果您没有像在
    require('index.js')中那样指定
    require()
    的完整路径
    或您指定了一个相对路径,那么它将是
    require()
    根据为
    require()
    指定的搜索规则(如文档中所指定)查找index.js的完整路径。

    是的,它们是:
    模块在第一次加载后被缓存。这意味着(除其他外)每个对require('foo')的调用都将返回完全相同的对象,如果它将解析为相同的文件。
    我在nodejs文档中读到了这一点,但我不清楚“相同的文件”是什么意思。它是相同的文件名、相同的文件绝对路径、相同的文件内容吗?您上面的示例需要一个,因为它不是以路径开始的,即
    /
    或'/'等,或包含和扩展名。Node将查看项目的
    Node\u modules
    文件夹,然后查看Node\u modules文件夹并检查
    package.json
    中规定的版本。否则,节点将查看您指定的路径,该路径区分大小写,并将缓存文件,并为指向同一文件的未来请求提供该路径。是的,它们是:
    模块在第一次加载后缓存。这意味着(除其他外)每个对require('foo')的调用都将返回完全相同的对象,如果它将解析为相同的文件。
    我在nodejs文档中读到了这一点,但我不清楚“相同的文件”是什么意思。它是相同的文件名、相同的文件绝对路径、相同的文件内容吗?您上面的示例需要一个,因为它不是以路径开始的,即
    /
    或'/'等,或包含和扩展名。Node将查看项目的
    Node\u modules
    文件夹,然后查看Node\u modules文件夹并检查
    package.json
    中规定的版本。否则,节点将查看您指定的路径,该路径区分大小写,并将缓存文件并为指向同一文件的未来请求提供该路径。