標籤:nodejs javascript 前端 require 服務端
Nodejs模仿commonJS模組系統,內建的require函數很容易include存在於各個分離的檔案中的模組。Require函數的準系統是讀取一個javaScript檔案並且執行它,返回exports對象。一個模組的例子:
console.log("evaluating example.js");var invisible = function () { console.log("invisible");}exports.message = "hi";exports.say = function () { console.log(message);}
因此,如果你運行var example =require(‘./example.js‘),結果是example作為一個對象,它的值等於如下:
{ message: "hi", say: [Function]} 如果你想將exports 對象設定為一個函數或者一個新對象,你必須使用moudle.exports對象,舉例:
module.exports = function () { console.log("hello world")}require(‘./example2.js‘)() //require itself and run the exports object
值得注意的是每次你重複require已經require的檔案時,exports對象會緩衝並且重複使用。請看如下解釋:
node> require(‘./example.js‘)evaluating example.js{ message: ‘hi‘, say: [Function] }node> require(‘./example.js‘){ message: ‘hi‘, say: [Function] }node> require(‘./example.js‘).message = "hey" //set the message to "hey"‘hey‘node> require(‘./example.js‘) //One might think that this "reloads" the file...{ message: ‘hey‘, say: [Function] } //...but the message is still "hey" because of the module cache.
從上面的例子可以看出,example.js在第一次被 執行,隨後的require()調用僅僅觸發了模組的緩衝,而不是重新又讀取該檔案。如上所示,這有時會產生副作用。
Require尋找檔案的規則有點複雜。大概的規則是:
(1)如果檔案不是以”/”或”./”開始時,它會認為是一個核心模組(並且本地的node模組會被檢測)或者是一個在本地node_moudles目錄中的依賴;
(2)如果檔案是以”./”開始時,它會認為被requre的檔案是一個相對路徑的檔案;
(3)如果檔案是以”/”開始時,它會認為是絕對路徑。注意:你可以省略”.js”,require會根據需要自動加上”.js”。更詳細的資訊請查看官方文檔。
還有一點需要注意的是:如果傳給require的是一個目錄,它會在目錄中首先尋找package.json,載入main屬性的檔案引用。否則,它會尋找index.js檔案。