requirejs學(xué)習(xí)筆記

requirejs

解決兩個(gè)問(wèn)題:

1.實(shí)現(xiàn)js文件的異步加載拍顷,避免網(wǎng)頁(yè)失去響應(yīng)抚太;

2.管理模塊之間的依賴性,便于代碼的編寫和維護(hù)昔案。

使用方法:

1.官網(wǎng)下載require.js最新版本

2.下載后尿贫,假定把它放在js子目錄下面,就可以加載了

    <script src="js/require.js"></script>

為避免加載這個(gè)文件可能造成網(wǎng)頁(yè)失去響應(yīng)踏揣,解決辦法有兩個(gè):

1.把它放在網(wǎng)頁(yè)底部加載

2.把它寫成:<script src="js/require.js" defer
async="true"> </script>

3.加載我們自己的代碼庆亡,假定我們自己的代碼文件是main.js,也放在js目錄下面捞稿,那么只需要寫成下面這樣就行了:

    <script src="js/require.js" data-main="js/main"></script>

data-main屬性的作用是又谋,指定網(wǎng)頁(yè)程序的主模塊。在上例中娱局,就是js目錄下面的main.js彰亥,這個(gè)文件會(huì)第一個(gè)被require.js加載。由于require.js默認(rèn)的文件后綴名是js衰齐,所以可以把main.js寫成main

4.主模塊寫法:main.js主模塊任斋,就是整個(gè)網(wǎng)頁(yè)的入口代碼

如果我們的代碼不依賴任何其他模塊,那么可以直接寫入javascript代碼

//main.js

alert("加載成功耻涛!");

但這樣的話废酷,就沒(méi)必要使用require.js了,真正常見(jiàn)的情況是犬第,主模塊依賴其他模塊锦积,這時(shí)就要使用AMD規(guī)范定義require()函數(shù)。

//main.js

require(['moduleA','moduleB','moduleC'],function(moduleA,moduleB,moduleC){

    //some code here

});

require()函數(shù)接受兩個(gè)參數(shù):

1.第一個(gè)參數(shù)是一個(gè)數(shù)組歉嗓,表示所依賴的模塊,即主模塊依賴['moduleA','moduleB','moduleC']這三個(gè)模塊

2.第二個(gè)參數(shù)是一個(gè)回調(diào)函數(shù)背蟆,當(dāng)前面指定的模塊都加載成功后鉴分,它將被調(diào)用。加載的模塊會(huì)以參數(shù)形式傳入該函數(shù)带膀,從而在回調(diào)函數(shù)內(nèi)部就可以使用這些模塊志珍。

require()異步加載moduleA,moduleB,moduleC,瀏覽器不會(huì)失去響應(yīng);它指定的回調(diào)函數(shù)垛叨,只有前面的模塊都加載成功后伦糯,才會(huì)運(yùn)行柜某,解決了依賴性的問(wèn)題。

例子:

require(['jquery','undescore','backbone'],function($,_,Backbone){

    //some code here

});

5.模塊的加載

上面實(shí)例中敛纲,主模塊的依賴模塊是['jquery','undescore','backbone']喂击。默認(rèn)情況下,require.js假定這三個(gè)模塊與main.js在同一個(gè)目錄淤翔,文件名分別為jquery.js,underscore.js,backbone.js翰绊,然后自動(dòng)加載。

使用require.config()方法旁壮,我們可以對(duì)模塊的加載行為進(jìn)行自定義监嗜。require.config()就寫在主模塊(main.js)的頭部。參數(shù)就是一個(gè)對(duì)象抡谐,這個(gè)對(duì)象的paths屬性指定各模塊的加載路徑裁奇。

require.config({

   paths:{

      "jquery":"jquery.min",

      "underscore":"underscore.min",

      "backbone":"backbone.min"

   }

});

上面的代碼給出了三個(gè)模塊的文件名,路徑默認(rèn)與main.js在同一個(gè)目錄(js子目錄)麦撵。如果這些模塊在其他目錄刽肠,比如js/lib目錄,則有兩種寫法:
1.逐一指定路徑

       require.config({

           paths:{

              "jquery":"lib/jquery.min",

              "underscore":"lib/underscore.min",

              "backbone": "lib/backbone.min"

           }

       });

2.直接改變基目錄

       require.config({

          baseUrl: "js/lib",

          paths: {

            "jquery":"jquery.min",

             "underscore":"underscore.min",

            "backbone":"backbone.min"

          }

         });

require.js要求厦坛,每個(gè)模塊是一個(gè)單獨(dú)的js文件五垮,這樣的話,如果加載多個(gè)模塊杜秸,就會(huì)發(fā)出多次HTTP請(qǐng)求放仗,會(huì)影響頁(yè)面的加載速度。因此require提供了一個(gè)優(yōu)化工具撬碟,當(dāng)模塊部署完畢后诞挨,可以用這個(gè)工具將多個(gè)模塊合并在一個(gè)文件中,減少HTTP請(qǐng)求數(shù)呢蛤。

6.AMD模塊的寫法

