一、AMD
????????????????AMD是requireJS推廣過程中對模塊定義的規(guī)范化輸出,(Asynchronous Module Definition)異步模塊定義,模塊的加載不影響它后面語句的執(zhí)行,所以依賴此模塊的語句,都得在回調(diào)函數(shù)中執(zhí)行。AMD采用require語句加載模塊,需要兩個參數(shù)
舉例:require(['math'],function(math){math.add(2,3)});
requireJS就是AMD規(guī)范,是依賴前置、異步定義的框架define([module],function(module){...})
關(guān)鍵字:依賴前置、異步、回調(diào)
二、CMD
? ? ? ? CMD是seaJS推廣過程中對模塊定義的規(guī)范化輸出,(Common Module Definition)通用模塊定義,在CMD規(guī)范中,一個文件就是一個模塊,用define定義模塊
舉例:define(require,export,module){}
CMD是依賴就近,在什么地方使用到插件就在什么地方require該插件,即用即返,這是一個同步的概念
三、CommonJS
? ? ? ? node.js的模塊系統(tǒng),就是參照CommonJS規(guī)范實現(xiàn)的。在CommonJS中,有一個全局性方法require(),用于加載模塊;在前端瀏覽器里面并不支持module.exports,通過node.js后端使用的,
? ??導出時都是值拷貝,就算導出的值變了,導入的值也不會改變,所以如果想更新值,必須重新導入一次,加載模塊是同步的。
? ??module.export跟exports的區(qū)別
? ??????module.exports 方法還可以單獨返回一個數(shù)據(jù)類型(String、Number、Object...),而 exports 只能返回一個 Object 對象
? ? ? ? 所有的 exports 對象最終都是通過 module.exports 傳遞執(zhí)行,因此可以更確切地說,exports 是給 module.exports 添加屬性和方法
四、ES6
? ??模塊化---export/import對模塊進行導出導入的
? ??采用靜態(tài)編譯,使得編譯時就能確定模塊的依賴關(guān)系,以及輸入和輸出的變量,不支持動態(tài)導入,采用實時綁定的方式,導入導出的值都指向同一個內(nèi)存地址,所以導入值會跟隨導出值變化。
五、export和export default的區(qū)別
? ?1、 export/import可以有多個,export default只有一個;
? ? 2、通過export方式導出,在導入時需要加{},export default不需要
? ? 3、export能導出變量/表達式,export default不可以
? ? 4、?export與export default均可用于導出常量/函數(shù)/文件/模塊等
六、module.export跟exports的區(qū)別(node commonJS規(guī)范)
? ? ? ? module.exports和exports指向同一個內(nèi)存地址、文件最終導出的是module.export的文件地址。如果擅自改動exports的指向,那exports導出的東西。import的時候是拿不到的。