requireJS-3調(diào)用非 AMD 規(guī)范 js

1.AMD規(guī)范

(1)define 定義模塊

(一)define 定義獨立模塊

如果被定義的模塊是一個獨立模塊敢辩,不需要依賴任何其他模塊,可以直接用define方法生成。

define({ method1: function() {}, method2: function() {}, });

上面代碼生成了一個擁有method1、method2兩個方法的模塊。
另一種等價的寫法是银觅,把對象寫成一個函數(shù),該函數(shù)的返回值就是輸出的模塊坏为。

define(function () { 
return { 
method1: function() {},
 method2: function() {}, 
}; 
});
(二)非獨立模塊

如果被定義的模塊需要依賴其他模塊究驴,則define方法必須采用下面的格式。

define(['module1', 'module2'], function(m1, m2) { ... });

以上參考 RequireJS和AMD規(guī)范

2.requireJS config 方法

**(1)paths **
paths參數(shù)指定各個模塊的位置匀伏。這個位置可以是同一個服務(wù)器上的相對位置洒忧,也可以是外部網(wǎng)址」坏撸可以為每個模塊定義多個位置熙侍,如果第一個位置加載失敗,則加載第二個位置履磨,上面的示例就表示如果CDN加載失敗蛉抓,則加載服務(wù)器上的備用腳本。需要注意的是剃诅,指定本地文件路徑時巷送,可以省略文件最后的js后綴名。

**(2)baseUrl **
baseUrl參數(shù)指定本地模塊位置的基準(zhǔn)目錄矛辕,即本地模塊的路徑是相對于哪個目錄的笑跛。該屬性通常由require.js加載時的data-main屬性指定。
(3)shim
有些庫不是AMD兼容的如筛,這時就需要指定shim屬性的值堡牡。shim可以理解成“墊片”抒抬,用來幫助require.js加載非AMD規(guī)范的庫杨刨。

3.shim 加載非AMD模塊

(1)形式1

** b.js**

var hello = function () {//     
console.log('hello 1');// 
};

hello 為b1.js 暴露的全局變量
main.js

require.config({    
baseUrl:'js/',    
shim:{        
'b':{            
exports:'hello',    //hello 與b中暴露的全局變量一致        
deps:['math']        
     }    
},    
paths:{        
"a":"a",        
'jquery':'jquery-3.1.0.min',       
 'math':'math'    
},
})
require(['jquery',"a"],function ($) {   
 $(function () {        alert('load finished');   
 })
});

a.js 依賴于b1.js(即a.js 中調(diào)用b.js 的函數(shù))
a.js

define(['b'], function(b){    
       function fun1(){ 
       b();      
       console.log(b);    
};    
fun1(); 
});

輸出結(jié)果
瀏覽控制臺輸出:

1
 function () {//     
console.log('hello 1');// 
}

(2)形式2

b.js

var Bobj = (function () {  
  var name = 'scarlet';    
  var hello = function () {       
     console.log('hello '+name);    
  }    
  return{        
    hello:hello    
  }
})();

main.js

require.config({
    baseUrl:'js/',
    shim:{
        'b':{
            exports:'Bobj',//Bobj 于b.js 暴露的全局變量名一致
            deps:['math']
        }    },
    paths:{
        "a":"a",
        'jquery':'jquery-3.1.0.min', 
       'math':'math'    },})
require(['jquery',"a"],function ($) {
    $(function () {
        alert('load finished');
    })});

a.js

define(['b'],
    function(b){
    function fun1(){
       b.hello();        //b;
       console.log(b);
    };
    fun1(); 
})

控制臺輸出

....
hello scarlet
Object

(3)形式3

b.js

var hello3 = function () {
    console.log('hello 3');
}();

main.js

require.config({
    baseUrl:'js/',
    shim:{
        'b':{
            exports:'hello3', 
           deps:['math']
        }
    },
    paths:{
        "a":"a", 
       'jquery':'jquery-3.1.0.min',
        'math':'math'
    },})
require(['jquery',"a"],function ($) {
    $(function () {
        alert('load finished');
    })});

a.js
define(['b'], function(b){
function fun1(){
b;
console.log(b);
};
fun1();
})
控制臺輸出
hello 3
undefined

總結(jié)

exports :是指引用的js文件暴露的全局變量擦剑。也是外部js引用是使用的變量(可能是函數(shù)妖胀,也可能是對象)芥颈。

4.依賴(例如 b.js 依賴 math.js )

b.js 是非AMD規(guī)范的js ,math.js 是自定義的AMD規(guī)范的js赚抡。b.js 依賴于math.js (b.js 的hello 函數(shù)調(diào)用 math.js 的rev函數(shù))
b.js

var Bobj = (function () {
   var name = 'scarlet';
   var hello = function (math) {
       console.log("b.js ___________start");
       console.log('hello '+name);
       console.log(math.rev(name+' hello'));
       console.log("b.js ____________finshed");
   }
   return{
       hello:hello
   }
})();

