JavaScript中的三種模塊化規(guī)范AMD CMD CommonJS肮之,以及各自的實(shí)現(xiàn)方法:require.js sea.js node.js

為什么要使用模塊化

網(wǎng)站越來越復(fù)雜掉缺,js代碼、js文件也越來越多
    1.命名沖突
    2.文件依賴問題
  • 程序中的模塊化
    • 開發(fā)效率高 一次編寫多次使用
    • 方便維護(hù)了(維護(hù)的成本更低)模塊之間有高耦合低內(nèi)聚的特點(diǎn)

對象封裝

  • 用命名空間的方式進(jìn)行封裝
  • 先約定命名的規(guī)范的形式
  • 對象里面的屬性和方法很容易被修改掉戈擒,很不安全

劃分私有空間

-通過匿名函數(shù)自執(zhí)行的方法封裝模塊眶明,
-可以保護(hù)私有變量和方法

模塊的維護(hù)擴(kuò)展

  • 開閉原則,對修改關(guān)閉筐高,對擴(kuò)展開放搜囱。
  • 增加了代碼的健壯性和容錯(cuò)性

模塊的第三方依賴

  • 模塊職責(zé)唯一性
  • 把依賴的模塊丑瞧,通過依賴注入的形式,在你的參數(shù)上進(jìn)行體現(xiàn)蜀肘。

總結(jié)

  • 最大的問題绊汹,規(guī)范的問題
  • 如果在多人協(xié)作開發(fā)過程中,會(huì)有很大的問題
  • 多人協(xié)作開發(fā)過程中:代碼的風(fēng)格一定要統(tǒng)一

JavaScript模塊化實(shí)現(xiàn)的三種技術(shù)規(guī)范

http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_definition.html 阮一峰博客

實(shí)際上扮宠,這三種第三方框架西乖,目前已經(jīng)很少用了,seajs最近一次更新是在2014年了坛增。因?yàn)镴S現(xiàn)在的語法越來越完善获雕,正在向強(qiáng)語言進(jìn)化,強(qiáng)語言本身就自帶模塊化收捣。

AMD

AMD是"Asynchronous Module Definition"的縮寫典鸡,意思就是"異步模塊定義"。它采用異步方式加載模塊坏晦,模塊的加載不影響它后面語句的運(yùn)行。所有依賴這個(gè)模塊的語句嫁乘,都定義在一個(gè)回調(diào)函數(shù)中昆婿,等到加載完成之后,這個(gè)回調(diào)函數(shù)才會(huì)運(yùn)行蜓斧。

AMD規(guī)范其實(shí)只有一個(gè)主要接口 define(id,dependencies,factory)仓蛆,它要在聲明模塊的時(shí)候指定所有的依賴dependencies,并且還要當(dāng)做形參傳到factory中挎春,對于依賴的模塊提前執(zhí)行看疙,依賴前置

    //定義模塊
    define("module", ["dep1", "dep2"], function(d1, d2) {  
        return someExportedValue;  
    });  
    //引入模塊
    require(["module", "../file"], function(module, file) { 

    });  

優(yōu)點(diǎn):

適合在瀏覽器環(huán)境異步加載
并行加載多個(gè)模塊

缺點(diǎn):

提高開發(fā)成本,代碼閱讀和書寫比較困難
不符合通用的模塊思維方式直奋,是一種妥協(xié)的實(shí)現(xiàn)

實(shí)現(xiàn):
require.js

CMD

CMD規(guī)范和AMD相似能庆,盡量保持簡單,并且與CommonJS和NodeJS的Modules規(guī)范保持了很大的兼容性脚线。

    //定義模塊
    define(function(require, exports, module) {  
        var $ = require('jquery');  
        var Spinning = require('./spinning');  
        exports.doSomething = ...  
        module.exports = ...  
    })  
    //導(dǎo)入模塊
    //第一參數(shù)是入口模塊的路徑
    //第二個(gè)函數(shù)是回調(diào)函數(shù)
     seajs.use('路徑',function(回調(diào)對象){
         //此回調(diào)對象就是moudle.exports對象搁胆。我們可以使用定義模塊中,module.exports對象所有的屬性與方法
     });

