十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
本篇內(nèi)容介紹了“什么是nodejs模塊”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、網(wǎng)頁(yè)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、禹王臺(tái)網(wǎng)站維護(hù)、網(wǎng)站推廣。
模塊是Node.js應(yīng)用程序的基本組成部分,文件和模塊是一一對(duì)應(yīng)的,一個(gè)Nodejs模塊就是一個(gè)文件,而這個(gè)文件可能是JavaScript代碼、JSON或者編譯過(guò)的“C/C++”擴(kuò)展,引用模塊可用“require('文件路徑')”語(yǔ)句。
本教程操作環(huán)境:windows7系統(tǒng)、nodejs 12.19.0版、Dell G3電腦。
為了讓Node.js的文件可以相互調(diào)用,Node.js提供了一個(gè)簡(jiǎn)單的模塊系統(tǒng)。
模塊是Node.js 應(yīng)用程序的基本組成部分,文件和模塊是一一對(duì)應(yīng)的。換言之,一個(gè) Node.js 文件就是一個(gè)模塊,這個(gè)文件可能是JavaScript 代碼、JSON 或者編譯過(guò)的C/C++ 擴(kuò)展。
對(duì)于nodejs來(lái)說(shuō),一個(gè)文件就是一個(gè)模塊,你可以export接口出去,也可以require別的模塊進(jìn)來(lái)。
// module1.js exports.func1 = function(){ console.log('func1 from module1 called'); }
module1把函數(shù)func1通過(guò)exports對(duì)象作為模塊的公共訪問(wèn)接口。
//module2.js var in_module1 = require('./module1.js'); in_module1.func1(); exports.func2 = function(){ console.log('func2 from module2 called'); }
module2把module1 require進(jìn)來(lái),這個(gè)時(shí)候,in_module1就相當(dāng)于module1的exports對(duì)象。當(dāng)使用in_module1調(diào)用func1的時(shí)候,相當(dāng)于通過(guò)module1的exports對(duì)象調(diào)用func1。
同時(shí),module2自己的函數(shù)func2也通過(guò)模塊的exports對(duì)象作為module2公共接口。
// module3.js var in_module2 = require('./module2.js'); in_module2.func2();
同理,module3把module2 require進(jìn)來(lái),此時(shí)in_module2就相當(dāng)于module2的exports對(duì)象。
運(yùn)行結(jié)果如下:
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引入模塊不僅僅得到模塊的公共接口,同時(shí)會(huì)把文件里別的語(yǔ)句一并引用進(jìn)來(lái),比如:
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函數(shù),同時(shí)執(zhí)行了module1中的打印語(yǔ)句:
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
現(xiàn)在,module2 載入了module1,module3載入了module2,如果module3再載入一次module1會(huì)怎么樣呢?
// module3.js var in_module1 = require('./module1.js'); var in_module2 = require('./module2.js'); in_module1.func1(); in_module2.func2();
這時(shí)候,module3首先載入了module1,又載入了module2,module2自己又載入了module1的部分,運(yùn)行結(jié)果為
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順序調(diào)整一下:
// module3.js var in_module2 = require('./module2.js'); var in_module1 = require('./module1.js'); in_module1.func1(); in_module2.func2();
運(yùn)行結(jié)果為:
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
看起來(lái)nodejs用某種機(jī)制保證了同一個(gè)模塊在另一個(gè)模塊里不會(huì)被重復(fù)載入,所以
this is in module1
這一行只出現(xiàn)了一次,雖然在module3.js里似乎被載入了兩次。
那么,如果循環(huán)載入了會(huì)發(fā)生什么呢?現(xiàn)在我們讓module1來(lái)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'); }
運(yùn)行結(jié)果如下:
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.(/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. (/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似乎阻止了載入自己的行為,運(yùn)行module2的時(shí)候,行為跟module1沒(méi)有載入module2的結(jié)果一樣,并沒(méi)有報(bào)錯(cuò)。而在運(yùn)行module1的時(shí)候,當(dāng)走到module2里面,忽略了require module1的語(yǔ)句之后,module2調(diào)用了module1的func1,程序出錯(cuò)。
綜上,nodejs里嵌套重復(fù)載入模塊(或者載入自己)的require語(yǔ)句是不能正確執(zhí)行的。
“什么是nodejs模塊”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!