• exports和require的关系
    Node模块允许你从被引入文件中选择要暴露给程序的函数和变量。如果模块返回的函数和变量不止一个,那么它可以通过设定exports对象的属性来指明它们。但如果模块只返回一个函数或者变量,则可以设定module.exports属性。其关系可以用如下所示的图来表示:

  • 模块
    模块既可能是一个文件,也可能是包含一个或多个文件的目录。如果模块是一个目录的话,Node通常会在这个目录下寻找index.js文件作为模块入口。

  • 加载模块
    加载模块使用require函数;对于使用该函数去加载Node模块,Node采用的是同步的方式寻找需要被加载的模块。

  • exports和module.exports
    如果在一个模块中同时编写了exorts和module.exports两种方法导出该模块,那么最终被程序导出的是module.exports。exports被设计为module.exports的一个全局引用,最初被设定为一个可以添加属性的空对象。
    1
    exports.fn // 只是module.exports.fn的简写

  • node模块的模块查找方法
    Node模块的查找方式如下图所示:

  • 注意事项

    1. 模块如果是目录,在模块目录中定义的文件必须被命名为index.js。除非你在这个目录下有一个叫package.json的文件里面特别的指明。要指定一个取代index.js的文件,package.json文件里面必须有一个JSON数据定义的对象,其中有一个名为main的键,指明模块目录内主文件的路径。如下图所示:

      1
      2
      3
      {
      "main": "main.js"
      }
    2. Node能够把模块作为对象缓存起来。如果程序中的两个文件引入了同一个模块,第一个文件会把模块返回的数据存到程序的内存中,这样第二个文件就不用再去访问和计算模块的原文件。