初識模塊化AMD和require.js

什麼是模塊化

模塊化是軟件系統的屬性,這個系統被分解爲一組高內聚,低耦合的模塊。那麼在理想狀態下我們只需要完成自己部分的核心業務邏輯代碼,其他方面的依賴可以通過直接加載被人已經寫好模塊進行使用即可。
作爲一個模塊化系統所必須的能力:
1. 定義封裝的模塊。
2. 定義新模塊對其他模塊的依賴。
3. 可對其他模塊的引入支持。



如何書寫模塊

一、函數寫法

  function m1(){
    //...
  }
  function m2(){
    //...
  }

函數m1和m2就是兩個最原始的模塊;但是它的缺點是,函數名高度暴露,污染了全局變量。

二、對象寫法

var module = new Object({
     m1: function(){
        //...
     },
     m2: funciton(){
        //...
     }
  })

以上代碼完成了模塊的書寫,調用它們只需要module.m1, module.m2即可。但是,缺點是,對象裏面的成員暴露出來了,在對象外部可以任意修改成員的值,例如:

module.m1=function(){
 //...修改原來的方法


三、立即執行函數的寫法

var module = function(){
   var m1 = funtion(){
      //...
    };
  var m2 = funtion(){
     //...
    };
  return {
     m1: m1,
     m2: m2
  }
}();

使用模塊 new module.m1(); new module.m2();




AMD規範

AMD:Asynchronous Module Definition 異步模塊定義;
官方文檔 https://github.com/amdjs/amdjs-api/wiki/AMD
語法規範:

require([module],callback)

第一個參數[module],是一個數組,裏面的成員就是需要加載的模塊。第二個參數callback,則是加載成功之後的回調函數;因爲是異步加載,只有當依賴的模塊加載完成後,才能運行後面的回調函數,所以適合瀏覽器環境,瀏覽器加載模塊的速度往往取決於網速,所以比較慢,需要異步加載才行。




require.js

RequireJS 是一個JavaScript模塊加載器。它非常適合在瀏覽器中使用,但它也可以用在其他腳本環境,就像 Rhino and Node。使用RequireJS加載模塊化腳本將提高代碼的加載速度和質量。

在沒有出現require.js之前,在html中引入js需要很多script標籤,就像下面,不僅不便於書寫起來繁雜,並且爲了保證模塊加載的順序正確,必須保證依賴越多的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>

然而,require.js的出現解決以上問題,它具有以下兩個優點:

實現js的異步加載,避免網頁失去響應。
管理模塊之間的依賴性,便於代碼的編寫和維護。




require.js的使用


step1、引入require.js文件

從官網下載require.js文件 http://requirejs.org/,然後再html中引入,注意要在body最底部引入,或者在script標籤中加入defer async=”true”

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


step2、模塊的定義

require.js模塊定義的規則符合AMD規範;
define()的第一個參數是一個數組,是依賴模塊;第二參數是回調函數,當依賴加載完成後才能運行;

define(['module1'], function(m1){
    m1.doSomeThing();//...參數m1爲加載的依賴模塊'module';
}


step3、主模塊的書寫

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

這裏面的main.js文件,我把它稱爲”主模塊”,意思是整個網頁的入口代碼;書寫規則如下:

//main.js
require.config(
    paths:{jquery:'jquery-1.8.3.min'}
});
require(['jquery','window'], function($,w){
    $("#a").click(function(){
       new w.Window().alert('shaojinghong',function(){
        alert('button is clicked');
       });
    });
});
  • require.config(
    paths:{jquery:’jquery-1.8.3.min’}
    });將模塊名和文件名關聯起來,前提是main.js和jquery-1.8.3.min.js 在一個文件夾下;

  • 如果模塊和main.js不在同一個文件下,可以使用

  require.config({
    paths: {
      "jquery": "lib/jquery.min"
      }
  • 如果模塊在cdn中,可以使用:
  require.config({
    paths: {
      "jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"
    }
  });
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章