requireJS(一)

來源:互聯網
上載者:User

一、關於requirejs requirejs是一個用於非同步載入js模組的架構  二、HOW TO USE 首先先去官網下載requirejs.js下來,再在自己的項目中引入 1 <script type="text/javascript" src="../requirejs.js" data-main="../main"></script>注意到data-main這個屬性,簡單的理解就是一個入口函數,用來啟動指令碼的載入過程。   tip:為了使這個檔案載入時候不失去響應,你可以選擇將它放在網頁底部載入,還有另外一個辦法就是寫成下面這樣 1 <script type="text/javascript" src="../requirejs.js" data-main="../main" async="true" defer></script>async這個屬性工作表明它要非同步載入,避免失去響應,另外defer是為了相容IE瀏覽器(IE不支援async這個屬性),所以完整的把兩個都寫上。      三、簡單的例子 假設js/a.js中的代碼如下: 1 var  info = "hello world"//簡單的定義了一個變數然後在mian.js中用requirejs載入它,如下所示 1 require(["../a.js"],function(a){2        alert(info);//彈出hello world3  })然後再查看瀏覽器的開發人員工具下,可以看到已經載入了    可以看到require接受3個參數(樣本中為2個),第一個參數為標識的id(建議忽略);第二個參數為一個字元型的數組,為要載入的js模組;第三個參數為回呼函數, 當js模組注入載入完成後,此函數就會被調用,其中函數的參數,依次順序對應第二個參數中字串數組的值。 tip:第二個參數中字串數組中允許不同的值,當字串是以“.js”結尾的(例如上面中的js/a.js)或者是以“/”開頭,又或者直接是一個完整的url( 包含URL協議,如"http:"、"https:"),則會被requirejs認為使用者是直接載入一個js模組。       否則,當字串是類似”my/module”的時候,它會認為這是一個模組,並且會以使用者配置的 baseUrl 和 paths 來載入相應的模組所在的 JavaScript 檔案(後面將介紹)  四、配置 現在我們來換一種寫法,我們使用require.config來對模組的載入行為自訂,其中參數是一個對象   1 require.config({ 2   paths:{ 3     jquery:"jquery-1.10.2.min", 4     a:"a" 5   } 6 }); 7  8 require(["jquery","a"],function($,a){ 9   alert($().jquery);   //1.10.210   alert(info);         //hello world11 }); 簡單的理解就是參數對象中的path屬性用來設定路徑的。 由於requirejs是以相對於baseurl屬性(樣本中沒有給出)地址來載入所以的代碼的。其中baseUrl是為require.config的參數(參數為對象)裡一個屬性。 如果沒有顯式指定config及data-main,則預設的baseUrl為包含RequireJS的那個HTML頁面的所屬目錄。 此時,RequireJS預設假定所有的依賴資源都是js指令碼,因此無需在module ID上再加".js"尾碼(即上面的jquery-1.10.2.min不用寫成jquery-1.10.2.min.js 寫上會報錯(Uncaught Error: Script error for: jquery)。 五、用define自訂模組   1 //b.js 2  3 define(["jquery"],function($){ 4   return { 5     dom:function(){ 6       $("#div1").html("123"); 7       alert("shabi") 8     }, 9     abc:"8888888"10   };11 })12 13 //main.js14 15 require.config({16   paths:{17     jquery:"jquery-1.10.2.min",18     a:"a",19     b:"b"20   }21 });22 23 require(["jquery","a","b"],function($,a,b){24   alert($().jquery);    //1.10.2  25   alert(info);          //hello world26   b.dom();              //  改寫了頁面的html文字,彈出shiba27   alert(b.abc);        //888888828   console.log(b.abc);   //控制台輸出888888829 });   頁面代碼為:<div id="div1">aaa</div> 上面示範了如何自訂模組包含了值對,函數式(存在依賴的函數式定義),可依據需要自己定義,另外,我們也可以再返回之前做一些其他的事情。 六、其他一些配置屬性 baseUrl:用於設定基目錄(如上面的例子可以設定baseUrl:"../",代碼一樣不變) config(直接看下面的例子  13 14 //main.js15 16 require.config({17   baseUrl:"../",18   paths:{19     a:"a",20   },21   config:{22     "a":{23       message:"liucunjie"24     }25   }26 });27 28 require(["a"],function(a){29   a.ms()   // 控制台下輸出liucunjie30 }); 其中在mian.js配置中,指明config中是哪個模組(上面的例子是a.js模組) 然後在a.js檔案代碼書寫  1 define(["module"],function(module){2   return{3      ms:function(){4        var mess = module.config().message;5        console.log(mess);6      }7   }8 }) 引入module,然後用module.config()來擷取。   七、載入非規範(AMD)的模組 理論上,requirejs載入的模組必須是符合AMD規範的,或者是用define()函數定義的模組 如今,很多主流的庫都符合AMD規範,但是也有很多庫並不符合,這時就需要在配置裡設定shim屬性 例如backbone這個庫,沒有採用AMD規範編寫   1 require.config({ 2   shim:{ 3     'underscore':{ 4       exports:'_' 5     }, 6     'backbone':{ 7       deps:['underscore','jquery'], 8       exports:'Backbone' 9     }10   }11 }); 其中deps數組為表明其依賴,exports(輸出的變數名)則為這個模組外部調用時的名稱。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.