優(yōu)點(diǎn):

    依賴就近邮绿,延遲執(zhí)行
    很容易在node中運(yùn)行

缺點(diǎn):

    依賴SPM打包渠旁,模塊的加載邏輯偏重

實(shí)現(xiàn): SeaJS

SeaJS路徑配置

//seajs所在的路徑為默認(rèn)根目錄
seajs.config({
    //配置根目錄
    base: “../sea-modules/”,
    //別名
    alias : {
        “jquery”: “jquery/jquery/1.10.1/jquery.js(路徑)”   //方便調(diào)用
    }
})

CommonJs

CommonJS是在瀏覽器環(huán)境之外構(gòu)建JavaScript生態(tài)系統(tǒng)為目標(biāo)產(chǎn)生的項(xiàng)目,比如服務(wù)器和桌面環(huán)境中船逮。CommonJS規(guī)范是為了解決JavaScript的作用域問題而定義的模塊形式顾腊,可以使每個(gè)模塊在它自身的命名空間中執(zhí)行。

該規(guī)范的主要內(nèi)容是:模塊必須通過 module.exports導(dǎo)出對外的變量或接口挖胃,通過require()來導(dǎo)入其他模塊的輸出到當(dāng)前模塊杂靶。

//定義模塊
exports.doStuff = function() {};  
module.exports = someValue; 

//引入模塊  -- 同步執(zhí)行梆惯,不用回調(diào)
require("module");  
require("../file.js");  

優(yōu)點(diǎn):

服務(wù)器端便于重用
NPM中已經(jīng)將近20w個(gè)模塊包
簡單并容易使用

缺點(diǎn):

同步的模塊方式不適合不適合在瀏覽器環(huán)境中,同步意味著阻塞加載伪煤,瀏覽器資源是異步加載的
不能非阻塞的并行加載多個(gè)模塊

實(shí)現(xiàn):node.js

nodejs中加袋,原生已經(jīng)實(shí)現(xiàn)了模塊化,已經(jīng)不需要導(dǎo)入第三方庫了抱既,可以直接require()

服務(wù)器端與瀏覽器端的技術(shù)選型职烧?

服務(wù)器端模塊化規(guī)范 -- CommonJS

老實(shí)說,在瀏覽器環(huán)境下防泵,沒有模塊也不是特別大的問題蚀之,畢竟網(wǎng)頁程序的復(fù)雜性有限;但是在服務(wù)器端捷泞,一定要有模塊足删,與操作系統(tǒng)和其他應(yīng)用程序互動(dòng),否則根本沒法編程锁右。

node.js的模塊系統(tǒng)失受,就是參照CommonJS規(guī)范實(shí)現(xiàn)的。在CommonJS中咏瑟,有一個(gè)全局性方法require()拂到,用于加載模塊

瀏覽器端 -- AMD(requirejs) CMD(Seajs)

因?yàn)榉?wù)器與APP都是加載的本地的資源,所以码泞,不用回調(diào)這種操作兄旬,同步依次上下執(zhí)行即可,導(dǎo)入操作 不會(huì)像瀏覽器端這樣余寥,占用太長時(shí)間领铐。
因?yàn)樯厦孢@個(gè)原因,瀏覽器端宋舷,只能選擇 AMD - CMD 兩種規(guī)范绪撵,異步執(zhí)行,不阻塞線程肥缔。

了解SeaJS莲兢,以及Seajs與requirejs之間的區(qū)別?

