CommonJS是服务器端模块化规范,AMD为浏览器 模块化规范。

Node.js采用了CommonJS规范,该规范规定一个文件为一个模块,一个模块为一个独立的作 用域。每个作用域下变量都是已有的,对外的接口只有module.exports

创建模块

接下来我们创建一个模块名为moduleA,其中模块有个方法sayHello

  // moduleA.js

  var name = 'John';
  module.exports.sayHello = function(){
    console.log('Hello, my name is' + name + '.');
  }

其中module是每个模块中单独的对象,反应模块的情况,有这么几个属性:

  • id 模块的唯一id编号
  • filename 模块的文件名称
  • loaded 模块是否加载完成
  • parent 是谁引用了该模块
  • children 该模块还引用了哪些模块
  • exports 模块的对外接口

引用模块

使用require("module")来引用模块,即可使用该模块对外的所有接口。

  // app.js

  // 引用模块
  var module = require('moduleA');

  // 使用模块moduleA中的对外方法
  module.sayHello();

  // 但是访问不到模块的私有方法或属性。
  module.name; // => undefined

引用模块的时候,有一定规则,用来准确高效的确定模块。

  1. 如果参数带有路径信息,则根据此路径信息去定位模块,例如:”/”在根目录下,”./”相 对于当前目录下。
  2. 不加路径信息,则根据特殊到通用的原则在各级的node_modules中寻找模块。例如在/home/user/projects/foo.js 中运行require("bar.js")则经过这样的顺序来定位模块:
    • /home/user/projects/node_modules/bar.js
    • /home/user/node_modules/bar.js
    • /home/node_modules/bar.js
    • /node_modules/bar.js
  3. 不加后缀的文件夹式路径则先尝试获取文件夹下的package.json,加载该配置文件中main 属性所对应的文件。如果没有配置文件,则依次加载index.js或index.node。
  4. 不加后缀的非文件夹路径则依次补上后缀.js,.json,.node进行加载。

over.