zoukankan      html  css  js  c++  java
  • 关于 CommonJS AMD CMD UMD 规范的差异总结

    一、CommonJS 主要是用于服务器端的规范,比如目前的nodeJS.

    根据CommonJS规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在一个文件定义的变量(还包括函数和类),都是私有的,对其他文件是不可见的。

    // foo.js
    var request = require('request').default({ 
        timeout: 4000
    });
    
    module.exports = function(){ 
        this.re = '';
        this.req = function(url){ 
            request(url,function(error,status,res){ 
                this.re = res;
            });
        }
    };
    //---------------------------------------------
    // main.js
    
    var Foo = require('./foo');
    var foo = new Foo();
    foo.req('http://www.baidu.com');
    //这么个异步法  foo.re应该是空的吧..
    console.log(foo.re);

    CommonJS 加载模块是同步的.所以只有加载完成才能执行后面的操作。

    像Node.js主要用于服务器的编程,加载的模块文件一般都已经存在本地硬盘,所以加载起来比较快,不用考虑异步加载的方式,所以CommonJS规范比较适用。

    但如果是浏览器环境,要从服务器加载模块,这是就必须采用异步模式。所以就有了 AMD  CMD 等解决方案。

    二、AMD (Asynchromous Module Definition)

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

    AMD异步加载模块。它的模块支持对象 函数 构造器 字符串 JSON等各种类型的模块。

    适用AMD规范适用define方法定义模块。

    示例如-->

    AMD 运行时核心思想是「Early Executing」,也就是提前执行依赖

    三、CMD  (Common Module Definition)

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

    示例如-->

    CMD和AMD的区别有以下几点:

    1.对于依赖的模块AMD是提前执行,CMD是延迟执行。

    2.CMD推崇依赖就近,按需加载;AMD推崇依赖前置。

    那seajs和requirejs的差别呢?

    1. 定位有差异。RequireJS 想成为浏览器端的模块加载器,同时也想成为 Rhino / Node 等环境的模块加载器。Sea.js 则专注于 Web 浏览器端,同时通过 Node 扩展的方式可以很方便跑在 Node 环境中。

    2. 遵循的规范不同。RequireJS 遵循 AMD(异步模块定义)规范,Sea.js 遵循 CMD (通用模块定义)规范。规范的不同,导致了两者 API 不同。Sea.js 更贴近 CommonJS Modules/1.1 和 Node Modules 规范。

    3. 推广理念有差异。RequireJS 在尝试让第三方类库修改自身来支持 RequireJS,目前只有少数社区采纳。Sea.js 不强推,采用自主封装的方式来“海纳百川”,目前已有较成熟的封装策略。

    4. 对开发调试的支持有差异。Sea.js 非常关注代码的开发调试,有 nocache、debug 等用于调试的插件。RequireJS 无这方面的明显支持。

    5. 插件机制不同。RequireJS 采取的是在源码中预留接口的形式,插件类型比较单一。Sea.js 采取的是通用事件机制,插件类型更丰富。

          总之,如果说 RequireJS 是 Prototype 类库的话,则 Sea.js 致力于成为 jQuery 类库。

    四、UMD

    umd是AMD和CommonJS的糅合

    AMD 浏览器第一的原则发展 异步加载模块。

    CommonJS 模块以服务器第一原则发展,选择同步加载,它的模块无需包装(unwrapped modules)。

    这迫使人们又想出另一个更通用的模式UMD (Universal Module Definition)。希望解决跨平台的解决方案。

    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 ...
    });

    参考:http://my.oschina.net/felumanman/blog/263330?p=1

  • 相关阅读:
    PHP基本的语法以及和Java的差别
    Linux 性能測试工具
    【Oracle 集群】Linux下Oracle RAC集群搭建之Oracle DataBase安装(八)
    【Oracle 集群】Oracle 11G RAC教程之集群安装(七)
    【Oracle 集群】11G RAC 知识图文详细教程之RAC在LINUX上使用NFS安装前准备(六)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 特殊问题和实战经验(五)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之缓存融合技术和主要后台进程(四)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)
    Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)
  • 原文地址:https://www.cnblogs.com/imwtr/p/4666181.html
Copyright © 2011-2022 走看看