定義模塊 define

  • 定義模塊 define(function(){})
  • 函數(shù)體內(nèi)的方法屬性都屬于這個(gè)方法续膳,對外有封裝性;解決了命名沖突問題改艇,使js代碼有了封裝性
  • 直接調(diào)用 jQuery 插件等非標(biāo)準(zhǔn)模塊的方法 http://my.oschina.net/briviowang/blog/208587
    //定義模塊
    /*
    require
        加載文件依賴、模塊依賴的坟岔,用于define函數(shù)體內(nèi)
        在一個(gè)模塊系統(tǒng)中谒兄,`require` 加載過的模塊會(huì)被緩存
        默認(rèn) `require` 是同步加載模塊的

    exports 和 module.exports
        module.exports曝露出一個(gè)完整的對象,只能扔一次只能曝露出來一個(gè)
        exports是module.exports的別名社付,可以用來單個(gè)屬性承疲、方法邻耕、對象的曝露,用.的形式,exports能做的事情module.exports也可以做
    */

    define(function(require, exports, module) {  
        var $ = require('jquery');  
        var Spinning = require('./spinning');  
        exports.doSomething = ...  
        module.exports = ...  
})  

啟動(dòng)模塊 seajs.use

  • 加載入口模塊燕鸽,我們把define定義的js就叫模塊
  • 這個(gè)用于在html代碼里面的加載
  • seajs使用的時(shí)候兄世,可以先在配置文件中,修改base設(shè)置基本路徑啊研,以后加載御滩,都是相對seajs文件所在文件,但是安全起見党远,最好少用削解。
導(dǎo)入模塊
    /*
    第一參數(shù)是入口模塊的路徑
    第二個(gè)函數(shù)是回調(diào)函數(shù)
    */
     seajs.use('路徑',function(回調(diào)對象){
         //此回調(diào)對象就是moudle.exports對象。我們可以使用定義模塊中沟娱,module.exports對象所有的屬性與方法
     });
    //seajs.use 和 Document 的 ready 沒有任何關(guān)系
    //要想保證 文檔結(jié)構(gòu)加載完畢再執(zhí)行你的 js 代碼氛驮,一定要在 seajs.use  內(nèi)部通過 window.onload 或者 $(function(){})

requirejs與seajs的區(qū)別

requirejs是優(yōu)先加載的
seajs是懶加載的,就是有拖延癥济似,用的時(shí)候才加載

http://www.requirejs.cn/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矫废,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子砰蠢,更是在濱河造成了極大的恐慌磷脯,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娩脾,死亡現(xiàn)場離奇詭異,居然都是意外死亡打毛,警方通過查閱死者的電腦和手機(jī)柿赊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幻枉,“玉大人碰声,你說我怎么就攤上這事“靖Γ” “怎么了胰挑?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長椿肩。 經(jīng)常有香客問我瞻颂,道長,這世上最難降的妖魔是什么郑象? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任贡这,我火速辦了婚禮,結(jié)果婚禮上厂榛,老公的妹妹穿的比我還像新娘盖矫。我一直安慰自己丽惭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布辈双。 她就那樣靜靜地躺著责掏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪湃望。 梳的紋絲不亂的頭發(fā)上换衬,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音喜爷,去河邊找鬼冗疮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛檩帐,可吹牛的內(nèi)容都是我干的术幔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼湃密,長吁一口氣:“原來是場噩夢啊……” “哼诅挑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泛源,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤拔妥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后达箍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體没龙,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年缎玫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硬纤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赃磨,死狀恐怖筝家,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邻辉,我是刑警寧澤溪王,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站值骇,受9級特大地震影響莹菱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吱瘩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一芒珠、第九天 我趴在偏房一處隱蔽的房頂上張望晋修。 院中可真熱鬧嘁锯,春花似錦蘸秘、人聲如沸恨搓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫂易。三九已至,卻和暖如春掐禁,著一層夾襖步出監(jiān)牢的瞬間怜械,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工傅事, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缕允,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓蹭越,卻偏偏與公主長得像障本,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子响鹃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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