node.js api系統(tǒng)性學(xué)習(xí)1 require用法

先講講模塊加載機(jī)制

require() __filename,__dirname 實(shí)際上不是一個(gè)全部變量,而是每個(gè)模塊內(nèi)部的。
我所講的是當(dāng)前版本6.10的版本,比較穩(wěn)定的
在node.js 模塊和文件是一一對(duì)應(yīng)的损搬,一個(gè)模塊就是一個(gè)文件

__filename是打印出當(dāng)前文件所在的絕對(duì)路徑
__dirname是打印出當(dāng)前文件所在的文件夾目錄

現(xiàn)在比方說在一個(gè)同目錄下叫node文件夾

b.js

let a = "我是b模塊"
console.log(a) 

a.js

 require("./b.js')  //我是b模塊

如果我們?cè)贀Q個(gè)方式想我們既然把b.js模塊加載進(jìn)來了,我們也可以使用b.js里的a 變量
a.js

 require("./b.js')  
console.log(a) //會(huì)報(bào)一個(gè)錯(cuò)柜与,會(huì)報(bào)a is not defined

這是為什么呢巧勤?
這是因?yàn)槟K加載機(jī)制,模塊看似本地變量的全局變量但是在導(dǎo)入其它模塊中就是一個(gè)私有變量弄匕,在其它模塊是訪問不到的颅悉,除了你export出去等方法
這是因?yàn)樵趫?zhí)行模塊代碼之前,Node.js 會(huì)使用一個(gè)如下的函數(shù)包裝器將其包裝:

(function (exports, require, module, __filename, __dirname) {
// 你的模塊代碼實(shí)際上在這里
});

它保持了頂層的變量(用 var粘茄、const 或 let 定義)作用在模塊范圍內(nèi)签舞,而不是全局對(duì)象。
它有助于提供一些看似全局的但實(shí)際上是模塊特定的變量柒瓣,例如:
實(shí)現(xiàn)者可以使用 module 和 exports 對(duì)象從模塊中導(dǎo)出值。
快捷變量 __filename 和 __dirname 包含模塊的絕對(duì)文件名和目錄路徑吠架。

如果在a模塊導(dǎo)入b模塊的方法
我們可以把所有方法掛在exports對(duì)象上面導(dǎo)入a模塊
b.js

exports.add = (a) => {
    console.log(a+1)
}

exports.reduce =(a) => {
    console.log(a-1)
}

a.js

const demo = require('./b.js')  //用demo這個(gè)變最去接收這個(gè)b.js文件導(dǎo)出來的export對(duì)象 
demo.add(1)    //2             用點(diǎn)來調(diào)用掛在上面的方法
demo.reduce(1) //0

如果你想導(dǎo)出一整個(gè)對(duì)象或者構(gòu)造函數(shù)芙贫,你可以用module.exports來導(dǎo)出,是用來導(dǎo)出一整個(gè)對(duì)象
b.js

module.exports = (a)=>{
     return {
        add () {
            console.log(a+1)
        },
        reduce () {
            console.log(a-1)
        }
     }
}

因?yàn)楹瘮?shù)也是對(duì)象傍药,return出去一個(gè)對(duì)象磺平,掛著add 和 reduce方法

a.js

const b = require('./b.js')

var demo = b(1) 
demo.add()  //2
demo.reduce() //0
訪問主模塊

還是前面的例子
require.main代表node運(yùn)行的主模塊魂仍,想當(dāng)于module === 主模塊
b.js

console.log(require.main === module)

運(yùn)行node b.js 會(huì)發(fā)現(xiàn) 返回true 因?yàn)閎.js是node運(yùn)行的主模塊

a.js

require(./b.js)
console.log(require.main === module)

運(yùn)行node a.js會(huì)發(fā)現(xiàn) 返回false ,true
因?yàn)榈谝粋€(gè)false是b.js打印出來的,因?yàn)榇藭r(shí)主模塊已經(jīng)變成了a.js
第二個(gè)true 是a.js打印出來的拣挪,因?yàn)榇藭r(shí)主模塊已經(jīng)是a.js了

前面說過每個(gè)文件都是一個(gè)模塊擦酌,也可以看作成一個(gè)對(duì)象,模塊自帶一個(gè)filename屬性菠劝,代表此模塊絕對(duì)路徑存放的地方

b.js

console.log( module.filename)

a.js

require(./b.js)
console.log( module.filename)

運(yùn)行node a.js會(huì)發(fā)現(xiàn) 打印出來赊舶,這個(gè)是我存放文件或者模塊的絕對(duì)路徑
D:\node\b.js
D:\node\a.js

再來看看 require.mian.filename
這個(gè)代表模塊運(yùn)行時(shí)候主模塊的絕對(duì)路徑,什么意思呢赶诊,不大好理解笼平,我給大家演示一下

b.js

console.log(require.main.filename)

