- CommonJS規(guī)范加載模塊是同步的取劫,只有加載完成,才能執(zhí)行后面的操作忌卤。
- AMD規(guī)范是非同步加載模塊扫夜,允許指定回調(diào)函數(shù)。
由于Node.js主要用于服務(wù)器編程驰徊,模塊文件一般都已經(jīng)存在于本地硬盤笤闯,所以加載起來比較快,不用考慮非同步加載的方式棍厂,所以CommonJS規(guī)范比較適用颗味。但是,如果是瀏覽器環(huán)境勋桶,要從服務(wù)器端加載模塊脱衙,這時就必須采用非同步模式侥猬,因此瀏覽器端一般采用AMD規(guī)范。
CommonJS
規(guī)范中的module
捐韩、exports
和require
- 每個文件就是一個模塊退唠,有自己的作用域。每個模塊內(nèi)部荤胁,
module
變量代表當(dāng)前模塊瞧预,是一個對象,它的exports
屬性(即module.exports
)是對外的接口仅政。 -
module.exports
屬性表示當(dāng)前模塊對外輸出的接口垢油,其他文件加載該模塊,實(shí)際上就是讀取module.exports
變量圆丹。 - 為了方便滩愁,
Node
為每個模塊提供一個exports
變量,指向module.exports
辫封。let exports = module.exports;
-
require
命令用于加載模塊文件硝枉。
使用示例:
//name.js
exports.name = function(){return '李婷婷'}; //導(dǎo)出
//getName.js
let getName = require('name'); //引入
注:不能直接將exports
變量指向一個值,因?yàn)檫@樣等于切斷了exports
與module.exports
的聯(lián)系:如下
exports = function(x){console.log(x)}
如果一個模塊的對外接口倦微,就是一個單一的值妻味,不能使用exports
輸出,只能使用module.exports
輸出欣福。
AMD/CMD規(guī)范
-
AMD
是RequireJS
在推廣過程中對模塊定義的規(guī)范化產(chǎn)出责球。
CMD
是SeaJS
在推廣過程中對模塊定義的規(guī)范化產(chǎn)出。 - 對于依賴的模塊拓劝,
AMD
是提前執(zhí)行雏逾,CMD
是延遲執(zhí)行。不過RequireJS
從2.0
開始凿将,也改成可以延遲執(zhí)行(根據(jù)寫法不同校套,處理方式不同)。CMD
推崇as lazy as possible
. -
CMD
推崇依賴就近牧抵,AMD
推崇依賴前置笛匙。
//CMD
define(function(require, exports, module) {
let a = require('./a');
a.doSomething();
···
let b = require('./b'); // 依賴可以就近書寫
b.doSomething();
...
})
// AMD 默認(rèn)推薦的是
define(['./a', './b'], function(a, b) {
// 依賴必須一開始就寫好
a.doSomething()
...
b.doSomething()
...
})
雖然AMD
也支持CMD
的寫法,同時還支持將require
作為依賴項(xiàng)傳遞犀变,但RequireJS
的作者默認(rèn)是最喜歡上面的寫法妹孙,也是官方文檔里默認(rèn)的模塊定義寫法。
-
AMD
的API
默認(rèn)是一個當(dāng)多個用获枝,CMD
的API
嚴(yán)格區(qū)分蠢正,推崇職責(zé)單一。
比如AMD
里省店,require
分全局require
和局部require
嚣崭,都叫 require笨触。CMD
里,沒有全局require
雹舀,而是根據(jù)模塊系統(tǒng)的完備性芦劣,提供seajs.use
來實(shí)現(xiàn)模塊系統(tǒng)的加載啟動。CMD
里说榆,每個API
都簡單純粹虚吟。
拓展
目前所有的引擎都還沒有實(shí)現(xiàn)import
,在node
中使用babel
支持ES6
签财,也僅僅是將ES6
轉(zhuǎn)碼為ES5
再執(zhí)行串慰,import
語法會被轉(zhuǎn)碼為require
。這也是為什么在模塊導(dǎo)出時使用module.exports
唱蒸,在引入模塊時使用import
仍然起效邦鲫,因?yàn)楸举|(zhì)上,import
會被轉(zhuǎn)碼為require
去執(zhí)行神汹。
參考文檔
CommonJS規(guī)范
AMD 和 CMD 的區(qū)別有哪些掂碱?
Node中沒搞明白require和import,你會被坑的很慘