一、CommonJS規(guī)范
1、簡介
Node應(yīng)用由模塊組成,采用CommonJS規(guī)范。每一個文件就是一個模塊,有自己的作用域。在一個文件里面定義的變量、函數(shù)、類都是私有的,對其他文件不可見。
2、基本語法
- 定義暴露模塊: exports.xxx = value 或者module.exports = value
- 引入模塊:require(xxx),如果是Node提供的核心模塊,xxx就是模塊名稱;如果是由用戶編寫的文件模塊,xxx為文件模塊的路徑。
for example 1:
exports.name="jinggege";
exports.age = 18;
exports.add = function(a,b){
return a+b;
}
引入模塊打印結(jié)果如下圖:
image
exports.xxx 是給exports對象添加屬性,可以多次添加.
for example 2:
module.exports = {
name:'jinggege',
age:18
}
module.exports = {
add:function(a,b){
return a+b;
}
}
引入模塊打印結(jié)果如下圖:
image
module.exports 是給module對象的exports屬性賦值,再次添加會將上次的值覆蓋掉,只能添加一次。
3、實(shí)現(xiàn)原理
那CommonJS暴露的到底是什么呢?
CommonJS規(guī)范規(guī)定,每個模塊內(nèi)部,module變量表示當(dāng)前模塊。這個變量是一個對象,它的exports屬性(module.exports)是對外的接口。暴露模塊的本質(zhì)是:將exports對象暴露。加載某個模塊,其實(shí)是加載該模塊的exports屬性。
那在模塊中,我們并未看到定義module這個變量,這個變量到底是誰提供的呢?
我們通過在模塊中打印 arguments.callee 可以觀察到當(dāng)前執(zhí)行的函數(shù)對象
exports.a = 10
console.log(arguments.callee + '')
image
由打印結(jié)果我們可以發(fā)現(xiàn),當(dāng)node在執(zhí)行模塊代碼時,它會給代碼的外層裹上一個函數(shù),這個函數(shù)有五個參數(shù),分別是:
- exports:該對象用來將變量或函數(shù)暴露到外部
- require:函數(shù),用來引入外部的模塊
- module:module代表的是當(dāng)前模塊本身,exports就是module的屬性,所以我們既可以使用exports導(dǎo)出,也可以使用module.exports導(dǎo)出。
- __filename : 表示當(dāng)前模塊的完整路徑
- __dirname:表示當(dāng)前模塊所在文件夾的完整路徑