require.js加載的模塊惶傻,采用AMD規(guī)范。也就是說(shuō)其障,模塊必須按照AMD的規(guī)范來(lái)寫银室。具體來(lái)說(shuō),就是模塊必須采用特定的define()函數(shù)來(lái)定義励翼。如果一個(gè)模塊不依賴其他模塊蜈敢,那么可以直接定義在define()函數(shù)中。

假定現(xiàn)在有一個(gè)math.js文件汽抚,它定義了一個(gè)math模塊抓狭,那么,math.js就要這樣寫:

//math.js

define(function(){

    var add = function(x,y){

       return x+y;

    };

    return{

       add:add

    };

});

加載方法如下:

//main.js

require(['math'],function(math){

    alert(math.add(1,1));

});

如果這個(gè)模塊還依賴其他模塊造烁,那么define()函數(shù)的第一個(gè)參數(shù)必須是一個(gè)數(shù)組否过,指明該模塊的依賴性午笛。

define(['myLib'],function(myLib){

    function foo(){

       myLib.doSomething();

    }

    return{

       foo:foo

    };

});

7.加載非規(guī)范的模塊

理論上,require.js加載的模塊苗桂,必須是按照AMD規(guī)范药磺、用define()函數(shù)定義的模塊。但是實(shí)際上誉察,雖然已經(jīng)有一部分流行的函數(shù)庫(kù)(比如jQuery)符合AMD規(guī)范与涡,更多的庫(kù)并不符合。那么持偏,require.js是否能夠加載非規(guī)范的模塊呢驼卖?

回答是可以的。

這樣的模塊在用require()加載之前鸿秆,要先用require.config()方法酌畜,定義它們的一些特征。

舉例來(lái)說(shuō)卿叽,underscore和backbone這兩個(gè)庫(kù)桥胞,都沒(méi)有采用AMD規(guī)范編寫。如果要加載它們的話考婴,必須先定義它們的特征贩虾。

require.config({

    shim: {

      'underscore':{

        exports: '_'

      },

      'backbone': {

        deps:['underscore', 'jquery'],

        exports: 'Backbone'

      }

    }

  });

require.config()接受一個(gè)配置對(duì)象,這個(gè)對(duì)象除了有前面說(shuō)過(guò)的paths屬性之外沥阱,還有一個(gè)shim屬性缎罢,專門用來(lái)配置不兼容的模塊。具體來(lái)說(shuō)考杉,每個(gè)模塊要定義(1)exports值(輸出的變量名)策精,表明這個(gè)模塊外部調(diào)用時(shí)的名稱;

(2)deps數(shù)組崇棠,表明該模塊的依賴性咽袜。
比如,jQuery的插件可以這樣定義:

  shim: {

    'jquery.scroll': {

      deps: ['jquery'],

      exports:'jQuery.fn.scroll'

    }

  }

8.require.js插件

require.js還提供一系列插件枕稀,實(shí)現(xiàn)一些特定的功能询刹。

domready插件,可以讓回調(diào)函數(shù)在頁(yè)面DOM結(jié)構(gòu)加載完成后再運(yùn)行萎坷。

  require(['domready!'],
function (doc){

    // called once the DOM
           is ready

  });

text和image插件范抓,則是允許require.js加載文本和圖片文件。

  define([

    'text!review.txt',

    'image!cat.jpg'

    ],

    function(review,cat){

      console.log(review);

      document.body.appendChild(cat);

    }

  );

類似的插件還有json和mdown食铐,用于加載json文件和markdown文件。
轉(zhuǎn)自阮一峰博客:http://www.ruanyifeng.com/blog/2012/11/require_js.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末僧鲁,一起剝皮案震驚了整個(gè)濱河市虐呻,隨后出現(xiàn)的幾起案子象泵,更是在濱河造成了極大的恐慌,老刑警劉巖斟叼,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偶惠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡朗涩,警方通過(guò)查閱死者的電腦和手機(jī)忽孽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谢床,“玉大人兄一,你說(shuō)我怎么就攤上這事∈锻龋” “怎么了出革?”我有些...
    開(kāi)封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)渡讼。 經(jīng)常有香客問(wèn)我骂束,道長(zhǎng),這世上最難降的妖魔是什么成箫? 我笑而不...
    開(kāi)封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任展箱,我火速辦了婚禮,結(jié)果婚禮上蹬昌,老公的妹妹穿的比我還像新娘混驰。我一直安慰自己,他們只是感情好凳厢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布账胧。 她就那樣靜靜地躺著,像睡著了一般先紫。 火紅的嫁衣襯著肌膚如雪治泥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天遮精,我揣著相機(jī)與錄音居夹,去河邊找鬼。 笑死本冲,一個(gè)胖子當(dāng)著我的面吹牛准脂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播檬洞,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼狸膏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了添怔?” 一聲冷哼從身側(cè)響起湾戳,我...
    開(kāi)封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贤旷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后砾脑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體幼驶,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年韧衣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盅藻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畅铭,死狀恐怖氏淑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顶瞒,我是刑警寧澤夸政,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站榴徐,受9級(jí)特大地震影響守问,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坑资,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一耗帕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧袱贮,春花似錦仿便、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至柒莉,卻和暖如春闻坚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兢孝。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工窿凤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跨蟹。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓雳殊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親窗轩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子夯秃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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