zoukankan      html  css  js  c++  java
  • 浅析JS中的模块规范(CommonJS,AMD,CMD) http://www.2cto.com/kf/201411/348276.html

    如果你听过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(){...做加操作..};
    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吧,这个不陌生吧,对吧。
  • 相关阅读:
    c:forTokens标签循环输出
    jsp转long类型为date,并且格式化
    spring中@Param和mybatis中@Param使用区别(暂时还没接触)
    734. Sentence Similarity 有字典数组的相似句子
    246. Strobogrammatic Number 上下对称的数字
    720. Longest Word in Dictionary 能连续拼接出来的最长单词
    599. Minimum Index Sum of Two Lists两个餐厅列表的索引和最小
    594. Longest Harmonious Subsequence强制差距为1的最长连续
    645. Set Mismatch挑出不匹配的元素和应该真正存在的元素
    409. Longest Palindrome 最长对称串
  • 原文地址:https://www.cnblogs.com/shatonghui/p/6884353.html
Copyright © 2011-2022 走看看