1. 爲何要使用require.js |
剛開始的時候,網頁須要用到不少不一樣的插件,都是依次加載,須要注意其中的加載順序即依賴關係。html
<script src="1.js"></script> <script src="2.js"></script> <script src="3.js"></script> <script src="4.js"></script> <script src="5.js"></script> <script src="6.js"></script>
這種寫法有很大缺點。首先,加載的時候,瀏覽器會中止網頁渲染,加載文件越多,網頁失去響應的時間就會越長;jquery
其次,因爲js文件之間存在依賴關係,所以必須嚴格保證加載順序(好比上例的1.js要在2.js的前面),依賴性最大的數組
模塊必定要放到最後加載,當依賴關係很複雜的時候,代碼的編寫和維護都會變得困難。瀏覽器
① 實現js文件的異步加載,避免網頁失去響應;異步
② 管理模塊之間的依賴性,便於代碼的編寫和維護。async
2. require.js的使用函數 |
2.1.1 使用require.js的第一步,是先去官方網站下載最新版本。requirejs
下載後,假定把它放在js子目錄下面,就能夠加載了。網站
<script src="js/require.js" defer async="true" ></script>
async屬性代表這個文件須要異步加載,避免網頁失去響應。IE不支持這個屬性,只支持defer,因此把defer也寫上。ui
也能夠將這行代碼放在網頁底部加載。
2.1.2 加載require.js之後,下一步就要加載咱們本身的代碼了。假定咱們本身的代碼文件是main.js,也放在js目錄下面。那麼,只須要寫成下面這樣就好了:
<script src="js/require.js" data-main="js/main"></script>
data-main屬性的做用是,指定網頁程序的主模塊。在上例中,就是js目錄下面的main.js,這個文件會第一個被require.js加載。
因爲require.js默認的文件後綴名是js,因此能夠把main.js簡寫成main。
這是個人JS目錄。
經過require方法,實現代碼的模塊加載,require()函數接受兩個參數:
① 第一個參數是一個數組,表示所依賴的模塊,例如["JQuery","underscore", 「backbone」],即主模塊依賴這兩個模塊;
② 第二個參數是一個回調函數,當前面指定的模塊都加載成功後,它將被調用。加載的模塊會以參數形式傳入該函數,
從而在回調函數內部就可使用這些模塊。回調函數就是整個頁面的JS代碼。
require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){ });
一、默認狀況下,require.js假定這兩個模塊與main.js在同一個目錄,文件名分別爲jquery.js,underscore.js,而後自動加載。使用
require.config()方法,咱們能夠對模塊的加載行爲進行自定義。
require.config是用來配置模塊加載位置,簡單點說就是給模塊起一個更短更好記的名字。
require.config({
paths: {
"jquery": ["http://libs.baidu.com/jquery/2.0.3/jquery", "jquery-3.1.1.min"], "underscore": "underscore" } });
require.config()就寫在主模塊main.js的頭部。參數就是一個對象,這個對象的paths 屬性指定各個模塊的加載路徑。
paths還有一個重要的功能,就是能夠配置多個路徑,若是遠程cdn庫沒有加載成功,能夠加載本地的庫。
二、上面的代碼給出了三個模塊的文件名,路徑默認與main.js在同一個目錄(js子目錄)。若是這些模塊在其餘目錄,
好比js/lib目錄,則有兩種寫法。一種是逐一指定路徑。
require.config({ paths: { "jquery": "lib/jquery", "underscore": "lib/underscore" } });
另外一種則是直接改變基目錄baseUrl:
require.config({ baseUrl: "js/lib", paths: { "jquery": "jquery", "underscore": "underscore" } });
三、加載非規範化模塊
shim屬性,專門用來配置不兼容的模塊。具體來講,每一個模塊要定義
① exports值(輸出的變量名),代表這個模塊外部調用時的名稱;
② deps數組,代表該模塊的依賴性。
好比,jQuery的插件能夠這樣定義:
require.config({ baseUrl: "js/lib", shim: { 'underscore':{ exports: '_' }, 'backbone': { deps: ['underscore', 'jquery'], exports: 'Backbone' } } paths: { "jquery": "jquery", "underscore": "underscore" } });
① 模塊必須採用特定的define()函數來定義。若是一個模塊不依賴其餘模塊,那麼能夠直接定義在define()函數之中。
define(function (){});
② 若是這個模塊還依賴其餘模塊,那麼define()函數的第一個參數,必須是一個數組,指明該模塊的依賴性。
define(['jquery'], function(jquery){});
3. 例子 |
一、student.js文件:
define(function() { return { createStudent: function(name, gender) { return { name: name, gender: gender }; } }; });
二、class.js文件:
define(function() { var allStudents = []; return { classID: "001", department: "computer", addToClass: function(student) { allStudents.push(student); }, getClassSize: function() { return allStudents; } }; } );
三、manager.js文件:
define(["student", "class"], function(student, clz) { return { addNewStudent: function(name, gender) { clz.addToClass(student.creatStudent(name, gender)); }, getMyClassSize: function() { return clz.getClassSize(); } }; });
四、main.js文件:
require(["manager"], function(manager) { manager.addNewStudent("Jack", "男"); manager.addNewStudent("Rose", "女"); console.log(manager.getMyClassSize()); });