Javascript模塊化和Node模塊化

1、什么是模塊化

  • 到底什么是模塊化呢?
    • 事實上模塊化開發(fā)最終的目的是將程序劃分成一個個小結(jié)構(gòu)
    • 這個結(jié)構(gòu)編寫屬于自己的邏輯代碼程帕,有自己的作用域,不會影響別人的結(jié)構(gòu)地啰;
    • 該結(jié)構(gòu)可以將自己希望暴露的變量愁拭,函數(shù)對象等導(dǎo)出給其他結(jié)構(gòu)使用。
    • 也可以通過某種方式亏吝,導(dǎo)入另外結(jié)構(gòu)中的變量岭埠、函數(shù)、對象等蔚鸥;
  • 上面說提到的結(jié)構(gòu)惜论,就模塊;按照這種結(jié)構(gòu)劃分開發(fā)程序的過程止喷,就是模塊化開發(fā)的過程

  • 無論你多么喜歡JavaScript馆类,以及它現(xiàn)在發(fā)展的有多好,我們都需要承認(rèn)在 Brendan Eich 用了10天寫出JavaScript的時候弹谁,
    它都有很多的缺陷:
    • 比如var定義的變量作用域問題乾巧;
    • 比如JavaScript的面向?qū)ο蟛⒉荒芟癯R?guī)面向?qū)ο笳Z言一樣使用class句喜;
    • 比如JavaScript沒有模塊化的問題;

2沟于、沒有模塊化帶來很多的問題

  • 早期沒有模塊化帶來了很多的問題:比如命名沖突的問題

    • 命名沖突
  • 當(dāng)然咳胃,我們有辦法可以解決上面的問題:立即函數(shù)調(diào)用表達(dá)式(IIFE)

        // 立即執(zhí)行函數(shù)  
        (function() {
            
        })();
    

  • 但是,我們其實帶來了新的問題:

    • 第一社裆,我必須記得每一個模塊中返回對象的命名拙绊,才能在其他模塊使用過程中正確的使用;
    • 第二泳秀,代碼寫起來混亂不堪标沪,每個文件中的代碼都需要包裹在一個匿名函數(shù)中來編寫
    • 第三嗜傅,在沒有合適的規(guī)范情況下金句,每個人、每個公司都可能會任意命名吕嘀、甚至出現(xiàn)模塊名稱相同的情況违寞;
  • 所以,我們會發(fā)現(xiàn)偶房,雖然實現(xiàn)了模塊化趁曼,但是我們的實現(xiàn)過于簡單,并且是沒有規(guī)范的棕洋。

    • 我們需要制定一定的規(guī)范來約束每個人都按照這個規(guī)范去編寫模塊化的代碼挡闰;
    • 這個規(guī)范中應(yīng)該包括核心功能:模塊本身可以導(dǎo)出暴露的屬性,模塊又可以導(dǎo)入自己需要的屬性掰盘;
    • JavaScript社區(qū)為了解決上面的問題摄悯,涌現(xiàn)出一系列好用的規(guī)范,接下來我們就學(xué)習(xí)具有代表性的一些規(guī)范愧捕。

3奢驯、CommonJS和Node

  • 我們需要知道CommonJS是一個規(guī)范,最初提出來是在瀏覽器以外的地方使用次绘,并且當(dāng)時被命名為ServerJS瘪阁,后來為了
    體現(xiàn)它的廣泛性,修改為CommonJS邮偎,平時我們也會簡稱為CJS管跺。
    • Node是CommonJS在服務(wù)器端一個具有代表性的實現(xiàn);
    • Browserify是CommonJS在瀏覽器中的一種實現(xiàn)钢猛;
    • webpack打包工具具備對CommonJS的支持和轉(zhuǎn)換伙菜;
  • 所以,Node中對CommonJS進(jìn)行了支持和實現(xiàn)命迈,讓我們在開發(fā)node的過程中可以方便的進(jìn)行模塊化開發(fā):
    • 在Node中每一個js文件都是一個單獨的模塊贩绕;
    • 這個模塊中包括CommonJS規(guī)范的核心變量:<font color=red>exports火的、module.exports、require</font>淑倾;
    • 我們可以使用這些變量來方便的進(jìn)行模塊化開發(fā)馏鹤;
  • 前面我們提到過模塊化的核心是導(dǎo)出和導(dǎo)入,Node中對其進(jìn)行了實現(xiàn):
    • exports和module.exports可以負(fù)責(zé)對模塊中的內(nèi)容進(jìn)行導(dǎo)出娇哆;
    • require函數(shù)可以幫助我們導(dǎo)入其他模塊(自定義模塊湃累、系統(tǒng)模塊、第三方庫模塊)中的內(nèi)容碍讨;

