首頁  >  文章  >  web前端  >  nodejs模組是什麼

nodejs模組是什麼

青灯夜游
青灯夜游原創
2021-10-29 15:23:031880瀏覽

模組是Node.js應用程式的基本組成部分,檔案和模組是一一對應的,一個Nodejs模組就是一個文件,而這個檔案可能是JavaScript程式碼、JSON或編譯過的「C/ C ”擴展,引用模組可用“require('檔案路徑')”語句。

nodejs模組是什麼

本教學操作環境: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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn