CommonJS,AMD和CMD规范的区别

原创 2016年05月31日 10:41:09

1、CommonJS

         CommonJS 是javascript模块化编程的一种规范,主要是在服务器端模块化的规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性。

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

2、AMD

        CommonJS是主要为了JS在后端的表现制定的,他是不适合前端的。 先分析一下浏览器端的js和服务器端js都主要做了哪些事:

   ---------------------------------------服务器端JS   |    浏览器端JS-------------------------------------------                               

                                 相同的代码需要多次执行  |    代码需要从一个服务器端分发到多个客户端执行                                  

                                   CPU和内存资源是瓶颈   |    带宽是瓶颈                                   

                                         加载时从磁盘中加载   |    加载时需要通过网络加载 -

        于是AMD(异步模块定义)出现了,它就主要为前端JS的表现制定规范。

         加载模块是异步方式,模块的加载不影响它后面语句的执行。所有依赖这个模块的语句,都定义到一个回调函数中,等到加载完成之后,这个回调函数才会运行。

         AMD规范使用define方法定义模块,通过数组引入依赖 ,回调函数通过形参传入依赖:

    define(["/libs/jquery"], function(jquery){

        function log(){

            alert("hello world!");

        }

        return {

            log: log

        }

    });

      当然AMD也允许输出模块兼容CommonJS规范:

    define(function(require, exports, module){

        var module = require("module");

        module.doSometing( );

        exports.do = function(){

            module.doSometing( );

        }

    });

       AMD 是 RequireJS 在推广过程中对模块定义的规范化产出

3、CMD

      大名远扬的玉伯写了seajs,就是遵循他提出的CMD规范,与AMD相近,不过用起来感觉更加方便。

      CMD和AMD的区别有以下几点:
      ① 对于依赖的模块AMD是提前执行,CMD是延迟执行。不过RequireJS从2.0开始,也改成可以延迟执行(根据写法不同,处理方式不通过)。
     ② 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();
    }
});
       虽然 AMD也支持CMD写法,但依赖前置是官方文档的默认模块定义写法。

      AMD的api默认是一个当多个用,CMD严格的区分推崇职责单一。例如:AMD里require分全局的和局部的。CMD里面没有全局的 require,提供 seajs.use()来实现模块系统的加载启动。CMD里每个API都简单纯粹。

版权声明:本文为博主原创文章,未经博主允许不得转载。

AMD、CMD和CommonJS规范

AMD 与 CMD
  • vuturn
  • vuturn
  • 2016年08月11日 16:27
  • 5576

【新手入门 最精炼总结】AMD/CMD/CommonJs到底是什么?它们有什么区别?

知道JS有模块化开发的说法,也偶尔听过requireJs,AMD,CMD等等名字,甚至使用node的时候,还用过require之类的方法,但是对这些一直没有一个明确的认识和概念。想必这就是许多新手刚接...
  • u014445339
  • u014445339
  • 2017年02月17日 17:20
  • 4551

AMD规范和CommonJS规范比较

目录 概述 AMD规范与CommonJS规范的兼容性 参考链接 概述 CommonJS是服务器端模块的规范,Node.js采用了这个规范。 根据Co...
  • ypq5566
  • ypq5566
  • 2014年05月19日 09:21
  • 1011

理解AMD ,CMD,CommonJS规范

这是一篇关于javascript模块化AMD,CMD,CommonJS的学习总结,作为记录也给同样对三种方式有疑问的童鞋们,有不对或者偏差之处,望各位大神指出,不胜感激。 本篇默认读者大概知道req...
  • xcymorningsun
  • xcymorningsun
  • 2016年09月30日 10:33
  • 3801

AMD规范与CMD规范的区别是什么?

在比较之前,我们得先来了解下什么是AMD规范?什么是CMD规范?当然先申明一下,我个人也是总结下而已,也是网上看到的资料,自己总结下或者可以说整理下而已,供大家更深入的了解!因为我们都知道 AMD规范...
  • u012246342
  • u012246342
  • 2015年12月08日 10:04
  • 3445

CommonJS,AMD,CMD,ES6模块规范

模块规范主要进行模块加载。 微信项目中我使用的是ES6规范(很好用加载模块(一个单独的文件也算是一个模块,一个模块就是和一个单独作用域,可以是说都是private)) 提到ES6规范,前不久使用Com...
  • qq_26878975
  • qq_26878975
  • 2017年05月29日 18:05
  • 863

彻底弄懂CommonJS和AMD/CMD!

JS中的模块规范(CommonJS,AMD,CMD),如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已。 现在就看看吧,...
  • liuwengai
  • liuwengai
  • 2016年11月24日 21:12
  • 549

CMD,AMD的原理,区别,应用场景

作者:佑界 链接:https://www.zhihu.com/question/21347409/answer/17959757 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业...
  • js8872
  • js8872
  • 2017年02月28日 09:57
  • 1128

前端模块化,AMD与CMD的区别

AMD和CMD的区别,require和seajs的用法,CommonJS的规范...
  • jackwen110200
  • jackwen110200
  • 2016年08月03日 17:15
  • 22431

再谈 JS中的模块规范(CommonJS,AMD,CMD)来自玉伯的seajs分析

随着互联网的飞速发展,前端开发越来越复杂。本文将从实际项目中遇到的问题出发,讲述模块化能解决哪些问题,以及如何使用 Sea.js 进行前端的模块化开发。恼人的命名冲突我们从一个简单的习惯出发。我做项目...
  • xllily_11
  • xllily_11
  • 2016年05月27日 16:42
  • 15467
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CommonJS,AMD和CMD规范的区别
举报原因:
原因补充:

(最多只允许输入30个字)