RequireJS用法解析

1角寸、概述
requirejs 的相關(guān)說明:

RequireJS是一個非常小巧的JavaScript模塊載入框架殴蓬,是AMD規(guī)范最好的實現(xiàn)者之一鸟款。最新版本的RequireJS壓縮后只有14K私股,堪稱非常輕量割捅。它還同時可以和其他的框架協(xié)同工作,使用RequireJS可以提升前端代碼質(zhì)量璧榄。

主要特點:
  • 異步加載模塊
  • 按依賴順序加載
  • 模塊依賴前置

2特漩、define 和 require

在整個require中,主要的方法為:require和define

(1)define定義模塊

函數(shù)方法:

define(id?, dependencies?, factory)

總共有三個參數(shù):id 定義的模塊名字骨杂,一般在config 中會定義涂身;dependencies為需要的依賴模塊;factory為定義的模塊搓蚪。其中factory 為必填蛤售,另外兩個為非必填項。
根據(jù)上面的參數(shù)配置可以看出妒潭,define 總共分為兩種悴能,第一種為獨立模塊,不依賴其他模塊雳灾。第二種為非獨立模塊漠酿,需要依賴其他模塊。
注:define定義的模塊可以返回任何值谎亩,不限于對象记靡。

獨立模塊

一種通過一個對象簡易定義:

define({
    name: "aimee",
    method1: function() {},
    method2: function() {}
})

*注:這樣定義的對象如果被多處引用谈竿,那么引用的地方會共享這個對象的引用。
另一種通過一個函數(shù)來定義副本對象模塊:

define(function () {
    //Do setup work here
    return {
        name: "aimee",
        method1: function() {},
        method2: function() {}
    }
})

這種自由度更高摸吠,可以在函數(shù)中處理其他邏輯。

非獨立模塊
需要引入依賴模塊嚎花,在其他模塊加載完寸痢,定義自己的模塊,此時返回的method方法中包含模塊1 和模塊2的函數(shù)的調(diào)用紊选。

define(['module1', 'module2'], function(m1, m2) {
    return {
        method: function() {
            m1.methodA();
            m2.methodB();
        }
    }
})

當(dāng)定義多個時啼止,可以通過function 函數(shù)里接受一個require默認(rèn)參數(shù)來處理。

define(
    [       'dep1', 'dep2', 'dep3', 'dep4', 'dep5', 'dep6', 'dep7', 'dep8'],
    function(dep1,   dep2,   dep3,   dep4,   dep5,   dep6,   dep7,   dep8){
        ...
    }
);

可以這樣寫

define(
    function (require) {
        var dep1 = require('dep1'),
            dep2 = require('dep2'),
            dep3 = require('dep3'),
            dep4 = require('dep4'),
            dep5 = require('dep5'),
            dep6 = require('dep6'),
            dep7 = require('dep7'),
            dep8 = require('dep8');

            ...
    }
})
(2)require 調(diào)用模塊

通過define定義模塊后兵罢,可以使用require來調(diào)用模塊献烦。

require(dependencies?, factory, errorCallback)

require的參數(shù)有:dependencies 為依賴模塊,非必填卖词;factory 處理函數(shù)巩那,必填;errorCallback 為 錯誤的回調(diào),非必填此蜈;

require(
    ['foo', 'bar'], 
    function ( foo, bar ) {
        foo.doSomething();
        bar.doSomething();
    }即横,
    function(err){
        console.log(err)
    }
);

上述例子,在foo 和 bar 模塊加載完成后裆赵,再在函數(shù)中執(zhí)行foo 和 bar 的方法,如果有錯誤則到錯誤的回調(diào)函數(shù)中东囚,并接受一個error對象作為參數(shù)。

全局error事件監(jiān)聽战授,所有沒有被上面的方法捕獲的錯誤页藻,都會被觸發(fā)這個監(jiān)聽函數(shù)。

requirejs.onError = function (err) {
    // ...
};

define中require異步加載

例子中植兰,define定義了一個模塊份帐,其中foobar 需要依賴 foo 和bar 模塊的方法,由于require 為異步钉跷,此時return 的結(jié)果可以通過isReady 來判斷是否加載完成弥鹦。

define(function ( require ) {
    var isReady = false, foobar;
 
    require(['foo', 'bar'], function (foo, bar) {
        isReady = true;
        foobar = foo() + bar();
    });
 
    return {
        isReady: isReady,
        foobar: foobar
    };
});

