摘要:他僅需簡(jiǎn)單地通過(guò)一個(gè)標(biāo)簽發(fā)起請(qǐng)求,是實(shí)現(xiàn)跨域服務(wù)調(diào)用一種公認(rèn)手段。為了在中使用服務(wù),須要將參數(shù)的值指定為。該示例中,的參數(shù)為,因此告訴將響應(yīng)包裹到一個(gè)中
加載JavaScript文件
RequireJS的目的是鼓勵(lì)代碼的模塊化,它使用了不同于傳統(tǒng)script標(biāo)簽的腳本加載步驟??梢杂盟鼇?lái)加速、優(yōu)化代碼,但其主要目的還是為了代碼的模塊化。它鼓勵(lì)在使用腳本時(shí)以module ID替代URL地址。
RequireJs以一個(gè)相對(duì)于baseUrl的地址來(lái)加載所有的代碼。頁(yè)面頂層script標(biāo)簽含有一個(gè)特殊屬性data-main,require.js使用它來(lái)啟動(dòng)腳本加載過(guò)程,而baseUrl一般設(shè)置到與該屬性相一致的目錄。
baseUrl亦可通過(guò)RequireJS config手動(dòng)設(shè)置。如果沒(méi)有顯式指定config及data-main,則默認(rèn)的baseUrl為包含RequireJS的那個(gè)HTML頁(yè)面的所屬目錄。
//app.js require.config({ baseUrl:"js/lib", paths:{ app:"../app" } }); require(["jquery","canvas","app/sub"],function($,canvas,sub){ //.... })
注意在示例中,三方庫(kù)如Jquery沒(méi)有將版本號(hào)包含在它們的文件名中。我們建議將版本信息放置在多帶帶的文件中進(jìn)行跟蹤。
理想狀況下,沒(méi)個(gè)加載的腳本都是通過(guò)define()來(lái)定義的一個(gè)模塊;但是有些瀏覽器全局變量注入型的傳統(tǒng)/遺留庫(kù)并沒(méi)有使用define()來(lái)定義它們的依賴關(guān)系,你必須為此使用shim config來(lái)指明它們的依賴關(guān)系。如果你沒(méi)有指明依賴關(guān)系,加載可能報(bào)錯(cuò)。這是因?yàn)榛谒俣鹊脑?srequireJS會(huì)異步地以無(wú)序的形式加載這些庫(kù)。
require.js在加載的時(shí)候會(huì)檢查data-main屬性:
你可以在data-main指向的腳本中設(shè)置模板加載選項(xiàng),然后加載第一個(gè)應(yīng)用模塊。注意:你再main.js中所這是的腳本是異步加載的。所以如果你在頁(yè)面中配置了其它JS加載,則不能保證它們所依賴的JS已經(jīng)加載成功。
//main.js require.config({ paths:{ foo:"libs/foo-1.1.3" } }); //other.js require(["foo"],function(foo){})定義模塊
模塊不同于傳統(tǒng)的腳本文件,它良好的定義了一個(gè)作用域來(lái)避免全局名稱空間污染。它可以顯式的列出其依賴關(guān)系,并以函數(shù)參數(shù)的形式將這些依賴進(jìn)行注入,而無(wú)需引用全局變量。requireJS的模塊是模塊模式的一個(gè)擴(kuò)展,其好處是無(wú)需全局引用其它模塊。
RequireJs模塊語(yǔ)法允許它盡快地加載多個(gè)模塊,雖然加載的順序不定,但依賴的順序最終是正確的。同時(shí)因?yàn)闊o(wú)需創(chuàng)建全局變量,甚至可以做到在同一頁(yè)面上同時(shí)加載同一模塊的不同版本。
如果一個(gè)模塊僅含值對(duì),沒(méi)有任何依賴,則在define()中定義這些值就好了:
define({ color:"black", size:"unisize" })
如果一個(gè)模塊沒(méi)有任何依賴,但需要一個(gè)setup工作的函數(shù),則在define()中定義該函數(shù),并將其傳給define():
define(function(){ return{ color:"black", size:"unisize" } })
如果模塊存在依賴:則第一個(gè)參數(shù)是依賴的名稱數(shù)組;第二個(gè)參數(shù)是函數(shù),在模塊的所有依賴加載完畢后,該函數(shù)會(huì)被調(diào)用來(lái)定義該模塊,因此該模塊應(yīng)該返回一個(gè)定義了本模塊的object。依賴關(guān)系會(huì)以參數(shù)的形式注入到該函數(shù)上,參數(shù)列表與依賴名稱列表一一對(duì)應(yīng)。
define(["./cart","./inventory"],function(cart,inventory){ return{ color:"blue", size:"large", addToCart:function(){ inventory.decrement(this); cart.add(this); } } })
對(duì)模塊的返回值類(lèi)型并沒(méi)有強(qiáng)制為一定是個(gè)object,任何函數(shù)的返回值都是允許的。此處是一個(gè)返回了函數(shù)的模塊定義:
define(["my/cat","my/inventory"],{ function(cart,inventory){ return function(title){ return title?(window.title = title):inventory.storeName+""+cart.name; } } })
define()中的相對(duì)模塊名:為了可以在define()內(nèi)部使用諸如require("./relative/name")的調(diào)用以正確解析相對(duì)名稱,記得將require本身作為一個(gè)依賴注入到模塊中:
define(["require","./relative/name"],funciton(require){ var mod = require("./relative/name") })
或者更好地,使用下述轉(zhuǎn)換為CommonJS模塊所設(shè)的更短的語(yǔ)法:
define(function(require){ var mod = require("./relative/name") })
相對(duì)路徑在一些場(chǎng)景下格外有用,例如:為了以便于將代碼共享給其他人或項(xiàng)目,你在某個(gè)目錄下創(chuàng)建一些模塊。你可以訪問(wèn)模塊的相鄰模塊,無(wú)需知道該目錄的名稱。
生成相對(duì)于模塊的URL地址:你可能需要生成一個(gè)相對(duì)于模塊的URL地址。你可以將require作為一個(gè)依賴注入進(jìn)來(lái),然后調(diào)用require.toUrl()以生成URL:
define(["require"],function(require){ var cssUrl = require.toUrl("./style.css") })
如果你定義了一個(gè)循環(huán)依賴(a依賴b,b同時(shí)依賴a),則在這種情形下當(dāng)b的模塊函數(shù)被調(diào)用的時(shí)候,它會(huì)得到一個(gè)undefined的a。b可以在模塊已經(jīng)定義好后用require()方法再獲取(記得將require作為依賴注入進(jìn)來(lái)):
//b.js define(["require","a"],function(require,a){ return function(title){ return require("a").doSomething(); } })
一般說(shuō)你無(wú)需使用require()去獲取一個(gè)模塊,而是應(yīng)當(dāng)使用注入到模塊函數(shù)參數(shù)中的依賴。循環(huán)依賴比較罕見(jiàn),它也是一個(gè)重構(gòu)代碼重新設(shè)計(jì)的i警示燈。
如果你熟悉CommonJS,你可以考慮使用exports為模塊建立一個(gè)空object,該object可以立即被其它模塊引用。再循環(huán)依賴的兩頭都如此操作之后,你就可以完全持有其它模塊了。這種方法僅在每個(gè)模塊都是輸出object作為模塊值的時(shí)候有效,換成函數(shù)無(wú)效。
//b.js define(function(require,exports,module){ var a = require("a"); exports.foo = function(){ return a.bar(); } })
或則,如果你使用依賴注入數(shù)組的步驟,則可用注入特殊exports來(lái)解決:
//b.js define(["a","exports"],function(a,exports){ exports.foo = function(){ return a.bar(); } });
JSONP是在javascript中服務(wù)調(diào)用的一種方式。他僅需簡(jiǎn)單地通過(guò)一個(gè)script標(biāo)簽發(fā)起HTTP GET請(qǐng)求,是實(shí)現(xiàn)跨域服務(wù)調(diào)用一種公認(rèn)手段。
為了在RequireJS中使用JSON服務(wù),須要將callback參數(shù)的值指定為define。這意味著你可將獲取到的JSONP URL的值看成是一個(gè)模塊定義。
下面是一個(gè)調(diào)用JSONP API端點(diǎn)的示例。該示例中,JSONP的callback參數(shù)為"callback",因此"callback=define"告訴API將JSON響應(yīng)包裹到一個(gè)"define()"中:
require(["http://example.com/api/data.json?callback=define"], function (data) { //The data object will be the API response for the //JSONP data call. console.log(data); } );
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100414.html
摘要:如果有疑惑的地方,歡迎討論,我是初學(xué),希望能切磋和得到指點(diǎn)加載會(huì)阻塞頁(yè)面加載默認(rèn)異步加載文件方法一把放到頁(yè)面底部加載方法二支持定義全局相對(duì)路徑方法一自定義屬性指定網(wǎng)頁(yè)程序的主模塊文件定義整個(gè)網(wǎng)頁(yè)代碼的入口文件的相對(duì)位置,以后此文件 如果有疑惑的地方,歡迎討論,我是初學(xué),希望能切磋和得到指點(diǎn); js加載會(huì)阻塞頁(yè)面加載: //requirejs默認(rèn)異步加載js文件; 方法一...
摘要:在開(kāi)發(fā)大型的項(xiàng)目中,可能會(huì)使用到管理的模塊化工具。說(shuō)道,學(xué)習(xí)過(guò)的同學(xué)會(huì)比較熟悉,是服務(wù)器模塊的規(guī)范,采用了這個(gè)規(guī)范。可能是未來(lái)模塊化解決方案的首選。 本文章記錄本人在學(xué)習(xí) JavaScript 中理解到的一些東西,加深記憶和并且整理記錄下來(lái),方便之后的復(fù)習(xí)。 在開(kāi)發(fā)大型的web項(xiàng)目中,可能會(huì)使用到管理js的模塊化工具。但是在前端輪子漫天飛的時(shí)代。那一款js模塊化工具真正適合我...
摘要:本文源碼為版本。的代碼結(jié)構(gòu)也是一個(gè)很經(jīng)典的定義結(jié)構(gòu)構(gòu)造函數(shù)實(shí)例修改函數(shù)原型共享實(shí)例方法,它提供事件通道上事件的訂閱撤消訂閱調(diào)用。 前言 cordova(PhoneGap) 是一個(gè)優(yōu)秀的經(jīng)典的中間件框架,網(wǎng)上對(duì)其源代碼解讀的文章確實(shí)不多,本系列文章試著解讀一下,以便對(duì)cordova 框架的原理理解得更深入。本文源碼為cordova android版本6.1.2。 源碼結(jié)構(gòu) 我們使用IDE...
摘要:加載的模塊會(huì)以參數(shù)形式傳入該函數(shù),從而在回調(diào)函數(shù)內(nèi)部就可以使用這些模塊。異步加載,和,瀏覽器不會(huì)失去響應(yīng)它指定的回調(diào)函數(shù),只有前面的模塊都加載成功后,才會(huì)運(yùn)行,解決了依賴性的問(wèn)題。插件,可以讓回調(diào)函數(shù)在頁(yè)面結(jié)構(gòu)加載完成后再運(yùn)行。 這次主要是對(duì)《高性能JavaScript》一書(shū)的讀書(shū)筆記,記錄下自己之前沒(méi)有注意到或者需要引起重視的地方 第一章 加載和執(zhí)行 js代碼在執(zhí)行過(guò)程中會(huì)阻塞瀏覽...
摘要:讀不順中文文檔,對(duì)應(yīng)中文文檔,自行翻譯的如果有問(wèn)題錯(cuò)誤,歡迎指點(diǎn)修改配置選項(xiàng)方法一在頂級(jí)頁(yè)面或頂級(jí)腳本文件沒(méi)有定義模塊的腳本文件中配置方法二在主模塊中配置缺點(diǎn)主模塊異步加載,多入口的話,會(huì)隨機(jī)報(bào)錯(cuò)方法三在調(diào)用之前,將配置定義為全局變量配置在 讀不順中文文檔,對(duì)應(yīng)中文文檔,自行翻譯的……如果有問(wèn)題/錯(cuò)誤,歡迎指點(diǎn); 修改配置選項(xiàng): 方法一、 requi...
閱讀 2553·2021-10-11 10:58
閱讀 1037·2019-08-29 13:58
閱讀 1672·2019-08-26 13:32
閱讀 837·2019-08-26 10:40
閱讀 3264·2019-08-26 10:18
閱讀 1764·2019-08-23 14:18
閱讀 1112·2019-08-23 10:54
閱讀 441·2019-08-22 18:39