nodeJs中的CommonJs 規範理解
node中使用commonJs規範實現模組記載機制,在這個規範下每個.js檔案都是一個模組,他們內部各自使用的變數名函式名互不衝突。
一個模組要想對外暴露變數(函式也是變數),可以用module.exports = variable;,一個模組要想引用其他模組暴露的變數,用var ref = module.exports("module_name");就拿到可引用模組的變數。
深入解析模組原理:
其實要實現“模組”這個功能,並不需要語法層面的支援,node也沒有增加任何javascript程式碼,核心思路就是利用JS的函數語言程式設計(閉包)。
假設模組hello.js的程式碼為:
var s = 'hello';
var name = 'word';
console.log(s+','+name+'!');
Node.js載入hello模組之後,它可以把程式碼包裝一下,變成這樣:
function(){
//讀取模組hello的程式碼
var s = 'hello';
var name = 'word';
console.log(s+','+name+'!');
}()
這樣看來,每一個引進來的模組都拿一個匿名函式包裹,做到了模組隔離重用可維護,形成了各自的名稱空間。
接下來是模組輸出的實現思路:
node會為每個模組準備一個物件module,示例程式碼:
var module = {
id:"hello",
exports:{}
}
var load = function(module){
//讀取hello模組的程式碼
function greet(name){
console.log('hello'+name+'!');
}
module.exports = greet;
//hello模組程式碼讀取結束
return module.exports;
}
var exported = load(module);
save(module,exported);
可見變數module是node在載入模組前準備的一個變數,並將其傳入載入函式,我們可以在模組中直接使用module變數,實際上是因為該模組的內容被一個已經傳入module引數的函式包裹。通過引數把module傳遞給load函式,元件就可以把一個變數傳遞給執行環境,node會把module儲存到某個地方,node就可以通過module管理所有元件的註冊和呼叫。