1、關於requirejsjavascript
requirejs是一個用於異步加載js模塊的框架。詳細介紹的請谷歌~html
2、HOW TO USEjava
首先先去官網下載requirejs.js下來,再在本身的項目中引入jquery
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這個屬性),因此完整的把兩個都寫上。框架
例子結構目錄爲dom
3、簡單的例子異步
假設js/a.js中的代碼以下:async
1 var info = "hello world"//簡單的定義了一個變量
而後在mian.js中用requirejs加載它,以下所示
1 require(["../a.js"],function(a){ 2 alert(info);//彈出hello world 3 })
而後再查看瀏覽器的開發者工具下,能夠看到已經加載了
能夠看到require接受3個參數(示例中爲2個),第一個參數爲標識的id(建議忽略);第二個參數爲一個字符型的數組,爲要加載的js模塊;第三個參數爲回調函數,
當js模塊注入加載完成後,此函數就會被調用,其中函數的參數,依次順序對應第二個參數中字符串數組的值。
tip:第二個參數中字符串數組中容許不一樣的值,當字符串是以「.js」結尾的(例如上面中的js/a.js)或者是以「/」開頭,又或者直接是一個完整的url(
包含URL協議,如"http:"、"https:"),則會被requirejs認爲用戶是直接加載一個js模塊。
不然,當字符串是相似」my/module」的時候,它會認爲這是一個模塊,而且會以用戶配置的 baseUrl 和 paths 來加載相應的模塊所在的 JavaScript 文件(後面將介紹)
4、配置
如今咱們來換一種寫法,咱們使用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.2 10 alert(info); //hello world 11 });
簡單的理解就是參數對象中的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)。
5、用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.js 14 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 world 26 b.dom(); // 改寫了頁面的html文字,彈出shiba 27 alert(b.abc); //8888888 28 console.log(b.abc); //控制檯輸出8888888 29 });
頁面代碼爲:<div id="div1">aaa</div>
上面演示瞭如何自定義模塊包含了值對,函數式(存在依賴的函數式定義),可依據須要本身定義,另外,咱們也能夠再返回以前作一些其餘的事情。
6、其餘一些配置屬性
baseUrl:用於設置基目錄(如上面的例子能夠設置baseUrl:"../",代碼同樣不變)
config(直接看下面的例子
13 14 //main.js 15 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() // 控制檯下輸出liucunjie 30 });
其中在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()來獲取。
7、加載非規範(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(輸出的變量名)則爲這個模塊外部調用時的名稱。
未完待續。。。。