javascript模块化编程(二)—AMD规范

一、js的模块化规范:

服务器端:commonjs

浏览器端:AMD("Asynchronous Module Definition"的缩写,意思就是"异步模块定义"

二、为什么采用AMD

如下代码

var math = require(‘math‘);
  math.add(2, 3);
必须等待math.js加载完成,否则会出现加载时间很长现象

三、define

define(id?, dependencies?, factory);

其中:

  • id: 模块标识,可以省略。
  • dependencies: 所依赖的模块,可以省略。
  • factory: 模块的实现,或者一个JavaScript对象。
以下是使用AMD模式开发的简单三层结构(基础库/UI层/应用层):
 
base.js
define(function() {
    return {
        mix: function(source, target) {
        }
    };
});
ui.js

define([‘base‘], function(base) {
    return {
        show: function() {
            // todo with module base
        }
    }
});
page.js

define([‘data‘, ‘ui‘], function(data, ui) {
    // init here
});
data.js

define({
    users: [],
    members: []
});

以上同时演示了define的三种用法,
1,定义无依赖的模块(base.js)
2,定义有依赖的模块(ui.js,page.js)
3,定义数据对象模块(data.js)
 
 
细心的会发现,还有一种没有出现,即具名模块
define(‘index‘, [‘data‘,‘base‘], function(data, base) {
    // todo
});
具名模块多数时候是不推荐的,一般由打包工具合并多个模块到一个js文件中时使用。
 
前面提到dependencies元素的顺序和factory一一对应,其实不太严谨。AMD开始为摆脱CommonJS的束缚,开创性的提出了自己的模块风格。但后来又做了妥协,兼容了 CommonJS Modules/Wrappings 。即又可以这样写
define(function(require, exports, module) {
    var base = require(‘base‘);
    exports.show = function() {
        // todo with module base
    } 
});
不考虑多了一层函数外,格式和Node.js是一样的:使用require获取依赖模块,使用exports导出API。

四、require

require([module], callback);
第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback,则是加载成功之后的回调函数。如果将前面的代码改写成AMD形式,就是下面这样:

require([‘math‘], function (math) {
    math.add(2, 3);
  });

math.add()与math模块加载不是同步的,浏览器不会发生假死。所以很显然,AMD比较适合浏览器环境。

目前,主要有两个Javascript库实现了AMD规范:require.jscurl.js







javascript模块化编程(二)—AMD规范,布布扣,bubuko.com

javascript模块化编程(二)—AMD规范

上一篇:Java Socket编程入门


下一篇:服务器编程入门(11)TCP并发回射服务器实现 - 单线程select实现