4治力、案例設(shè)定

  • 我們來看一下兩個文件:


    兩個文件之間互相引用

5、exports導(dǎo)出

  • 注意:exports是一個對象勃黍,我們可以在這個對象中添加很多個屬性宵统,添加的屬性會導(dǎo)出;

    • exports導(dǎo)出一個對象覆获,導(dǎo)出的內(nèi)容均為exports的屬性
  • 另外一個文件中可以導(dǎo)入:

    • 引入

  • 上面這行完成了什么操作呢马澈?理解下面這句話,Node中的模塊化一目了然

    • 意味著main中的bar變量等于exports對象弄息;
    • 也就是require通過各種查找方式痊班,最終找到了exports這個對象;
    • 并且將這個exports對象賦值給了bar變量摹量;
    • bar變量就是exports對象了涤伐;

    5.1 理解對象的引用賦值

    • 對象引用賦值

    5.2 畫圖解析賦值的過程

    • 對象引用指向共同的堆棧

    5.3 它們實際上是一個淺層拷貝

    • 為了進(jìn)一步論證,bar和exports是同一個對象:
      • 所以荆永,bar對象是exports對象的淺拷貝(引用賦值)废亭;
      • 淺拷貝的本質(zhì)就是一種引用的賦值而已国章;


        淺層拷貝

6具钥、module.exports又是什么?

  • 但是Node中我們經(jīng)常導(dǎo)出東西的時候液兽,又是通過module.exports導(dǎo)出的:
    • <font color=red>module.exports和exports有什么關(guān)系或者區(qū)別呢骂删?</font>
  • 我們追根溯源,通過維基百科中對CommonJS規(guī)范的解析:
    • CommonJS中是沒有module.exports的概念的四啰;
    • 但是為了實現(xiàn)模塊的導(dǎo)出宁玫,Node中使用的是Module的類,每一個模塊都是Module的一個實例柑晒,也就是
      module欧瘪;
    • 所以在Node中真正用于導(dǎo)出的其實根本不是exports,而是module.exports匙赞;
    • 因為<font color=red>module才是導(dǎo)出的真正實現(xiàn)者</font>佛掖;
  • 但是妖碉,為什么exports也可以導(dǎo)出呢?
    • 這是因為module對象的exports屬性是exports對象的一個引用芥被;
    • 在node源碼內(nèi)部做了一個處理欧宜,module.exports = exports
    • 也就是說 module.exports = exports = main中的bar拴魄;

    6.1 畫圖解析賦值的過程

    • 對象引用
    • module.exports賦值成對象冗茸,重新開辟一塊空間

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市匹中,隨后出現(xiàn)的幾起案子夏漱,更是在濱河造成了極大的恐慌,老刑警劉巖顶捷,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件麻蹋,死亡現(xiàn)場離奇詭異,居然都是意外死亡焊切,警方通過查閱死者的電腦和手機(jī)扮授,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來专肪,“玉大人刹勃,你說我怎么就攤上這事『坑龋” “怎么了荔仁?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芽死。 經(jīng)常有香客問我乏梁,道長,這世上最難降的妖魔是什么关贵? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任遇骑,我火速辦了婚禮,結(jié)果婚禮上揖曾,老公的妹妹穿的比我還像新娘落萎。我一直安慰自己,他們只是感情好炭剪,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布练链。 她就那樣靜靜地躺著,像睡著了一般奴拦。 火紅的嫁衣襯著肌膚如雪媒鼓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機(jī)與錄音绿鸣,去河邊找鬼瓷产。 笑死,一個胖子當(dāng)著我的面吹牛枚驻,可吹牛的內(nèi)容都是我干的濒旦。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼再登,長吁一口氣:“原來是場噩夢啊……” “哼尔邓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锉矢,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤梯嗽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沽损,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灯节,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年绵估,在試婚紗的時候發(fā)現(xiàn)自己被綠了炎疆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡国裳,死狀恐怖形入,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缝左,我是刑警寧澤亿遂,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站渺杉,受9級特大地震影響蛇数,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜是越,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一耳舅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧英妓,春花似錦挽放、人聲如沸绍赛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吗蚌。三九已至腿倚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚯妇,已是汗流浹背敷燎。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工暂筝, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硬贯。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓焕襟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饭豹。 傳聞我的和親對象是個殘疾皇子鸵赖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361