AMD、CMD、CommonJs和UMD

一个模块化系统所必须的能力

  • 定义封装的模块
  • 定义新模块对其他模块的依赖
  • 可以对其他模块的引入支持

CommonJs
CommonJs是服务端的模块规范,Node.js采用这个规范。根据CommonJs的规定,一个单独的文件就是一个模块。加载模块使用require方法,该方法读取一个文件并执行,最后返回文件内部的exports对象。

// foobar.js
//私有变量
var test = 123;
//公有方法
function foobar () {
 
    this.foo = function () {
        // do someing ...
    }
    this.bar = function () {
        //do someing ...
    }
}
//exports对象上的方法和变量是公有的
var foobar = new foobar();
exports.foobar = foobar;
//require方法默认读取js文件,所以可以省略js后缀
var test = require('./boobar').foobar;
 
test.bar();

CommonJS 加载模块是同步的,所以只有加载完成才能执行后面的操作。像Node.js主要用于服务器的编程,加载的模块文件一般都已经存在本地硬盘,所以加载起来比较快,不用考虑异步加载的方式,所以CommonJS规范比较适用。但如果是浏览器环境,要从服务器加载模块,这是就必须采用异步模式。所以就有了 AMD CMD 解决方案。

AMD和RequireJS

AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。主要用于浏览器,由于该规范不是原生的js支持,使用AMD规范进行开发的时候需要引入第三方的库函数,也就是RequireJS。
RequireJs主要解决了两个问题:
1.多个js文件可能有依赖关系,被依赖文件需要先加载完毕。
2.js加载的时候浏览器会停止页面渲染,加载文件越多,页面失去响应时间越长。
RequireJS定义了一个define函数,用来定义模块
语法:

define([id], [dependencies], factory)

参数:

  • id:可选,字符串类型,定义模块标识,如果没有提供参数,默认为文件名
  • dependencies:可选,字符串数组,AMD推崇依赖前置,即当前模块依赖的其他模块,模块依赖必须在真正执行具体的factory方法前解决
  • factory:必需,工厂方法,初始化模块需要执行的函数或对象。如果为函数,它只被执行一次。如果是对象,此对象会作为模块的输出值

AMD模式开发的简单三层结构(基础库/UI层/应用层):

  • 定义无依赖的库
define( {
    add : function( x, y ){
        return x + y ;
    }
} );
  • 定义有依赖的库
// ui.js
define(['base'], function (base) {
    return {
        initPage: function () {
            // ...
        }
    }
})
  • 定义数据对象模块
// data.js
define({
    users: [],
    numbers: []
})
  1. 具名模块
define('index', ['data','base'], function(data, base) {
    // ...
})
  1. 包装模块
define(function(require, exports, module) {
    var base = require('base');
    exports.show = function() {
        // todo with module base
    }
})

模块加载
require([module],callback),[module]是一个数组,里面成员就是需要加载的模块,callback是模块加载完成之后的回调函数。

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

CMD和SeaJs
1.对于依赖模块的AMD是提前执行,CMD是延迟执行。不过RequireJS从2.0开始,也改成可以延迟执行(根据写法不同,处理方式不通过)。
2.CMD推崇依赖就近,AMD推崇依赖前置。

//AMD
define(['./a','./b'], function (a, b) {
 
    //依赖一开始就写好
    a.test();
    b.test();
});
 
//CMD
define(function (requie, exports, module) {
     
    //依赖可以就近书写
    var a = require('./a');
    a.test();
     
    ...
    //软依赖
    if (status) {
     
        var b = requie('./b');
        b.test();
    }
});

UMD
UMD是AMD和CommonJs的糅合,可以通过<script>标签引入也可以通过import引入。AMD异步加载模块,CommonJs同步加载模块。
所以UMD先判断是否支持Node.js模块(exports)是否存在,存在则使用Node.js模块模式。再判断是否支持AMD(define是否存在),存在则使用AMD方式加载模块。

(function (window, factory) {
    if (typeof exports === 'object') {
     
        module.exports = factory();
    } else if (typeof define === 'function' && define.amd) {
     
        define(factory);
    } else {
     
        window.eventUtil = factory();
    }
})(this, function () {
    //module ...
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值