1、 為什么要使用模塊化?
模塊化的作用有以下這些:
- 可以解決命名沖突
- 管理依賴
- 提高代碼的可讀性
- 代碼解耦,提高代碼的復用性
AMD(異步執行) 是 RequireJS 在推廣過程中對模塊定義的規范化產出。
CMD (同步執行)是 SeaJS 在推廣過程中對模塊定義的規范化產出。
這些規范的目的都是為了 JavaScript 的模塊化開發,特別是在瀏覽器端的。
目前這些規范的實現都能達成瀏覽器端模塊化開發的目的。
瀏覽器不兼容CommonJS(http://wiki.commonjs.org/wiki/Modules/1.1)的根本原因,也正是在於缺少四個Node.js環境的變量。
- module
- exports
- require
- global
2.AMD規范
AMD是"Asynchronous Module Definition"的縮寫,意思就是"異步模塊定義"。它采用異步方式加載模塊,模塊的加載不影響它后面語句的運行。所有依賴這個模塊的語句,都定義在一個回調函數中,等到加載完成之后,這個回調函數才會運行。
AMD也采用require()語句加載模塊,但是不同於CommonJS,它要求兩個參數:
require([module], callback);
第一個參數[module],是一個數組,里面的成員就是要加載的模塊;第二個參數callback,則是加載成功之后的回調函數。
3.CMD規范
cmd的全稱是Common Module Definition,即通用模塊定義,其提供了模塊定義和按需加載執行模塊。該規范明確了模塊的基本書寫格式和基本的交互規則。
在 CMD 規范中,一個模塊就是一個文件。代碼的書寫格式如下:
define(factory);
這里的define是一個全局函數,用來定義模塊,這里的factory參數既可以是函數,又可以是字符串或對象
4.兩者區別
AMD 通過 require.js實現
CMD 通過 sea.js實現
1. 對於依賴的模塊,AMD 是提前執行,CMD 是延遲執行。不過 RequireJS 從 2.0 開始,也改成可以延遲執行(根據寫法不同,處理方式不同)。CMD 推崇 as lazy as possible.
2. CMD 推崇依賴就近,AMD 推崇依賴前置。看代碼:
// CMD define(function(require, exports, module) { var a = require('./a') a.doSomething() // 此處略去 100 行 var b = require('./b') // 依賴可以就近書寫 b.doSomething() // ... }) // AMD 默認推薦的是 define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好 a.doSomething() // 此處略去 100 行 b.doSomething() ... })
可供參考:https://www.imooc.com/article/19828