模塊
node中的每個js文件,每個依賴都是一個模塊苛预,大大的提高了代碼的可維護性,可避免每個模塊間變量和函數(shù)的沖突笋熬。
模塊采用的規(guī)范是commonJs規(guī)范热某。
模塊原理如下:
這個也很容易實現(xiàn),Node可以先準備一個對象module:
var module = {
id:'hello',
exports:{}
}
var load = function(module){
function greet(name){
console.log(name)
}
module.exports = greet;
return modul.exports;
}
var exported = load(module)
save(modul,exported);
可見,變量module是Node在加載js文件前準備的一個變量昔馋,并將其傳入加載函數(shù)筹吐,我們在hello.js中可以直接使用變量module原因就在于它實際上是函數(shù)的一個參數(shù):
var greet = require('./hello');
module.exports vs exports
很多時候,你會看到秘遏,在Node環(huán)境中丘薛,有兩種方法可以在一個模塊中輸出變量:
方法一:對module.exports賦值:
function hello() {
console.log('Hello, world!');
}
function greet(name) {
console.log('Hello, ' + name + '!');
}
module.exports = {
hello: hello,
greet: greet
};
方法二:直接使用exports:
// hello.js
function hello() {
console.log('Hello, world!');
}
function greet(name) {
console.log('Hello, ' + name + '!');
}
function hello() {
console.log('Hello, world!');
}
exports.hello = hello;
exports.greet = greet;
其實這兩個是同一變量
var module = {
id: 'hello',
exports: {}
};
var load = function (exports, module) {
// hello.js的文件內(nèi)容
...
// load函數(shù)返回:
return module.exports;
};
var exported = load(module.exports, module);
結(jié)論:
如果要輸出一個鍵值對象{},可以利用exports這個已存在的空對象{}邦危,并繼續(xù)在上面添加新的鍵值洋侨;
如果要輸出一個函數(shù)或數(shù)組,必須直接對module.exports對象賦值倦蚪。
所以我們可以得出結(jié)論:直接對module.exports賦值希坚,可以應對任何情況