03Node模塊化

Node.js采用的是CommonJs規(guī)范,在NodeJS中,一般將代碼合理拆分到不同的JS文件中政勃,每一個(gè)文件就是一個(gè)模塊,而文件路徑就是模塊名兼砖。 在編寫每個(gè)模塊時(shí)奸远,都有require、exports讽挟、module三個(gè)預(yù)先定義好的變量可供使用懒叛。

Node.js中模塊的分類:

  • 核心模塊(已經(jīng)封裝好的內(nèi)置模塊);
  • 自己定義的模塊耽梅;
  • 第三方的模塊(npm下載下來(lái)的)薛窥;

1. require

require函數(shù)用來(lái)在一個(gè)模塊中引入另外一個(gè)模塊。傳入一個(gè)模塊名眼姐,返回一個(gè)模塊導(dǎo)出對(duì)象诅迷。用法:let cc = require("模塊名") ,其中模塊名可以用絕對(duì)路徑也可以用相對(duì)路徑,模塊的后綴名.js可以省略众旗。例如:

let cc1 = require('./main.js')
let cc2 = require('home/src/main.js')
let cc3 = require('./main')

require()函數(shù)用兩個(gè)作用:

  • 執(zhí)行導(dǎo)入的模塊中的代碼竟贯;
  • 返回導(dǎo)入模塊中的接口對(duì)象屑那;

require方法加載第三方包的原理機(jī)制:

  1. require('第三方包名')優(yōu)先在加載該包的模塊的同級(jí)目錄node_modules中查找第三方包。
let template = require('art-template') //加載第三方包
  1. 找到該第三方包中的package.json文件持际,并且找到里面的main屬性對(duì)應(yīng)的入口模塊沃琅,該入口模塊即為加載的第三方模塊。

  2. 如果在要加載的第三方包中沒(méi)有找到package.json文件或者是package.json文件中沒(méi)有main屬性蜘欲,則默認(rèn)加載第三方包中的index.js文件益眉。

  3. 如果在加載第三方模塊的文件的同級(jí)目錄沒(méi)有找到node_modules文件夾,或者以上所有情況都沒(méi)有找到姥份,則會(huì)向上一級(jí)父級(jí)目錄下查找node_modules文件夾郭脂,查找規(guī)則如上一致。

  4. 如果一直找到該模塊的磁盤根路徑都沒(méi)有找到澈歉,則會(huì)報(bào)錯(cuò):can not find module xxx展鸡。

2. exports

exports對(duì)象用來(lái)導(dǎo)出當(dāng)前模塊的公共方法或?qū)傩裕瑒e的模塊通過(guò)require函數(shù)使用當(dāng)前模塊時(shí)得到的就是當(dāng)前模塊的exports對(duì)象埃难。用法:exports.name,name為導(dǎo)出的對(duì)象名。例子:

exports.add = function () {
  let i = 0
  console.log(++i)
}

導(dǎo)出一個(gè)add方法供其他模塊使用

其實(shí)exports類似于ES6中的export的用法涡尘,用來(lái)導(dǎo)出一個(gè)指定名字的對(duì)象忍弛。

3. module.exports

module.exports用來(lái)導(dǎo)出一個(gè)默認(rèn)對(duì)象细疚,沒(méi)有指定對(duì)象名,常見于修改模塊的原始導(dǎo)出對(duì)象惠昔。比如原本模塊導(dǎo)出的是一個(gè)對(duì)象,我們可以通過(guò)module.exports修改為導(dǎo)出一個(gè)函數(shù)挑势。如下:

module.exports = function () {
  console.log('hello world镇防!')
}

4. 模塊的初始化

一個(gè)模塊中的JS代碼僅在模塊第一次被使用時(shí)執(zhí)行一次,并且在使用的過(guò)程中進(jìn)行初始化潮饱,之后緩存起來(lái)便于后續(xù)繼續(xù)使用。

5. 主模塊

通過(guò)命令行參數(shù)傳遞給NodeJS以啟動(dòng)程序的模塊被稱為主模塊啦扬。主模塊負(fù)責(zé)調(diào)度組成整個(gè)程序的其它模塊完成工作。例如通過(guò)以下命令啟動(dòng)程序時(shí)瞄摊,main.js就是主模塊。

$ node main.js // 運(yùn)行main.js啟動(dòng)程序蹲嚣,main.js稱為主模塊

完整實(shí)例:

在項(xiàng)目中我們有個(gè)hello.js文件说贝,里面定義了一個(gè)求和的函數(shù)

var a = 1;

function add () {
  return ++a;
}

exports.add = add

我們?cè)陧?xiàng)目的主模塊 main.js中引入hello.js

var add1 = require('./hello')
var add2 = require('./hello')

console.log(add1.add())
console.log(add2.add())

該程序運(yùn)行的結(jié)果如下:

$ node main.js
2
3

我們可以看到hello.js并沒(méi)有別引入兩次而初始化兩次哗总,說(shuō)明模塊只會(huì)在執(zhí)行的過(guò)程中被初始化一次。

總結(jié)

  1. Node中每個(gè)模塊都有一個(gè)module對(duì)象谆趾,module對(duì)象中的有一個(gè)exports屬性為一個(gè)接口對(duì)象,我們需要把模塊之間公共的方法或?qū)傩話燧d在這個(gè)接口對(duì)象中叛本,方便其他的模塊使用這些公共的方法或?qū)傩浴?/li>
  2. Node中每個(gè)模塊的最后沪蓬,都會(huì)return: module.exports来候。
  3. Node中每個(gè)模塊都會(huì)把module.exports指向的對(duì)象賦值給一個(gè)變量exports营搅,也就是說(shuō):exports = module.exports云挟。
  4. module.exports = XXX,表示當(dāng)前模塊導(dǎo)出一個(gè)單一成員转质,結(jié)果就是XXX。
  5. 如果需要導(dǎo)出多個(gè)成員時(shí)必須使用exports.add = XXX; exports.foo = XXX;或者使用module.exports.add = XXX; module.export.foo = XXX;沸枯。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末日矫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辉饱,更是在濱河造成了極大的恐慌搬男,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彭沼,死亡現(xiàn)場(chǎng)離奇詭異缔逛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)姓惑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門褐奴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人于毙,你說(shuō)我怎么就攤上這事敦冬。” “怎么了唯沮?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵脖旱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我介蛉,道長(zhǎng)萌庆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任币旧,我火速辦了婚禮践险,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吹菱。我一直安慰自己巍虫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布鳍刷。 她就那樣靜靜地躺著占遥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪输瓜。 梳的紋絲不亂的頭發(fā)上瓦胎,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音前痘,去河邊找鬼凛捏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芹缔,可吹牛的內(nèi)容都是我干的坯癣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼最欠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼示罗!你這毒婦竟也來(lái)了惩猫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蚜点,失蹤者是張志新(化名)和其女友劉穎轧房,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绍绘,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奶镶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陪拘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厂镇。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖左刽,靈堂內(nèi)的尸體忽然破棺而出捺信,到底是詐尸還是另有隱情,我是刑警寧澤欠痴,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布迄靠,位于F島的核電站,受9級(jí)特大地震影響喇辽,放射性物質(zhì)發(fā)生泄漏掌挚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一茵臭、第九天 我趴在偏房一處隱蔽的房頂上張望疫诽。 院中可真熱鬧舅世,春花似錦旦委、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至罢低,卻和暖如春查辩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背网持。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工宜岛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人功舀。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓萍倡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親辟汰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子列敲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容