成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

require.js學(xué)習(xí)筆記。

K_B_Z / 1763人閱讀

摘要:他僅需簡(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ù)。

data-main入口點(diǎn)

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

相關(guān)文章

  • RequireJS學(xué)習(xí)筆記

    摘要:如果有疑惑的地方,歡迎討論,我是初學(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文件; 方法一...

    hersion 評(píng)論0 收藏0
  • JS學(xué)習(xí)筆記 - 模塊化

    摘要:在開(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模塊化工具真正適合我...

    CntChen 評(píng)論0 收藏0
  • cordova研習(xí)筆記(二) —— cordova 6.X 源碼解讀(上)

    摘要:本文源碼為版本。的代碼結(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...

    Java_oldboy 評(píng)論0 收藏0
  • 《高性能JavaScript》(讀書(shū)筆記

    摘要:加載的模塊會(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ì)阻塞瀏覽...

    moven_j 評(píng)論0 收藏0
  • RequireJS配置項(xiàng)筆記

    摘要:讀不順中文文檔,對(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...

    FWHeart 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

K_B_Z

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<