前面介绍了一下AMD相关的东西,这篇我们来看看CMD相关的。

 

CMD  -------  Common Module Definition

 

 在CMD规范里面,一个模块就是一个Javascript文件。代码书写格式如下:

 

define(factory);


 

  • define是全局函数,来定义模块
  • 仅接收一个factory参数,可以是函数,对象,字符串等类型

       1、 factory为对象、字符串等非函数类型时候,表示模块的接口是该对象、字符串等值


define({
    "foo":"bar"
});


 


       通过字符串定义模版模块


define('I am a template.My name is {{name}}.');

 


      2、 factory为函数时候,表示模块的构造方法



           执行该方法, 可以得到模块向外提供的接口。默认 3个参数:require 、 exports 、 module



define(function(require,exports,module){
    //...
});


 



      require



       ---------  是 一个方法,用来 获取其他模块提供的接口


define(function(require){
     var a = require('./a');
     a.doSomething;
});


 


   require接受 模块标识作为唯一参数,模块标识书写需要 遵循一些规范




    require.async


 


     ---------- 可以用来 异步加载模块,并在 加载完成后执行指定的回调



define(function(require,exports,module){
     //异步加载b  
     require.async('./b',function(b){
          b.doSomething;
    });

    //异步加载多个模块
    require.async(['./c','./d'],function(c,d){
         //
         ........
    })

});


    require.resolve


    


    ---------  使用 模块系统内部的路径解析机制来返回模块的路径。该函数 不会加载模块,只 返回解析后的绝对路径


define(function(require,exports){
     console.log(require.resolve('./b'));
     //../b.js
});

 


   


   require.cache



    ----------  可以 查看模块系统加载过的所有模块



     某些情况下,需要重新加载某个模块,可以得到该模块的url,然后通过 delete require.cache[url] 来将其信息删除




   exports



    --------  是一个 对象,用来 向外提供模块接口



  

define(function(require,exports){
      exports.foo = "bar";
      exports.doSomething = function(){
          ...............
      }
});


     除了给 exports对象增加成员,还可以以return的方式直接向外提供接口



define(function(require,exports,module){
      return {
          fool: "bar",
          doSomething:function(){
               .............
          }
     };
});


  当然如果只是返回一个对象,可以直接:

define({
     foo: "bar",
     doSomething:function(){}
});


 


    注释:在factory里面给exports重新赋值是没有意义的,因为exports仅仅是module.exports的一个引用,直接给exports重新赋值并不会修改module.exports的值。



  看下面这个 错误的例子



  

define(function(require,exports,module){
      exports = {
           foo: "bar",
           doSomething:function(){}
      }
});

 

  正确的应该是:

 

 

define(function(require,exports,module){
     module.exports = {
            foo: "bar",
           doSomething:function(){}
     }
});

 

 module

 

   module 是一个对象存储了与当前模块关联的一些属性和方法

 

 

  •   module.id

           ----------  模块标识

 

define(function(require,exports,module){
    console.log(require(module.id) === exports);    // true
});

 

  • module.uri

         ------------ 根据模块系统的路径解析规则得到的模块 绝对路径



  • module.dependencies

         ------------ 是一个 数组,标识当前模块的依赖列表





  • module.parent

         ------------ 指向 初始化调用当前模块的模块。可以得到模块初始化的callstack





  • module.factory

         ------------ 指向define(factory)中的factory参数





  • module.status

         ------------ 当前模块的 状态,是一个数值





  • module.exports

         ------------ 当前模块对外提供的接口







    传给factory构造方法的exports参数是module.exports对象的一个引用





    比如当模块的接口是某一个类的实例时候,需要通过module.exports来实现



        

define(function(require,exports,module){
     console.log(module.exports === exports);   // true
     module.exports = new SomeClass();
     console.log(module.exports === exports);  //false
});





  • module.require

     在module环境中运行require,一般用于插件开发







   扩展阅读:





https://github.com/seajs/seajs/issues/242