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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM