1. 程式人生 > >nodeJs中的CommonJs 規範理解

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管理所有元件的註冊和呼叫。