可以用過promise 來實現(xiàn)

define(function ( require ) {
    var obj;
 
    require(['foo', 'bar'], function (foo, bar) {
        isReady = true;
        obj.resolve({foobar:foo() + bar()});
    });
 
    return obj.promise()
});

上面代碼返回一個promise對象,可以在該對象的then方法爷辙,指定下一步的動作彬坏。

小結(jié)
require 和 define 函數(shù)內(nèi)部機制差不多,不一樣的地方是 define 的回調(diào)函數(shù)需要有 return 語句返回模塊對象膝晾,這樣 define 定義的模塊才能被其他模塊引用栓始;require 的回調(diào)函數(shù)不需要 return 語句。

3血当、requirejs config 配置

paths:
可以配置模塊的引用路徑幻赚,可以本地相對路徑禀忆,也可以是外部路徑,可以提供多個路徑落恼,當(dāng)?shù)谝粋€失敗時箩退,會使用第二個路徑。
簡單配置如下

require.config({
    paths: {
        jquery: [
            '//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js',
            'lib/jquery'
        ]
    }
});

baseUrl
baseUrl 指定了一個目錄佳谦,然后requirejs基于這個目錄來尋找依賴的模塊戴涝。
可以通過config 來配置,也可以通過引入requirejs 文件的data-main屬性定義钻蔑。

shim:
用于配置在腳本/模塊外面并沒有使用RequireJS的函數(shù)依賴并且初始化函數(shù)啥刻。假設(shè)underscore并沒有使用 RequireJS定義,但是你還是想通過RequireJS來使用它咪笑,那么你就需要在配置中把它定義為一個shim可帽。

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

或者

requirejs.config({
    baseUrl: 'js'
});
4、插件

requirejs 提供多種插件窗怒,具體插件詳情可以查看文檔 插件類型

define([
    'backbone',
    'text!templates.html'
], function( Backbone, template ){
   // ...
});

以上為text 插件映跟,通過在模塊名前添加text!來指定插件類型,在回調(diào)函數(shù)中能夠通過template來獲取模板的內(nèi)容兜粘,格式為字符串申窘。

5、優(yōu)化器r.js

requireJS提供一個基于node.js的命令行工具r.js孔轴,用來壓縮多個js文件剃法。它的主要作用是將多個模塊文件壓縮合并成一個腳本文件,以減少網(wǎng)頁的HTTP請求數(shù)路鹰。
具體實現(xiàn)可以參考官方文檔


參考:

官方文檔api: requirejs.org
官方文檔git:requirejs-git

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贷洲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子晋柱,更是在濱河造成了極大的恐慌优构,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雁竞,死亡現(xiàn)場離奇詭異钦椭,居然都是意外死亡,警方通過查閱死者的電腦和手機碑诉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門彪腔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人进栽,你說我怎么就攤上這事德挣。” “怎么了快毛?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵格嗅,是天一觀的道長番挺。 經(jīng)常有香客問我,道長屯掖,這世上最難降的妖魔是什么玄柏? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮贴铜,結(jié)果婚禮上禁荸,老公的妹妹穿的比我還像新娘。我一直安慰自己阀湿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布瑰妄。 她就那樣靜靜地躺著陷嘴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪间坐。 梳的紋絲不亂的頭發(fā)上灾挨,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音竹宋,去河邊找鬼劳澄。 笑死,一個胖子當(dāng)著我的面吹牛蜈七,可吹牛的內(nèi)容都是我干的秒拔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼飒硅,長吁一口氣:“原來是場噩夢啊……” “哼砂缩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起三娩,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤庵芭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雀监,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體双吆,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年会前,在試婚紗的時候發(fā)現(xiàn)自己被綠了好乐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡回官,死狀恐怖曹宴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歉提,我是刑警寧澤笛坦,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布区转,位于F島的核電站,受9級特大地震影響版扩,放射性物質(zhì)發(fā)生泄漏废离。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一礁芦、第九天 我趴在偏房一處隱蔽的房頂上張望蜻韭。 院中可真熱鬧,春花似錦柿扣、人聲如沸肖方。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俯画。三九已至,卻和暖如春司草,著一層夾襖步出監(jiān)牢的瞬間艰垂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工埋虹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猜憎,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓搔课,卻偏偏與公主長得像胰柑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辣辫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

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