如果我先單獨(dú)運(yùn)行node b.js會(huì)發(fā)現(xiàn)
D:\node\b.js 這個(gè)很顯然因?yàn)檫\(yùn)行的主模塊是b.js所以此模塊運(yùn)行時(shí)主模塊的絕對(duì)路徑就是自己

a.js

require(./b.js)
console.log( module.filename)

我們把b.js引入a.js中我們?cè)賜ode a.js運(yùn)行一下看看什么結(jié)果
D:\node\a.js
D:\node\a.js
我們會(huì)發(fā)現(xiàn)無論是 b.js 還是 a.js模塊打印出來的都是 D:\node\a.js 因?yàn)楝F(xiàn)在node主入口運(yùn)行的文件就是a.js所以 他里面所有引入的模塊都是從這個(gè)a.js主模塊的路徑進(jìn)入的,所以b.js主模塊路徑也是D:\node\a.js舔痪,這個(gè)比較煩大家可以去試一下就明白了

模塊加載機(jī)制

  1. 如果 X 是一個(gè)文件寓调,加載 X 作為 JavaScript 文本。結(jié)束
  2. 如果 X.js 是一個(gè)文件锄码,加載 X.js 作為 JavaScript 文本夺英。結(jié)束
  3. 如果 X.json 是一個(gè)文件,解析 X.json 成一個(gè) JavaScript 對(duì)象滋捶。結(jié)束
  4. 如果 X.node 是一個(gè)文件秋麸,加載 X.node 作為二進(jìn)制插件。結(jié)束

在Node.js中炬太,可以使用require.resolve函數(shù)來查詢某個(gè)模塊文件的帶有完整絕對(duì)路徑的文件名灸蟆,代碼如下所示。
b.js

let b = require.resolve("./b.js")
console.log(b) 

運(yùn)行node b.js 會(huì)發(fā)現(xiàn)打印出來此時(shí)./b.js文件的絕對(duì)路徑
D:\node\b.js
注意不會(huì)加載此文件亲族,只是返回此文件的絕對(duì)路徑

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炒考,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子霎迫,更是在濱河造成了極大的恐慌斋枢,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件知给,死亡現(xiàn)場(chǎng)離奇詭異瓤帚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)涩赢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門戈次,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人筒扒,你說我怎么就攤上這事怯邪。” “怎么了花墩?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵悬秉,是天一觀的道長(zhǎng)澄步。 經(jīng)常有香客問我,道長(zhǎng)和泌,這世上最難降的妖魔是什么村缸? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮武氓,結(jié)果婚禮上梯皿,老公的妹妹穿的比我還像新娘。我一直安慰自己聋丝,他們只是感情好索烹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弱睦,像睡著了一般百姓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上况木,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天垒拢,我揣著相機(jī)與錄音,去河邊找鬼火惊。 笑死求类,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屹耐。 我是一名探鬼主播尸疆,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼惶岭!你這毒婦竟也來了寿弱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤按灶,失蹤者是張志新(化名)和其女友劉穎症革,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸯旁,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡噪矛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铺罢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艇挨。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖畏铆,靈堂內(nèi)的尸體忽然破棺而出雷袋,到底是詐尸還是另有隱情,我是刑警寧澤辞居,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布楷怒,位于F島的核電站,受9級(jí)特大地震影響瓦灶,放射性物質(zhì)發(fā)生泄漏鸠删。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一贼陶、第九天 我趴在偏房一處隱蔽的房頂上張望刃泡。 院中可真熱鬧,春花似錦碉怔、人聲如沸烘贴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桨踪。三九已至,卻和暖如春芹啥,著一層夾襖步出監(jiān)牢的瞬間锻离,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工墓怀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汽纠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓傀履,卻偏偏與公主長(zhǎng)得像虱朵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钓账,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 模塊 Node 有簡(jiǎn)單的模塊加載系統(tǒng)碴犬。在 Node 里,文件和模塊是一一對(duì)應(yīng)的官扣。下面例子里翅敌,foo.js加載同一個(gè)...
    保川閱讀 596評(píng)論 0 0
  • Node.js是目前非常火熱的技術(shù)惕蹄,但是它的誕生經(jīng)歷卻很奇特蚯涮。 眾所周知,在Netscape設(shè)計(jì)出JavaScri...
    Myselfyan閱讀 4,071評(píng)論 2 58
  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宮若石閱讀 1,078評(píng)論 0 1
  • 個(gè)人入門學(xué)習(xí)用筆記卖陵、不過多作為參考依據(jù)遭顶。如有錯(cuò)誤歡迎斧正 目錄 簡(jiǎn)書好像不支持錨點(diǎn)、復(fù)制搜索(反正也是寫給我自己看...
    kirito_song閱讀 2,467評(píng)論 1 37
  • No.63 一天結(jié)束,表現(xiàn)一般,思考很多铣揉。 今天饶深,參與了一場(chǎng)慶典活動(dòng),作為活動(dòng)中重要的音響師逛拱,我卻在會(huì)議開始前5分...
    水淺_bling閱讀 352評(píng)論 3 1