JS模塊化-requireJS

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的前面),依賴性最大的數組

模塊必定要放到最後加載,當依賴關係很複雜的時候,代碼的編寫和維護都會變得困難。瀏覽器

 

1.1require.js的做用

① 實現js文件的異步加載,避免網頁失去響應;異步

② 管理模塊之間的依賴性,便於代碼的編寫和維護。async

 

 

2. require.js的使用函數

 

2.1require.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目錄。

 

2.2主模塊的寫法

 經過require方法,實現代碼的模塊加載,require()函數接受兩個參數:

 ① 第一個參數是一個數組,表示所依賴的模塊,例如["JQuery","underscore", 「backbone」],即主模塊依賴這兩個模塊;

 ② 第二個參數是一個回調函數,當前面指定的模塊都加載成功後,它將被調用。加載的模塊會以參數形式傳入該函數,

     從而在回調函數內部就可使用這些模塊。回調函數就是整個頁面的JS代碼。

  require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){
    
  });

 

2.3模塊的加載

一、默認狀況下,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"
    }
  });

 

2.4AMD模塊的寫法

 

①  模塊必須採用特定的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()); 
}); 
相關文章
相關標籤/搜索