AMD规范和CMD规范

作者: 忽如寄 | 来源:发表于2017-07-08 12:24 被阅读318次

    AMD(异步模块定义规范)制定定义模块的规则,模块和模块的依赖是异步加载的。

    AMD通过define()函数定义一个模块:

    define(?id, dependencies?, factory );
    

    id:为模块的名字,可选,
    dependencies:该模块所依赖模块的数组,可选,模块名可以是相对或者绝对,忽略此参数则默认为["require", "exports", "module"]
    factory:模块初始化要执行的函数或对象,函数则执行一次,对象则为模块的输出值。
    一些例子:
    创建一个名为"alpha"的模块,使用了require,exports,和名为"beta"的模块:

    define("alpha", ["require", "exports", "beta"], function (require, exports, beta) {
           exports.verb = function() {
               return beta.verb();
               //Or:
               return require("beta").verb();
           }
       });
    

    一个返回对象的匿名模块:

    define(["alpha"], function(alpha){
        return {
            verb: function(){
                return alpha.verb() + 2;
            }
        }
    })
    

    一个没有依赖性的模块可以直接定义对象:

    define({
        add: function(x, y) {
             return x + y;
        }
    })
    

    使用CommonJS转换的模块定义:

    define(function(require, exports, module) {
        var a = require('a'),
               b = require('b');
    
        exports.action = function(){};
    })
    

    CMD规范
    在CMD中,一个模块就是一个文件,通过define()函数定义一个模块

    define(factory);
    

    factory可以是一个函数,也可以是一个对象或者字符串。当为函数的时候,如果指定参数,则必须为require、exports、module的顺序,即:

    define(function(require, exports, module) {
        
    })
    

    其中require引入一个外部模块,当这个外部模块没有被返回时,应该返回null。
    require.async()函数为加载异步加载的模块。
    exports对象用来导出模块中的方法等。
    module对象:module.uri为该模块的完整uri路径,module.dependencies为该模块需要的外部模块,module.exports等同于exports

    其中模块名必须为一个字符串,模块标识符可以没有后缀,模块路径可以是相对路径
    math.js

    define(function(require, exports, module) {
      exports.add = function() {
        var sum = 0, i = 0, args = arguments, l = args.length;
        while (i < l) {
          sum += args[i++];
        }
        return sum;
      };
    });
    

    increment.js

    define(function(require, exports, module) {
      var add = require('math').add;
      exports.increment = function(val) {
        return add(val, 1);
      };
    });
    

    program.js

    define(function(require, exports, module) {
      var inc = require('increment').increment;
      var a = 1;
      inc(a); // 2
    
      module.id == "program";
    });
    

    模块中factory不是函数的

    define({
        foo: "bar"
    })
    
    define([
        "foo",
        "bar"
    ])
    
    define('foo bar')
    

    相关文章

      网友评论

        本文标题:AMD规范和CMD规范

        本文链接:https://www.haomeiwen.com/subject/zrcvxxtx.html