JS模塊化-requireJS
1. 為什麽要使用require.js |
剛開始的時候,網頁需要用到很多不同的插件,都是依次加載,需要註意其中的加載順序即依賴關系。
<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>
這種寫法有很大缺點。首先,加載的時候,瀏覽器會停止網頁渲染,加載文件越多,網頁失去響應的時間就會越長;
其次,由於js文件之間存在依賴關系,因此必須嚴格保證加載順序(比如上例的1.js要在2.js的前面),依賴性最大的
模塊一定要放到最後加載,當依賴關系很復雜的時候,代碼的編寫和維護都會變得困難。
1.1require.js的作用
① 實現js文件的異步加載,避免網頁失去響應;
② 管理模塊之間的依賴性,便於代碼的編寫和維護。
2. require.js的使用 |
2.1require.js的加載
2.1.1 使用require.js的第一步,是先去官方網站下載最新版本。
下載後,假定把它放在js子目錄下面,就可以加載了。
<script src="js/require.js" defer async="true" ></script>
async屬性表明這個文件需要異步加載,避免網頁失去響應。IE不支持這個屬性,只支持defer,所以把defer也寫上。
也可以將這行代碼放在網頁底部加載。
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目錄。
2.2主模塊的寫法
通過require方法,實現代碼的模塊加載,require()函數接受兩個參數:
① 第一個參數是一個數組,表示所依賴的模塊,例如["JQuery","underscore", “backbone”],即主模塊依賴這兩個模塊;
② 第二個參數是一個回調函數,當前面指定的模塊都加載成功後,它將被調用。加載的模塊會以參數形式傳入該函數,
從而在回調函數內部就可以使用這些模塊。回調函數就是整個頁面的JS代碼。
require([‘jquery‘, ‘underscore‘, ‘backbone‘], function ($, _, Backbone){ });
2.3模塊的加載
1、默認情況下,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庫沒有加載成功,可以加載本地的庫。
2、上面的代碼給出了三個模塊的文件名,路徑默認與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" } });
3、加載非規範化模塊
shim屬性,專門用來配置不兼容的模塊。具體來說,每個模塊要定義
① exports值(輸出的變量名),表明這個模塊外部調用時的名稱;
② deps數組,表明該模塊的依賴性。
比如,jQuery的插件可以這樣定義:
require.config({ baseUrl: "js/lib", shim: { ‘underscore‘:{ exports: ‘_‘ }, ‘backbone‘: { deps: [‘underscore‘, ‘jquery‘], exports: ‘Backbone‘ } } paths: { "jquery": "jquery", "underscore": "underscore" } });
2.4AMD模塊的寫法
① 模塊必須采用特定的define()函數來定義。如果一個模塊不依賴其他模塊,那麽可以直接定義在define()函數之中。
define(function (){});
② 如果這個模塊還依賴其他模塊,那麽define()函數的第一個參數,必須是一個數組,指明該模塊的依賴性。
define([‘jquery‘], function(jquery){});
3. 例子 |
1、student.js文件:
define(function() { return { createStudent: function(name, gender) { return { name: name, gender: gender }; } }; });
2、class.js文件:
define(function() { var allStudents = []; return { classID: "001", department: "computer", addToClass: function(student) { allStudents.push(student); }, getClassSize: function() { return allStudents; } }; } );
3、manager.js文件:
define(["student", "class"], function(student, clz) { return { addNewStudent: function(name, gender) { clz.addToClass(student.creatStudent(name, gender)); }, getMyClassSize: function() { return clz.getClassSize(); } }; });
4、main.js文件:
require(["manager"], function(manager) { manager.addNewStudent("Jack", "男"); manager.addNewStudent("Rose", "女"); console.log(manager.getMyClassSize()); });
JS模塊化-requireJS