zoukankan      html  css  js  c++  java
  • Common JS、AMD、CMD和UMD的区别

    一、CommonJS
    1.CommonJS API定义很多普通应用程序(主要指非浏览器的应用)使用的API。它的终极目标是提供一个类似Python,Ruby和Java标准库。CommonJs 是服务器端模块的规范,Node.js采用了这个规范。

    2.这些规范涵盖了模块、二进制、Buffer、字符集编码、I/O流、进程环境、文件系统、套接字、单元测试、违背、服务器网关接口、包管理等。

    3.根据CommonJS规范,一个单独的文件就是一个模块。加载模块使用require方法,该方法读取一个文件并执行,最后返回文件内部的exports对象。

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

    二、AMD、CMD
    1.AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。

    这些规范的目的都是为了 JavaScript 的模块化开发,特别是在浏览器端的。目前这些规范的实现都能达成浏览器端模块化开发的目的。
    2.区别:
    - 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.
    -  AMD 推崇依赖前置,CMD 推崇依赖就近。
      

     // AMD 默认推荐的是

     define(['./a', './b'], function(a, b) {// 依赖必须一开始就写好    
        a.doSomething()    // 此处略去 100 行    
        b.doSomething()    
        ...
        })


      
        // CMD
        

     define(function(require, exports, module) {   
            var a = require('./a')   
            a.doSomething()   // 此处略去 100 行   
            var b = require('./b') // 依赖可以就近书写   b.doSomething()   // 
            ... 
            })

      

    虽然 AMD 也支持 CMD 的写法,同时还支持将 require 作为依赖项传递,但 RequireJS 的作者默认是最喜欢上面的写法,也是官方文档里默认的模块定义写法。
    -  AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一。比如 AMD 里,require 分全局 require 和局部 require,都叫 require。CMD 里,没有全局 require,而是根据模块系统的完备性,提供 seajs.use 来实现模块系统的加载启动。CMD 里,每个 API 都简单纯粹。

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

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

    三、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 ...
        });
  • 相关阅读:
    Oracle安装错误ora-00922(zhuan)
    Context上下文对象(抄书的)
    我的oracle账号
    jquery总结(1)
    JS改变input的value值不触发onchange事件解决方案 (转)
    写表单验证等页面的总结
    表单验证模板2
    Session随便写的(抄书笔记)
    cookie随便写的一点笔记(抄书的)
    Oracle触发器修改数据时同步执行插入该条数据
  • 原文地址:https://www.cnblogs.com/sapho/p/4982483.html
Copyright © 2011-2022 走看看