CMD(Common Module Definition)是什么

2020-08-11 14:11发布

2条回答
Sauvignon
2020-08-11 20:30

这个规范致力于解决在基于浏览器的环境中怎么编写模块使得各个模块之间能够协调。这个规范为了模块之间的协调,定义了一个模块需要提供的最基本的特性。
1.模块是单一的
2.新的不受约束的在模块范围内的变量不应该被引用。
3.延迟执行。

模块定义


一个模块是通过一个define的关键字来定义的,这个关键字是个函数.

define(factory);

1.definefunction 接受单一的参数
2.factory可以是一个function或其他合法的值
3.假设factory是一个function,前三个参数如果指定的话,必须按顺序是'require','exports','module'。
4.假设factory不是一个对象,模块的exports被设置到那个对象

模块内容


在一个模块中,有三个不受约束的变量:require,exports,和module

define(require,exports,module){
  //模块代码}
require 函数

1.require 是一个函数
  i.require接受一个模块的标识符作为参数
  ii.返回外部模块输出的API
  iii.假设请求不到模块或模块没有输出API,require返回null
2.require.async 是一个函数
  i.require.async接受一组模块标识符作为参数,以及一个回调函数作为可选参数
  ii.这个回调函数接收模块的输出API作为参数,参数的顺序和模块列表的引用顺序相同
  iii.假设请求不到模块或模块没有输出API,这个回调函数接收null为参数

exports 对象(object)

在模块中有一个不受约束的变量叫exports。当一个模块执行的时候,该模块输出的API会添加到exports对象中。

module 对象(Object)

1.module.uri
完全分解模块后对应的uri
2.module.dependencies
这个模块依赖的一组模块标识符
3.module.exports
模块输出的API,等同于exports对象

模块标识符


1.一个模块标识符必须是一个字面上的字符串
2.一个模块标识符不能有文件后缀,例如.js
3.不能是横线连接的字符串 例如 foo-bar
4.可以是一个相对路径 例如./foo 和../bar

例子代码


一个典型的例子

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";});
用非函数的工厂包装模块

object-data.js

define({
    foo: "bar"});

array-data.js

define([
    'foo',
    'bar']);

string-data.js

define('foo bar');



一周热门 更多>