JavaScript模塊化編程那些事

概述

模塊化是將系統(tǒng)分離成獨立功能的方法,這樣我們可以按需加載功能坊萝。

往往當(dāng)一個項目開發(fā)得越來越復(fù)雜時,可能會遇到這些些問題许起,例如:命名沖突十偶、文件依賴等。

總結(jié):在生產(chǎn)的角度园细,模塊化開發(fā)是一種生產(chǎn)方式惦积,這種方式生產(chǎn)效率高,維護(hù)成本低猛频。

模塊化開發(fā)演變

全局函數(shù)

在早期的開發(fā)過程中會將重復(fù)的代碼封裝搭到函數(shù)中狮崩,再將一系列的函數(shù)放到一個文件中。這種方式存在一些問題:存在污染全局變量鹿寻、看不出相互的直接關(guān)系睦柴。這種方式并不能解決根本的問題:命名沖突和文件依賴。

對象命名空間

通過對象命名空間的形式烈和,從某種程度上解決了變量命名沖突的問題爱只,但是并不能從根本上解決命名沖突。存在問題:內(nèi)部狀態(tài)可被外部改寫招刹、命名空間越來越長恬试。

私有公有成員分離

利用此種方式將函數(shù)包裝成一個獨立的作用域,私有空間的變量和函數(shù)不會影響到全局作用域疯暑。這種方式相當(dāng)于現(xiàn)在寫插件的形式训柴,解決了變量命名沖突的問題,但是沒有解決降低開發(fā)復(fù)雜度的問題妇拯。

CommonJS

CommonJS規(guī)范加載模塊是同步的幻馁,也就是說,加載完成才執(zhí)行后面的操作越锈。

CommonJS規(guī)范分為三部分:module(模塊標(biāo)識)仗嗦、require(模塊引用)、exports(模塊定義)甘凭。 module變量在每個模塊內(nèi)部稀拐,就代表當(dāng)前模塊; exports屬性是對外的接口丹弱,用于導(dǎo)出當(dāng)前模塊的方法或變量德撬;require()用來加載外部模塊铲咨,讀取并執(zhí)行js文件,返回該模塊的exports對象蜓洪。

AMD(reuire.js)

AMD也就是異步模塊定義纤勒,它采用異步方式加載模塊,主要針對的是瀏覽器端的模塊規(guī)范隆檀。它通過define方法去定義模塊摇天,require方法去加載模塊。

AMD定義:如果這個模塊還需要依賴其他模塊刚操,那么define函數(shù)的第一個參數(shù)闸翅,必須是一個數(shù)組,指明該模塊的依賴菊霜。

require(['modules'], callback);

第一個參數(shù)['modules']坚冀,是一個數(shù)組,里面的成員就是需要加載的模塊鉴逞;第二個參數(shù)callback记某,則是加載成功之后的回調(diào)函數(shù)。

CMD(sea.js)

CMD即通用模塊定義构捡,CMD規(guī)范是國內(nèi)發(fā)展出來的液南;正如AMD有require.js,CMD有個瀏覽器的實現(xiàn)sea.js勾徽。sea.js要解決的問題和require.js一樣滑凉,只不過在模塊定義方式和模塊加載方式上有所不同。

define(function (require, exports, module) {  
  // 模塊代碼
})

require是可以把其他模塊導(dǎo)入進(jìn)來的一個參數(shù)喘帚;exports可以把模塊內(nèi)的一些屬性和方法導(dǎo)出畅姊;module是一個對象,上面存儲了與當(dāng)前模塊相關(guān)聯(lián)的一些屬性和方法吹由。CMD是按需加載若未,推崇依賴就近,延遲執(zhí)行倾鲫。文件是提前加載好的粗合,只有在require的時候才去執(zhí)行文件;

ES6 Module

ES6模塊化汲取CommonJS和AMD的優(yōu)點乌昔,語法簡潔隙疚,支持異步加載,未來可以成為瀏覽器和服務(wù)器通用的模塊化解決方案磕道。
ES6中模塊的定義:ES6新增了兩個關(guān)鍵字:export和import甚淡。export用于把模塊里的內(nèi)容暴露出來,import用于引入模塊提供的功能。
ES6中模塊的加載贯卦,import加載模塊:

import{bar,foo,test,obj} from './lib'foo();

注意:可以使用export default命令,為模塊指定默認(rèn)輸出焙贷,一個模塊只能有一個默認(rèn)輸出撵割,所以export default只能使用一次。

ES6模塊運行機(jī)制:ES6模塊是動態(tài)引用辙芍,如果使用import從一個模塊加載變量(即import foo from 'foo')啡彬,變量不會被緩存,而是成為一個指向被加載模塊的引用故硅。等腳本執(zhí)行時庶灿,根據(jù)只讀引用,到被加載的那個模塊中去取值吃衅。


一郭鮮
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末往踢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子徘层,更是在濱河造成了極大的恐慌峻呕,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趣效,死亡現(xiàn)場離奇詭異瘦癌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)跷敬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門讯私,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人西傀,你說我怎么就攤上這事斤寇。” “怎么了池凄?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵抡驼,是天一觀的道長。 經(jīng)常有香客問我肿仑,道長致盟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任尤慰,我火速辦了婚禮馏锡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伟端。我一直安慰自己杯道,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布责蝠。 她就那樣靜靜地躺著党巾,像睡著了一般萎庭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上齿拂,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天驳规,我揣著相機(jī)與錄音,去河邊找鬼署海。 笑死吗购,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砸狞。 我是一名探鬼主播捻勉,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼刀森!你這毒婦竟也來了踱启?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤撒强,失蹤者是張志新(化名)和其女友劉穎禽捆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體飘哨,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡胚想,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了芽隆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浊服。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胚吁,靈堂內(nèi)的尸體忽然破棺而出牙躺,到底是詐尸還是另有隱情,我是刑警寧澤腕扶,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布孽拷,位于F島的核電站,受9級特大地震影響半抱,放射性物質(zhì)發(fā)生泄漏脓恕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一窿侈、第九天 我趴在偏房一處隱蔽的房頂上張望炼幔。 院中可真熱鬧,春花似錦史简、人聲如沸乃秀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跺讯。三九已至枢贿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抬吟,已是汗流浹背萨咕。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留火本,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓聪建,卻偏偏與公主長得像钙畔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子金麸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

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

  • 模塊通常是指編程語言所提供的代碼組織機(jī)制擎析,利用此機(jī)制可將程序拆解為獨立且通用的代碼單元。所謂模塊化主要是解決代碼分...
    MapleLeafFall閱讀 1,165評論 0 0
  • 原文鏈接:http://www.cnblogs.com/lvdabao/p/js-modules-develop....
    舌尖上的大胖閱讀 698評論 0 1
  • 有一天我去剃了個光頭挥下,姑且當(dāng)一回和尚揍魂,成為一個名副其實的自稱老衲的小光光。 可是這一切都是裝的棚瘟,就像球場邊的小草现斋,...
    愛佛僧閱讀 659評論 1 5
  • 01、高手都有一個品質(zhì)偎蘸,對人庄蹋,海闊天空;對事迷雪,寸步不讓限书。” 心胸寬廣的人章咧,令人佩服倦西;做事守原則的人,令人尊敬赁严。 0...
    寧靜致遠(yuǎn)hfm閱讀 98評論 0 1
  • 160704 晚餐結(jié)束的時候扰柠,LULU在身后說:做飯其實也挺麻煩的,要買菜误澳,洗菜耻矮,炒完還要洗碗。 只是第十一天忆谓,就...
    XxXxXxN閱讀 126評論 1 3