亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

使用RequireJS庫加載JavaScript模塊的實例教程

2019-11-20 09:46:48
字體:
來源:轉載
供稿:網友

js通過script標簽的默認加載方式是同步的,即第一個script標簽內的js加載完成后,才開始加載第二個,以此類推,直至js文件全部加載完畢。且js的依賴關系必須通過script的順序才能確保;而在js加載期間,瀏覽器將停止響應,這大大影響了用戶體驗,基于此,很多解決js以來和加載的方案出現,require js就是其中之一。

requirejs加載的模塊,一般為符合AMD標準的模塊,即用define定義,用ruturn返回暴露方法、變量的模塊;requirejs也可以加載飛AMD標準的模塊,但比較麻煩,這次不涉及。

require加載js主涉及以下方面:

  • script 標簽data-main屬性聲明requirejs加載的入口模塊,async="true"(非ie) 和defer(ie)標簽表明異步加載。
  • require.config配置模塊對應的路徑
  • require聲明依賴關系

html demo

<script src ="js/require.js" defer async="true" data-main="js/main" ><!--給出requirejs路徑,聲明為異步加載,指定入口模塊為main.js(可省略.js)-->

main.js

 require.config({   //聲明模塊的位置   paths: {     "jquery":"libs/jquery"     "login" : "libs/login"   }   //或使用baseUrl指定所有模塊的路徑   baseUrl: "js/libs" }); //使用require加載模塊,第一個參數為數組,即要加載的模塊,將按數組順序加載;第二個為回調函數,在全部加載完成后執行。 require(['jquery','login'],function($,Login){   alert("jquery and login module load success!");   Login.do_login();   //some else });

符合amd的login module定義

 //依賴jquery的定義 define(['jquery'],function($){   // some definations  function do_login(){    $.post('/sessions/create',{uname:$("#uname").val(),         password:$("#password").val()},function(data){     //some    });   return {do_login:do_login};  }  });//不依賴其他模塊的定義define(function(){ //some definations return {xx:xx};});

rails沒有應用js加載器,一方面是新版本的rails的asset pipe會將所有的js文件打包為一個js文件,沒有多個js加載的狀態,另一方面turbolink使用褒貶參半的所謂pjax技術,默認鏈接改為ajax方式,只獲取html的bod部分,head部分不變動,使js的加載只在第一次打開網站時進行。


案例一: 加載 JavaScript 文件

 <script src="./js/require.js"></script>    <script>   require(["./js/a.js", "./js/b.js"], function() {        myFunctionA();        myFunctionB();     });    </script>

require 方法里的這個字符串數組參數可以允許不同的值,當字符串是以”.js”結尾,或者以”/”開頭,或者就是一個 URL 時,RequireJS 會認為用戶是在直接加載一個 JavaScript 文件,否則,當字符串是類似”my/module”的時候,它會認為這是一個模塊,并且會以用戶配置的 baseUrl 和 paths 來加載相應的模塊所在的 JavaScript 文件。配置的部分會在稍后詳細介紹。

這里要指出的是,RequireJS 默認情況下并沒有保證 myFunctionA 和 myFunctionB 一定是在頁面加載完成以后執行的,在有需要保證頁面加載以后執行腳本時,RequireJS 提供了一個獨立的 domReady 模塊,需要去 RequireJS 官方網站下載這個模塊,它并沒有包含在 RequireJS 中。有了 domReady 模塊,案例一 的代碼稍做修改加上對 domReady 的依賴就可以了。

案例二: 頁面加載后執行 JavaScript

 <script src="./js/require.js"></script>    <script>   require(["domReady!", "./js/a.js", "./js/b.js"], function() {        myFunctionA();        myFunctionB();     });    </script>

執行案例二的代碼后,通過 Firebug 可以看到 RequireJS 會在當前的頁面上插入為 a.js 和 b.js 分別聲明了一個 < script> 標簽,用于異步方式下載 JavaScript 文件。async 屬性目前絕大部分瀏覽器已經支持,它表明了這個 < script> 標簽中的 js 文件不會阻塞其他頁面內容的下載。

案例三:RequireJS 插入的 < script>

 <script type="text/javascript" charset="utf-8" async="" data-requirecontext="_"  data-requiremodule="js/a.js" src="js/a.js"></script>

使用 RequireJS 來定義 JavaScript 模塊

這里的 JavaScript 模塊與傳統的 JavaScript 代碼不一樣的地方在于它無須訪問全局的變量。模塊化的設計使得 JavaScript 代碼在需要訪問”全局變量”的時候,都可以通過依賴關系,把這些”全局變量”作為參數傳遞到模塊的實現體里,在實現中就避免了訪問或者聲明全局的變量或者函數,有效的避免大量而且復雜的命名空間管理。

如同 CommonJS 的 AMD 規范所述,定義 JavaScript 模塊是通過 define 方法來實現的。

下面我們先來看一個簡單的例子,這個例子通過定義一個 student 模塊和一個 class 模塊,在主程序中實現創建 student 對象并將 student 對象放到 class 中去。

案例四: student 模塊,student.js

 define(function(){    return {     createStudent: function(name, gender){        return {          name: name,          gender: gender        };     }    };  });

案例五:class 模塊,class.js

 

define(function() {  var allStudents = [];     return {       classID: "001",       department: "computer",       addToClass: function(student) {       allStudents.push(student);       },       getClassSize: function() {       return allStudents.length;       }     };    }  );

案例六: 主程序

 require(["js/student", "js/class"], function(student, clz) {  clz.addToClass(student.createStudent("Jack", "male"));  clz.addToClass(student.createStudent("Rose", "female"));  console.log(clz.getClassSize()); // 輸出 2  });

student 模塊和 class 模塊都是獨立的模塊,下面我們再定義一個新的模塊,這個模塊依賴 student 和 class 模塊,這樣主程序部分的邏輯也可以包裝進去了。

案例七: 依賴 student 和 class 模塊的 manager 模塊,manager.js

 

define(["js/student", "js/class"], function(student, clz){  return {   addNewStudent: function(name, gender){   clz.addToClass(student.createStudent(name, gender));     },   getMyClassSize: function(){   return clz.getClassSize();   }    };  });

案例八:新的主程序

 require(["js/manager"], function(manager) {  manager.addNewStudent("Jack", "male");  manager.addNewStudent("Rose", "female");  console.log(manager.getMyClassSize());// 輸出 2  });

通過上面的代碼示例,我們已經清楚的了解了如何寫一個模塊,這個模塊如何被使用,模塊間的依賴關系如何定義。還是有一些使用技巧需要提示一下:

盡量不要提供模塊的 ID,如 AMD 規范所述,這個 ID 是可選項,如果提供了,在 RequireJS 的實現中會影響模塊的可遷移性,文件位置變化會導致需要手動修改該 ID。

每個 JavaScript 文件只定義一個模塊,模塊名稱和文件路徑的查找算法決定了這種方式是最優的,多個的模塊和文件會被優化器進行優化。 避免模塊的循環依賴,如果實在避免不了,可以模塊中加上對”require”模塊的依賴,在代碼中直接用

require(”dependencyModuleName”)

配置 RequireJS:

前面的介紹中,我們似乎忽略了一個基本問題,模塊名字是怎么來的?當我在 require 一個模塊時,這個模塊是如何映射到具體的 JavaScript 文件上去?這就涉及到如何配置 RequireJS。

最簡化的加載 RequireJS 的方式如案例2 所示,在這種情況下,我們沒有指定一個 baseUrl 和 paths 給 RequireJS,如果通過如案例10 所示方式,則 data-main 指定了一個在當前 index.html 目錄并行的文件夾下的 /js/main.js 作為程序入口,而 /js 目錄也將作為 baseUrl 在其他模塊定義時候使用。

案例九:載入 require.js

 <script data-main="js/main" src="scripts/require.js"></script>

因此,我們前面示例中的所有模塊依賴,都可以去掉”js/”,直接寫 ”student”, ”class”,”manager” 等。 一種更為直接的方式顯示指定 baseUrl 和 paths 就是利用 require.config 來設置這些參數。如案例十 所示。

案例十. 配置 RequireJS

 <script type="text/javascript" src="./js/require.js"></script>  <script type="text/javascript">  require.config({   baseUrl: "./js",   paths: {     "some": "some/v1"  },  waitSeconds: 10  });  require( ["some/module", "my/module", "./js/a.js"],   function(someModule,  myModule) {}  );  </script>

baseUrl指明的是所有模塊的 base URL,比如”my/module”所加載的 script實際上就是 /js/my/module.js。注意,以 .js 結尾的文件加載時不會使用該 baseUrl,它們仍然會使用當前 index.html所在的相對路徑來加載,所以仍然要加上”./js/”。如果 baseUrl沒有指定,那么就會使用 data-main中指定的路徑。

paths 中定義的路徑是用于替換模塊中的路徑,如上例中的 some/module 具體的 JavaScript 文件路徑是 /js/some/v1/module.js 。 waitSeconds 是指定最多花多長等待時間來加載一個 JavaScript 文件,用戶不指定的情況下默認為 7 秒。

另外一個重要的配置是 packages,它可以指定其他符合 CommonJS AMD 規范的目錄結構,由此帶來了豐富的擴展性。如 Dojo、jQuery 等的模塊也可以通過該配置來讓 RequireJS 加載。

其他可配置的選項還包括 locale、context、deps、callback等,有興趣的讀者可以在 RequireJS 的官方網站查閱相關文檔。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
69视频在线免费观看| 国产精品小说在线| 国产精品久久一| 久久av中文字幕| 成人a免费视频| 69av在线视频| 欧美视频在线观看免费网址| www.日本久久久久com.| 国产精品91免费在线| 久久精品国产久精国产一老狼| 午夜精品久久久久久久99热浪潮| 97久久久免费福利网址| 91久久久久久久久久久| 国产视频丨精品|在线观看| 国产日韩欧美中文| 久久久久久这里只有精品| 日韩欧美在线视频| 精品伊人久久97| 欧美黑人一级爽快片淫片高清| 欧美麻豆久久久久久中文| 情事1991在线| 中文字幕免费国产精品| 欧美视频裸体精品| 欧美成人自拍视频| 国产精品自产拍高潮在线观看| 亚洲少妇激情视频| 久久人人爽人人爽人人片亚洲| 欧美丰满少妇xxxxx做受| 这里只有精品丝袜| 欧美成人精品在线视频| 欧美在线一级va免费观看| 91精品中国老女人| 一区二区三区视频免费| 欧美亚洲在线观看| 日韩电影中文 亚洲精品乱码| 亚洲国产精品系列| 69精品小视频| 亚洲黄页网在线观看| 欧美国产在线视频| 亚洲精品天天看| 日韩高清有码在线| 欧美大尺度在线观看| 亚洲区一区二区| 日韩免费观看在线观看| 久久久久久国产精品美女| 色黄久久久久久| 欧美wwwwww| 亚洲国产高潮在线观看| 亚洲精品自在久久| 欧美国产日韩中文字幕在线| 中文字幕av日韩| 亚洲欧洲在线视频| 亚洲国产精品一区二区久| 一区二区三区久久精品| www欧美xxxx| 国产欧美在线视频| 国产大片精品免费永久看nba| 精品福利樱桃av导航| 日韩精品在线视频| 日本欧美中文字幕| 精品成人av一区| 91av在线国产| 精品免费在线观看| 亚洲国产日韩精品在线| 日韩在线播放一区| 亚洲男人天堂九九视频| 亚洲天堂成人在线| 欧美国产一区二区三区| 91夜夜未满十八勿入爽爽影院| 国产成人av在线| 国色天香2019中文字幕在线观看| 国产欧美一区二区三区在线看| 亚洲精品中文字幕女同| 亚洲在线免费视频| 亚洲天堂成人在线| 欧美肥老妇视频| 欧洲美女7788成人免费视频| 欧美成人精品一区二区| 国产日本欧美一区二区三区| 91精品国产色综合| www.99久久热国产日韩欧美.com| 亚洲国产欧美久久| 欧美国产精品人人做人人爱| 最近的2019中文字幕免费一页| 久久久久久久久久久久av| 国产91在线高潮白浆在线观看| 亚洲天堂av在线免费| 精品av在线播放| 日本一区二区不卡| 亚洲精品自产拍| 国产成人精彩在线视频九色| 国产香蕉精品视频一区二区三区| 国产精品久久久久久网站| 亚洲午夜激情免费视频| 国产综合色香蕉精品| 国模吧一区二区三区| 久久精品视频在线| 成人av在线天堂| 亚洲小视频在线观看| 中文字幕日韩欧美在线视频| 日韩**中文字幕毛片| 91网在线免费观看| 欧美激情极品视频| 国产日韩精品在线播放| 中文精品99久久国产香蕉| 久久久精品欧美| 成人h视频在线| 日本aⅴ大伊香蕉精品视频| 国产精品视频久久久久| 国产成人亚洲精品| 国产手机视频精品| 亚洲欧美色婷婷| 欧洲成人免费视频| 日韩av免费在线看| 日韩午夜在线视频| 国产精品亚洲一区二区三区| 国产精品99久久99久久久二8| 亚洲第五色综合网| 国内精品免费午夜毛片| 国产一区二区视频在线观看| 91影视免费在线观看| 日韩影视在线观看| 日韩午夜在线视频| 欧美成人精品在线播放| 国产91露脸中文字幕在线| 日本精品久久久| 色综合久久88| 一区二区亚洲精品国产| 国产精品一区二区女厕厕| 国产亚洲美女精品久久久| 欧美国产乱视频| 国产精品成人一区二区三区吃奶| 久久久久久久久久久亚洲| 日本一区二区在线免费播放| 成人欧美一区二区三区黑人| 欧美大胆在线视频| 精品久久久久久电影| 欧美电影免费观看大全| 亚洲在线观看视频网站| 国产成人福利夜色影视| 日韩欧美黄色动漫| 国产精品久久久久久久久久尿| 色综合五月天导航| 成人黄色免费片| 久久久久久久97| 欧美激情影音先锋| 欧美极品少妇全裸体| 国产精品电影久久久久电影网| 国产91精品久久久| 国产亚洲免费的视频看| 亚洲欧美日本伦理| 91国产精品电影| 国自产精品手机在线观看视频| 日本国产一区二区三区| 欧美电影免费观看大全| 欧美精品久久久久久久| 国产亚洲精品成人av久久ww| 国产一区二区三区视频| 国产在线高清精品| 国产精品亚洲网站| 久久99精品视频一区97| 亚洲丝袜在线视频| 国产精品精品一区二区三区午夜版| 欧美日本精品在线|