站長資訊網
        最全最豐富的資訊網站

        nodejs模塊是什么

        模塊是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 教程》】

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 无码8090精品久久一区| 熟妇人妻VA精品中文字幕| 西瓜精品国产自在现线| 欧美黑人巨大精品| 国产精品天干天干综合网| 亚洲精品综合久久| 国产精品亚洲综合一区| 国产在线拍揄自揄视精品不卡| 亚洲国产精品一区二区第一页| 国产成人精品一区在线| 国产成人精品日本亚洲18图| 亚洲精品无码不卡在线播放HE| 国产香蕉国产精品偷在线观看| 最新国产精品亚洲| 国产精品91在线| 国内精品伊人久久久久av一坑| 亚洲国产精品无码中文字| 青草青草久热精品视频在线观看| 国产精品免费看久久久香蕉| 欧美日激情日韩精品| 亚洲综合精品香蕉久久网97| 久久久精品一区二区三区| 久久99国产精品久久| 久久精品国产99国产电影网| 99久久精品国产免看国产一区| 久久精品国产亚洲AV麻豆网站| 亚洲AV无码精品色午夜果冻不卡| 亚洲国产91精品无码专区| 亚洲精品久久久www| 亚洲麻豆精品国偷自产在线91| 日韩精品无码永久免费网站| 午夜精品一区二区三区在线视| 欧美在线精品一区二区三区| 久久精品国产黑森林| 日韩蜜芽精品视频在线观看| 日本熟妇亚洲欧美精品区| 全国精品一区二区在线观看| 亚洲精品无码成人片在线观看 | 精品久久久久久无码专区不卡| 亚洲av日韩av天堂影片精品| 久久er99热精品一区二区|