math.js

define(function () {
    var add = function (a,b) {
        return a+b;
    } 
   var sub = function (a,b) {
      return a-b;
    };
    var rev= function (str) {
        var revS = "";
        for(var i = str.length-1;i >=0;i--){
            revS +=str[i];
        }
        return revS;
    };
    return {
        add:add,
        sub:sub,
        rev:rev
    };
})

main.js

/** * Created by lxy_920912 on 16/9/8. */
require.config({
    baseUrl:'js/',
    shim:{
        'b':{
            exports:'Bobj',
            deps:['math']
        }
    },
    paths:{
        "a":"a",
        'c':'c',
        'jquery':'jquery-3.1.0.min',
        'math':'math'
    },
})
require(['jquery',"a",'c','math','b'],function ($,a,c,math,b) {
    $(function () {
        a.fun1();
        c.fun1(); 
       a.fun3(c); 
       alert('load finished'); 
       b.hello(math) 
   })
});

5循環(huán)依賴

a.js 依賴于c.js ,c.js 依賴于 a.js.
(a.js 的fun3 調(diào)用c.js 的fun1,c.js 的fun1 調(diào)用a.js 的fun1)
a.js

define(['jquery','math','text!input.txt','b','require','c'],    function($,math,input,b,c){
    var fun1 = function (){
        console.log('_______________a fun1__________________________');
        console.log("add: "+math.add("hello "," scarlet")+"\n sub: "+math.sub(5,23));
        console.log(math.rev('ABCDEFG'));
        b.hello();
        console.log('_______________a fun1 finished__________________________');    };
  var fun2 = function fun2(input) {        
      var ptext =document.createTextNode(input) ;
     document.body.appendChild(ptext);
        //require('c').fun1();
        console.log('a fun2 finished');    };
    var fun3 = function (c) {
        console.log('a fun3______________')
        //var c = require('c');
        c.fun1();
        console.log('a fun3 finished_______');
    }    
fun2(input);
        return {
            fun1:fun1,
            fun2:fun2,
            fun3:fun3
        }
})

c.js

define(['require','a'],function (require,a) {
    var fun1 = function fun1() {
        require("a").fun1();
        console.log('c fun1 finished');
    }
    return {
        fun1:fun1
    }
})

main.js

require.config({
    baseUrl:'js/',
    shim:{
        'b':{
            exports:'Bobj',
            deps:['math'] 
       }    },
    paths:{
        "a":"a",
        'c':'c', 
       'jquery':'jquery-3.1.0.min',
        'math':'math' 
   },})
require(['jquery',"a",'c','math','b'],function ($,a,c,b) {
    $(function () {
        a.fun1();
       c.fun1(); 
       a.fun3(c);
       alert('load finished');
    })
});

如果你定義一個循環(huán)依賴關(guān)系 (a 依賴c 并且 c 依賴 a)爬坑,那么當(dāng)c的模塊構(gòu)造函數(shù)被調(diào)用的時候,傳遞給他的a會是undefined涂臣。 但是c可以在a模塊在被引入之后通過require(‘a(chǎn)’)來獲取a (一定要把require作為依賴模塊盾计,RequireJS才會使用正確的 context 去查找 a):

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赁遗,隨后出現(xiàn)的幾起案子署辉,更是在濱河造成了極大的恐慌,老刑警劉巖岩四,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哭尝,死亡現(xiàn)場離奇詭異,居然都是意外死亡剖煌,警方通過查閱死者的電腦和手機材鹦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耕姊,“玉大人桶唐,你說我怎么就攤上這事≤岳迹” “怎么了莽红?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長邦邦。 經(jīng)常有香客問我安吁,道長,這世上最難降的妖魔是什么燃辖? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任鬼店,我火速辦了婚禮,結(jié)果婚禮上黔龟,老公的妹妹穿的比我還像新娘妇智。我一直安慰自己,他們只是感情好氏身,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布巍棱。 她就那樣靜靜地躺著,像睡著了一般蛋欣。 火紅的嫁衣襯著肌膚如雪航徙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天陷虎,我揣著相機與錄音到踏,去河邊找鬼杠袱。 笑死,一個胖子當(dāng)著我的面吹牛窝稿,可吹牛的內(nèi)容都是我干的楣富。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼伴榔,長吁一口氣:“原來是場噩夢啊……” “哼纹蝴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起踪少,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骗灶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后秉馏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耙旦,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年萝究,在試婚紗的時候發(fā)現(xiàn)自己被綠了免都。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡帆竹,死狀恐怖绕娘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栽连,我是刑警寧澤险领,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站秒紧,受9級特大地震影響绢陌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熔恢,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一脐湾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叙淌,春花似錦秤掌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茂洒,卻和暖如春孟岛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工蚀苛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留在验,地道東北人玷氏。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓堵未,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盏触。 傳聞我的和親對象是個殘疾皇子渗蟹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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