前端模块化,AMD和CMD的区别总结

简介:

1、AMD推崇依赖前置,CMD推崇就近依赖

//AMD: mod.js
define(['dependency1', 'dependency2'], function(require, exports, module){
    //TODO

    module.exports = {};
});
复制代码
//CMD: mod.js
define(function(require, exports, module) {
    var $ = require('jquery.js')
    
    if(true) {
        let a = require('./a.js');
        //TODO
    }
    
    module.exports = {}
});
复制代码

这种区别各有优劣,只是语法上的差距,而且requireJS和SeaJS都支持对方的写法

2、执行时机不同:AMD是加载完立即执行,CMD是延迟执行(二者的最大区别)

立即执行比较好理解,我们来看CMD的延迟执行。 还是以上面代码为例

//CMD: mod.js
define(function(require, exports, module) {
    var $ = require('jquery.js')
    
    if(true) {
        let a = require('./a.js');
        //TODO
    } else{
        let b = require('./b.js');
        //TODO
    }
    
    module.exports = {}
});
复制代码

在执行mod.js前,模块被解析为了字符串,然后通过正则表达式找出了模块中所有的依赖并去一一加载,如例子中的jquery.js、a.js和b.js。但是加载后的依赖并不立即执行,而是当js执行到require语句的时候才被执行。如例子中的juery.js和a.js会按执行顺序依次执行,而b.js因为是在条件控制的else里,所以它永远不会被执行。 需要说明一点的是,CMD这种用正则匹配字符串中依赖的行为会影响性能,这也是被大家诟病的。

3、实现按需加载的方法不同

两种规范都可以实现按需加载,但是实现的API不同:

//AMD:
define(function(require, exports, module){
    document.getelementById('app').onclick = function() {
        require(['myModule'], function (my){
            my.printName();
        });
    }
    //TODO
    module.exports = {};
});

复制代码
//CMD:
define(function(require, exports, module){
    document.getelementById('app').onclick = function() {
        require.async('myModule', function (my){
            my.printName();
        });
    }
    //TODO
    module.exports = {};
});

原文发布时间:2018-6-20
原文作者: Super Mouse
本文来源 掘金如需转载请紧急联系作者
相关文章
|
3天前
|
前端开发 JavaScript
前端 JS 经典:typeof 和 instanceof 区别
前端 JS 经典:typeof 和 instanceof 区别
9 0
|
3天前
|
前端开发 JavaScript
前端 JS 经典:for-in 和 for-of 用法区别
前端 JS 经典:for-in 和 for-of 用法区别
10 0
|
6天前
|
前端开发 JavaScript
前端 JS 经典:i,i++,++i区别
前端 JS 经典:i,i++,++i区别
9 0
|
6天前
|
前端开发 JavaScript
前端 JS 经典:let、const、var 区别
前端 JS 经典:let、const、var 区别
7 0
|
6天前
|
前端开发
vue2与vue3双向数据绑定的区别,前端面试自我介绍
vue2与vue3双向数据绑定的区别,前端面试自我介绍
|
8天前
|
前端开发 JavaScript 安全
【Web 前端】怎么实现Module模块化?
【5月更文挑战第1天】【Web 前端】怎么实现Module模块化?
|
8天前
|
存储 前端开发 索引
【Web 前端】ES6中,Set和Map的区别 ?
【5月更文挑战第1天】【Web 前端】ES6中,Set和Map的区别 ?
|
8天前
|
前端开发 UED
【Web 前端】防抖与节流的区别
【4月更文挑战第22天】【Web 前端】防抖与节流的区别
|
8天前
|
JavaScript 前端开发 开发者
【Web 前端】JS模块化有哪些?
【4月更文挑战第22天】【Web 前端】JS模块化有哪些?
|
8天前
|
前端开发 JavaScript 网络架构
【Web 前端】箭头函数和普通函数有什么区别?
【4月更文挑战第22天】【Web 前端】箭头函数和普通函数有什么区别?