1. 程式人生 > >JS模塊化-requireJS

JS模塊化-requireJS

sans cnblogs onu 失去 其他 不同的 簡單 brush float

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