孙肖宁

nodejs中的模块加载问题
核心模块使用的时候就可以通过 require('包名') 的方式来进行加载才可以使用。核心模块的本质也是文件。核心...
扫描右侧二维码阅读全文
23
2018/07

nodejs中的模块加载问题

核心模块

  • 使用的时候就可以通过 require('包名') 的方式来进行加载才可以使用。
  • 核心模块的本质也是文件。
  • 核心模块文件已经被编译到了二进制文件中了,我们只需要按照名字来加载就可以了。

第三方模块

  • 凡是第三方模块都必须通过 npm 来下载。
  • 使用的时候就可以通过 require('包名') 的方式来进行加载才可以使用。
  • 注意:

    • 不可能有任何一个第三方包和核心模块的名字是一样的。
    • 第三方模块既不是核心模块、也不是路径形式的模块。
    • 它的加载原理如下:

      • 先找到当前文件所处目录中的 node_modules 目录(从该文件的位置开始,一层层的向上查询,直到找到该目录,或者找到磁盘根目录)。
      • 找到该模块的文件夹。
      • 找到该模块的文件夹内的package.json 文件。
      • 找到该模块的文件夹内的package.json 文件中的 main 属性。
      • main 属性中就记录了 art-template 的入口模块。
      • 然后加载使用这个第三方包,实际上最终加载的还是文件。
      • 如果 package.json 文件不存在或者 main 指定的入口模块是也没有,则 node 会自动找该目录下的 index.js,也就是说 index.js 会作为一个默认备选项。
      • 如果以上所有任何一个条件都不成立,则会进入上一级目录中的 node_modules 目录查找如果上一级还没有,则继续往上上一级查找。如果直到当前磁盘根目录还找不到,最后报错:can not find module xxx var template = require('art-template')
    • 我们一个项目有且只有一个 node_modules,放在项目根目录中,这样的话项目中所有的子目录中的代码都可以加载到第三方包,不会出现有多个 node_modules
    • 模块查找机制

      • 优先从缓存加载
      • 核心模块
      • 路径形式的文件模块
      • 第三方模块

非路径形式的模块标识(自己写的模块)

  • 路径形式的模块:

    • ./ 当前目录,不可省略
    • ../ 上一级目录,不可省略
    • /xxx 绝对路径,从该文件的磁盘根目录开始(几乎不用)
    • d:/a/foo.js 绝对路径(几乎不用)
    • 首位的 / 在这里表示的是当前文件模块所属磁盘根路径
    • .js 后缀名可以省略
  • 引入方式require('./foo.js')
Last modification:July 23rd, 2018 at 05:39 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment