RequireJS 入門指南

英文原文:https://www.codeproject.com/articles/625262/getting-started-with-the-requirejs-library

中文翻譯:http://www.oschina.net/translate/getting-started-with-the-requirejs-library

簡介

如今最常用的JavaScript庫之一是RequireJS。最近我參與的每個(gè)項(xiàng)目毛秘,都用到了RequireJS冯痢,或者是我向它們推薦了增加RequireJS。在這篇文章中蓄愁,我將描述RequireJS是什么,以及它的一些基礎(chǔ)場景狞悲。
異步模塊定義(AMD)
===
談起RequireJS撮抓,你無法繞過提及JavaScript模塊是什么,以及AMD是什么摇锋。
JavaScript模塊只是遵循SRP(Single Responsibility Principle單一職責(zé)原則)的代碼段丹拯,它暴露了一個(gè)公開的API。在現(xiàn)今JavaScript開發(fā)中荸恕,你可以在模塊中封裝許多功能乖酬,而且在大多數(shù)項(xiàng)目中,每個(gè)模塊都有其自己的文件融求。這使得JavaScript開發(fā)者日子有點(diǎn)難過剑刑,因?yàn)樗鼈冃枰掷m(xù)不斷的關(guān)注模塊之間的依賴性,按照一個(gè)特定的順序加載這些模塊,否則運(yùn)行時(shí)將會(huì)放生錯(cuò)誤施掏。

當(dāng)你要加載JavaScript模塊時(shí)钮惠,就會(huì)使用script標(biāo)簽。為了加載依賴的模塊七芭,你就要先加載被依賴的素挽,之后再加載依賴的。使用script標(biāo)簽時(shí)狸驳,你需要按照此特定順序安排它們的加載预明,而且腳本的加載是同步的“夜浚可以使用async和defer關(guān)鍵字使得加載異步撰糠,但可能因此在加載過程中丟失加載的順序。另一個(gè)選擇是將所有的腳本捆綁打包在一起辩昆,但在捆綁的時(shí)候你仍然需要把它們按照正確的順序排序阅酪。
AMD就是這樣一種對模塊的定義,使模塊和它的依賴可以被異步的加載汁针,但又按照正確的順序术辐。

Getting Started with RequireJS Library

CommonJS, 是對通用的JavaScript模式的標(biāo)準(zhǔn)化嘗試,它包含有 AMD 定義 施无,我建議你在繼續(xù)本文之前先讀一下辉词。在ECMAScript 6這個(gè)下一版本JavaScript 規(guī)范中,有關(guān)于輸出猾骡,輸入以及模塊的規(guī)范定義瑞躺,這些將成為JavaScript語言的一部分,而且這不會(huì)太久兴想。這也是關(guān)于RequireJS我們想說的東西幢哨。

RequireJS?

RequireJS是一個(gè)Javascript 文件和模塊框架,可以從 http://requirejs.org/下載襟企,如果你使用Visual Studio也可以通過Nuget獲取。它支持瀏覽器和像node.js之類的服務(wù)器環(huán)境狮含。使用RequireJS,你可以順序讀取僅需要相關(guān)依賴模塊顽悼。
RequireJS所做的是,在你使用script標(biāo)簽加載你所定義的依賴時(shí)几迄,將這些依賴通過head.appendChild()函數(shù)來加載他們蔚龙。當(dāng)依賴加載以后,RequireJS計(jì)算出模塊定義的順序映胁,并按正確的順序進(jìn)行調(diào)用木羹。這意味著你需要做的僅僅是使用一個(gè)“根”來讀取你需要的所有功能,然后剩下的事情只需要交給RequireJS就行了。為了正確的使用這些功能坑填,你定義的所有模塊都需要使用RequireJS的API抛人,否者它不會(huì)像期望的那樣工作。

RequireJS API 存在于RequireJS載入時(shí)創(chuàng)建的命名空間requirejs下脐瑰。其主要API主要是下面三個(gè)函數(shù):

define– 該函數(shù)用戶創(chuàng)建模塊妖枚。每個(gè)模塊擁有一個(gè)唯一的模塊ID,它被用于RequireJS的運(yùn)行時(shí)函數(shù)苍在,define函數(shù)是一個(gè)全局函數(shù)绝页,不需要使用requirejs命名空間.
require– 該函數(shù)用于讀取依賴。同樣它是一個(gè)全局函數(shù)寂恬,不需要使用requirejs命名空間.
config– 該函數(shù)用于配置RequireJS.

在后面续誉,我們將教你如果使用這些函數(shù),但首先讓我們先了解下RequireJS的加載流程初肉。

data-main屬性

當(dāng)你下載RequireJS之后酷鸦,你要做的第一件事情就是理解RequireJS是怎么開始工作的。當(dāng)RequireJS被加載的時(shí)候朴译,它會(huì)使用data-main屬性去搜尋一個(gè)腳本文件(它應(yīng)該是與使用src加載RequireJS是相同的腳本)井佑。data-main需要給所有的腳本文件設(shè)置一個(gè)根路徑。根據(jù)這個(gè)根路徑眠寿,RequireJS將會(huì)去加載所有相關(guān)的模塊躬翁。下面的腳本是一個(gè)使用data-main例子:
<script src="scripts/require.js" data-main="scripts/app.js"></script>
另外一種方式定義根路勁是使用配置函數(shù),后面我們將會(huì)看到盯拱。requireJs假設(shè)所有的依賴都是腳本盒发,那么當(dāng)你聲明一個(gè)腳本依賴的時(shí)候你不需要使用.js后綴。

配置函數(shù)

如果你想改變RequireJS的默認(rèn)配置來使用自己的配置狡逢,你可以使用require.configh函數(shù)宁舰。config函數(shù)需要傳入一個(gè)可選參數(shù)對象,這個(gè)可選參數(shù)對象包括了許多的配置參數(shù)選項(xiàng)奢浑。下面是一些你可以使用的配置:
baseUrl——用于加載模塊的根路徑蛮艰。
paths——用于映射不存在根路徑下面的模塊路徑。
shims——配置在腳本/模塊外面并沒有使用RequireJS的函數(shù)依賴并且初始化函數(shù)雀彼。假設(shè)underscore并沒有使用 RequireJS定義壤蚜,但是你還是想通過RequireJS來使用它,那么你就需要在配置中把它定義為一個(gè)shim徊哑。
deps——加載依賴關(guān)系數(shù)組

用RequireJS定義模塊

模塊是進(jìn)行了內(nèi)部實(shí)現(xiàn)封裝袜刷、暴露接口和合理限制范圍的對象。ReuqireJS提供了define函數(shù)用于定義模塊莺丑。按章慣例每個(gè)Javascript文件只應(yīng)該定義一個(gè)模塊著蟹。define函數(shù)接受一個(gè)依賴數(shù)組和一個(gè)包含模塊定義的函數(shù)。通常模塊定義函數(shù)會(huì)把前面的數(shù)組中的依賴模塊按順序做為參數(shù)接收。例如萧豆,下面是一個(gè)簡單的模塊定義:

define(["logger"], function(logger) { return { firstName: “John", lastName: “Black“, sayHello: function () { logger.log(‘hello’); } } });

我們看奸披,一個(gè)包含了logger的模塊依賴數(shù)組被傳給了define函數(shù),該模塊后面會(huì)被調(diào)用。同樣我們看所定義的模塊中有一個(gè)名為logger的參數(shù)炕横,它會(huì)被設(shè)置為logger模塊源内。每一個(gè)模塊都應(yīng)該返回它的API.這個(gè)示例中我們有兩個(gè)屬性(firstName和lastName)和一個(gè)函數(shù)(sayHello)。然后份殿,只要你后面定義的模塊通過ID來引用這個(gè)模塊膜钓,你就可以使用其暴露的API。

使用require函數(shù)

在RequireJS中另外一個(gè)非常有用的函數(shù)是require函數(shù)卿嘲。require函數(shù)用于加載模塊依賴但并不會(huì)創(chuàng)建一個(gè)模塊颂斜。例如:下面就是使用require定義了能夠使用jQuery的一個(gè)函數(shù)。

require(['jquery'], function ($) { //jQuery was loaded and can be used now});

小結(jié)

在這篇文章中我介紹了RequireJS庫,它是我創(chuàng)建每個(gè)Javascript項(xiàng)目都會(huì)用到的庫函數(shù)之一拾枣。它不僅僅用于加載模塊依賴和相關(guān)的命令沃疮,RequireJS幫助我們寫出模塊化的JavaScript代碼,這非常有利于代碼的可擴(kuò)展性和重用性梅肤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末司蔬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子姨蝴,更是在濱河造成了極大的恐慌俊啼,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件左医,死亡現(xiàn)場離奇詭異授帕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浮梢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門跛十,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秕硝,你說我怎么就攤上這事芥映。” “怎么了远豺?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵奈偏,是天一觀的道長。 經(jīng)常有香客問我憋飞,道長霎苗,這世上最難降的妖魔是什么姆吭? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任榛做,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘检眯。我一直安慰自己厘擂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布锰瘸。 她就那樣靜靜地躺著刽严,像睡著了一般。 火紅的嫁衣襯著肌膚如雪避凝。 梳的紋絲不亂的頭發(fā)上舞萄,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音管削,去河邊找鬼倒脓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛含思,可吹牛的內(nèi)容都是我干的崎弃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼含潘,長吁一口氣:“原來是場噩夢啊……” “哼饲做!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遏弱,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對情侶失蹤盆均,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后腾窝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缀踪,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年虹脯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驴娃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡循集,死狀恐怖唇敞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咒彤,我是刑警寧澤疆柔,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站镶柱,受9級(jí)特大地震影響旷档,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歇拆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一鞋屈、第九天 我趴在偏房一處隱蔽的房頂上張望范咨。 院中可真熱鬧,春花似錦厂庇、人聲如沸渠啊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽替蛉。三九已至,卻和暖如春拄氯,著一層夾襖步出監(jiān)牢的瞬間躲查,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工译柏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熙含,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓艇纺,卻偏偏與公主長得像怎静,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子黔衡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • 導(dǎo)語: 之前一直有聽說RequireJS蚓聘,但是一直都沒機(jī)會(huì)去了解,只知道它是一個(gè)給js做模塊化的API盟劫。最近在做R...
    wuqke閱讀 40,917評(píng)論 11 78
  • 參考資料 RequireJS 中文網(wǎng)Javascript模塊化編程(三):require.js的用法——阮一峰 前...
    BeYanJin閱讀 7,065評(píng)論 2 12
  • 為什么會(huì)出現(xiàn)這些奇奇怪怪的東西夜牡,是不是搞事情? 因?yàn)榍岸舜a模塊化侣签。 什么又是代碼模塊化塘装? 這得從JavaScri...
    阿魯提爾閱讀 752評(píng)論 0 4
  • 夢回故時(shí)山,念及伊笑顏影所。 驚覺幾華發(fā)蹦肴,卻無幾時(shí)閑。
    陽天獄閱讀 424評(píng)論 0 2
  • 記錄成長:5這個(gè)成長屬于我們猴娩!??前天晚上去媽媽家看Vivian阴幌,一進(jìn)家門她跑過來遞給我一個(gè)用塑料紙認(rèn)真...
    MySunnyday閱讀 344評(píng)論 0 0