浅谈JS中的模块规范AMD和CMD

转载 2016年08月29日 19:51:37

如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已。

   现在就看看吧,这些规范到底是啥东西,干嘛的。

 

一、CommonJS

 CommonJS就是为JS的表现来制定规范,因为js没有模块的功能所以CommonJS应运而生,它希望js可以在任何地方运行,不只是浏览器中。

 CommonJS能有一定的影响力,我觉得绝对离不开Node的人气,不过喔,Node,CommonJS,浏览器甚至是W3C之间有什么关系呢,我找到了个贴切的图:

 

  |---------------浏览器----- ------------------|        |--------------------------CommonJS----------------------------------|

  |  BOM  |       | DOM |        | ECMAScript |         | FS |           | TCP |         | Stream |        | Buffer |          |........|

  |-------W3C-----------|       |---------------------------------------Node--------------------------------------------------|

 

CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)}

require()用来引入外部模块;exports对象用于导出当前模块的方法或变量,唯一的导出口;module对象就代表模块本身。

 

比如说我们就可以这样用了:

复制代码
1 //sum.js
2 exports.sum = function(){...做加操作..};
3 
4 //calculate.js
5 var math = require('sum');
6 exports.add = function(n){
7     return math.sum(val,n);
8 };
复制代码

 

虽说Node遵循CommonJS的规范,但是相比也是做了一些取舍,填了一些新东西的。

不过,说了CommonJS也说了Node,那么我觉得也得先了解下NPM了。NPM作为Node的包管理器,不是为了帮助Node解决依赖包的安装问题嘛,那它肯定也要遵循CommonJS规范啦,它遵循包规范(还是理论)的。

CommonJS WIKI讲了它的历史,还介绍了modules和packages等。

 

二、AMD

CommonJS是主要为了JS在后端的表现制定的,他是不适合前端的,为什么这么说呢?

这需要分析一下浏览器端的js和服务器端js都主要做了哪些事,有什么不同了:

 

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

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

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

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

---------------------------------------------------------------------------------------------------------------

 

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

AMD就只有一个接口:define(id?,dependencies?,factory);

它要在声明模块的时候制定所有的依赖(dep),并且还要当做形参传到factory中,像这样:

 

1 define(['dep1','dep2'],function(dep1,dep2){...});

 

要是没什么依赖,就定义简单的模块,下面这样就可以啦:

 

1 define(function(){
2     var exports = {};
3     exports.method = function(){...};
4     return exports;
5 });

 

咦,这里有define,把东西包装起来啦,那Node实现中怎么没看到有define关键字呢,它也要把东西包装起来呀,其实吧,只是Node隐式包装了而已.....

RequireJS就是实现了AMD规范的呢。

这有AMD的WIKI中文版,讲了很多蛮详细的东西,用到的时候可以查看:AMD的WIKI中文版

 

三、CMD

大名远扬的玉伯写了seajs,就是遵循他提出的CMD规范,与AMD蛮相近的,不过用起来感觉更加方便些,最重要的是中文版,应有尽有:seajs官方doc

 

1 define(function(require,exports,module){...});

 

用过seajs吧,这个不陌生吧,对吧。

前面说AMD,说RequireJS实现了AMD,CMD看起来与AMD好像呀,那RequireJS与SeaJS像不像呢?

虽然CMD与AMD蛮像的,但区别还是挺明显的,官方非官方都有阐述和理解,我觉得吧,说的都挺好:

官方阐述SeaJS与RequireJS异同

SeaJS与RequireJS的最大异同(这个说的也挺好)

原文链接:http://lib.csdn.net/article/javascript/21635

JS中的两个规范 CMD和AMD

最近在学习js的过程中看见两个新的东西,CMD和AMD,下面我们就来了解一下这两个东西是什么,有什么区别吧。 简单的介绍:  CMD (Common Module Definition) 简单的...
  • u014230198
  • u014230198
  • 2015年12月05日 10:15
  • 815

理解AMD ,CMD,CommonJS规范

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

CommonJS,AMD,CMD,ES6模块规范

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

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

随着互联网的飞速发展,前端开发越来越复杂。本文将从实际项目中遇到的问题出发,讲述模块化能解决哪些问题,以及如何使用 Sea.js 进行前端的模块化开发。恼人的命名冲突我们从一个简单的习惯出发。我做项目...
  • xllily_11
  • xllily_11
  • 2016年05月27日 16:42
  • 15622

兼容CommonJS规范,AMD规范,CMD规范的JS写法

//闭包执行一个立即定义的匿名函数 !function(factory) { //factory是一个函数,下面的koExports就是他的参数 // Support three ...
  • baojianxiao
  • baojianxiao
  • 2015年05月11日 16:07
  • 1756

前端开发 AMD 和 CMD 的规范区别

AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMD CMD 规范在这里:https://github.com/seajs/seajs/issu...
  • ejinxian
  • ejinxian
  • 2017年04月17日 15:02
  • 713

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

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

JS模块化编程之AMD规范(一)

随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂。 网页越来越像桌面程序,需要一个团队分工协作、进度管理、单元测试等等......开发者不得不使用软件...
  • langwuzhe
  • langwuzhe
  • 2016年07月08日 14:45
  • 1917

AMD、CMD和CommonJS规范

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

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

AMD和CMD的区别,require和seajs的用法,CommonJS的规范...
  • jackwen110200
  • jackwen110200
  • 2016年08月03日 17:15
  • 23377
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈JS中的模块规范AMD和CMD
举报原因:
原因补充:

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