模組是Node.js應用程式的基本組成部分,檔案和模組是一一對應的,一個Nodejs模組就是一個文件,而這個檔案可能是JavaScript程式碼、JSON或編譯過的「C/ C ”擴展,引用模組可用“require('檔案路徑')”語句。
本教學操作環境:windows7系統、nodejs 12.19.0版、Dell G3電腦。
為了讓Node.js的檔案可以互相調用,Node.js提供了一個簡單的模組系統。
模組是Node.js 應用程式的基本組成部分,檔案和模組是一一對應的。換言之,一個 Node.js 檔案就是一個模組,而這個檔案可能是JavaScript 程式碼、JSON 或編譯過的C/C 擴充。
對於nodejs來說,一個檔案就是一個模組,你可以export介面出去,也可以require別的模組進來。
// module1.js exports.func1 = function(){ console.log('func1 from module1 called'); }
module1把函數func1透過exports物件當作模組的公共存取介面。
//module2.js var in_module1 = require('./module1.js'); in_module1.func1(); exports.func2 = function(){ console.log('func2 from module2 called'); }
module2把module1 require進來,這個時候,in_module1就相當於module1的exports物件。使用in_module1呼叫func1的時候,相當於透過module1的exports物件呼叫func1。
同時,module2自己的函式func2也透過模組的exports物件作為module2公共介面。
// module3.js var in_module2 = require('./module2.js'); in_module2.func2();
同理,module3把module2 require進來,此時in_module2就相當於module2的exports物件。
運行結果如下:
rlan@rlan-LA:~/nodejs/nodetest$ node module2.js func1 from module1 called rlan@rlan-LA:~/nodejs/nodetest$ node module3.js func1 from module1 called func2 from module2 called
nodejs引入模組不僅僅得到模組的公共接口,同時會把文件裡別的語句一併引用進來,比如:
module1 .js改為
// module2.js console.log('this is in module2'); var in_module1 = require('./module1.js'); in_module1.func1(); exports.func2 = function(){ console.log('func2 from module2 called'); }
module2引入了module1的func1函數,同時執行了module1中的列印語句:
rlan@rlan-LA:~/nodejs/nodetest$ node module1.js this is in module1 rlan@rlan-LA:~/nodejs/nodetest$ node module2.js this is in module2 - module2 self this is in module1 - require module1 func1 from module1 called - module2 self
現在,module2 載入了module1,module3載入了module2,如果module3再載入一次module1會怎麼樣呢?
// module3.js var in_module1 = require('./module1.js'); var in_module2 = require('./module2.js'); in_module1.func1(); in_module2.func2();
這時候,module3先載入了module1,又載入了module2,module2自己又載入了module1的部分,運行結果為
rlan@rlan-LA:~/nodejs/nodetest$ node module3.js this is in module1 - require module1 this is in module2 - require module2 func1 from module1 called - require module2 func1 from module1 called - module3 self func2 from module2 called - module3 self
假如把module3的require順序調整一下:
// module3.js var in_module2 = require('./module2.js'); var in_module1 = require('./module1.js'); in_module1.func1(); in_module2.func2();
運行結果為:
rlan@rlan-LA:~/nodejs/nodetest$ node module3.js this is in module2 - require module2 this is in module1 - require module2 func1 from module1 called - require module2 func1 from module1 called - module3 self func2 from module2 called - module3 self
看起來nodejs用某種機制保證了同一個模組在另一個模組裡不會被重複載入,所以
this is in module1
這一行只出現了一次,雖然在module3.js裡似乎被載入了兩次。
那麼,如果循環載入了會發生什麼事呢?現在我們讓module1來require module2:
// module1.js console.log('this is in module1'); var in_module2 = require('./module2.js'); exports.func1 = function(){ console.log('func1 from module1 called'); }
// module2.js console.log('this is in module2'); var in_module1 = require('./module1.js'); in_module1.func1(); exports.func2 = function(){ console.log('func2 from module2 called'); }
運行結果如下:
rlan@rlan-LA:~/nodejs/nodetest$ node module1.js this is in module1 this is in module2 /home/rlan/nodejs/nodetest/module2.js:4 in_module1.func1(); ^ TypeError: in_module1.func1 is not a function at Object.<anonymous> (/home/rlan/nodejs/nodetest/module2.js:4:12) at Module._compile (module.js:410:26) at Object.Module._extensions..js (module.js:417:10) at Module.load (module.js:344:32) at Function.Module._load (module.js:301:12) at Module.require (module.js:354:17) at require (internal/module.js:12:17) at Object.<anonymous> (/home/rlan/nodejs/nodetest/module1.js:3:18) at Module._compile (module.js:410:26) at Object.Module._extensions..js (module.js:417:10) rlan@rlan-LA:~/nodejs/nodetest$ node module2.js this is in module2 this is in module1 func1 from module1 called
nodejs似乎阻止了載入自己的行為,運行module2的時候,行為跟module1沒有載入module2的結果一樣,並沒有報錯。而在執行module1的時候,走到module2裡面,忽略了require module1的語句之後,module2呼叫了module1的func1,程式出錯。
綜上,nodejs裡巢重複載入模組(或載入自己)的require語句是無法正確執行的。
【推薦學習:《nodejs 教學》】
以上是nodejs模組是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!