require.js詳解

來源:互聯網
上載者:User

標籤:說明   運行   port   詳解   預設   require   blog   第三方模組   amd   

一:什麼是require.js

①:require.js是一個js指令碼載入器,它遵循AMD(Asynchronous Module Definition)規範,實現js指令碼的非同步載入,不阻塞頁面的渲染和其後的指令碼的執行,並提供了在載入完成之後的執行相應回呼函數的功能;

②:require.js要求js指令碼必須要實現模組化,即檔案化;而require.js的作用之一就是載入js模組,也就是js檔案。

③:require.js可以管理js模組/檔案之間的依賴;即不同的架構例如Jquery,AngularJs等採用了不同的文法,而使用這些文法的js檔案在匯入時必須排在Jquery.js或Angular.js之後才能順利執行,require.js則能夠解決排序依賴問題。

二:為什麼要使用require.js

①:載入的時候,瀏覽器會停止網頁渲染,原因如下:

在不使用require.js時,檔案編寫方式如下:

<!DOCTYPE html><html>    <head>        <script type="text/javascript" src="a.js"></script>    </head>    <body>      <span>Hellow World</span>    </body></html>

 在匯入的a.js檔案中:

(function(){    function fun1(){      alert("JS檔案已生效");    }    fun1();})()

 在運行以上代碼時我們可以注意到在alert彈出的提示框出現的時候,網頁html的部分仍然是空白的,沒有顯示出任何內容,當我們點擊確定之後"Hellow World"才會顯示在網頁中,這就是JS阻塞瀏覽器渲染導致的結果。負載檔案越多,網頁失去響應的時間就會越長。

②:由於js檔案之間存在依賴關係,因此必須嚴格保證載入順序,依賴性最大的模組一定要放到最後載入,當依賴關係很複雜的時候,代碼的編寫和維護都會變得困難。例如:

<!DOCTYPE html><html><head><meta charset="utf-8" /><title></title><script type="text/javascript" src="js/jquery-1.10.2.js" ></script><script type="text/javascript" src="js/b.js" ></script></head><body><div id="div1" style="width: 100px;height: 100px;background-color: red;"></div></body></html>

 在b.js檔案中

$(function(){$("#div1").css("background-color","blue");})

 為了使b.js中的代碼生效,必須要把<script type="text/javascript" src="js/b.js" ></script>這行代碼放到<script type="text/javascript" src="js/jquery-1.10.2.js" ></script>後面,這樣在使用的架構和js檔案較多的時候,它們的匯入順序就會變得很麻煩。

require.js的誕生就是為瞭解決上面所說的兩個問題:

1.實現js檔案的非同步載入,避免網頁失去響應;

2.管理模組之間的依賴性,便於代碼的編寫和維護。

三:require.js的載入

①:首先,我們要去官網下載最新的版本,官方網址:http://requirejs.org/docs/download.html

  下載完成後,將它放在網站項目的js子檔案夾下就可以使用了:

 

<script src="js/require.js"></script>

 

 這裡可能會遇到一個問題:載入這個檔案,也可能造成網頁失去響應,這個問題的解決辦法有兩種:

1.將這行代碼寫成如下格式:

<script src="js/require.js" defer async="true" ></script>

 其中:async屬性和defer屬性工作表明這個檔案需要非同步載入,避免網頁失去響應。IE只支援defer屬性,而不支援async屬性。

2.將檔案放到網頁底部載入。

②:載入完require.js之後,我們就可以載入自己的代碼了,假設我們自己的js檔案命名為main.js,同樣放於js檔案夾下,那麼,只需要執行如下代碼:

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

上述代碼中,data-main屬性的作用是指定網頁程式的主模組。即js目錄下面的main.js,這個檔案會第一個被require.js載入。由於require.js預設的檔案尾碼名是js,所以可以省略掉".js"簡寫成main。

 四:基本API

在上一部分中,我們引入了main.js檔案,main.js的寫法:

define(function(){    function fun1(){      alert("main.js已生效");    }    fun1();})

這樣,我們就通過define函數定義了一個模組,然後在頁面中通過AMD規範定義的的require()函數使用:

require(["js/main"]);

一般情況下,它會依賴於其他的js架構,比如jquery等等,那麼,我們這時就要在分頁檔中。我們需要按照以下格式來寫:

  require([‘A‘, ‘B‘, ‘C‘], function (A, B, C){    // js代碼  });

require()函數接受兩個參數。第一個參數是一個數組,表示所依賴的架構,上例就是[‘A‘, ‘B‘, ‘C‘],即main.js裡的代碼需要用到這三個模組;第二個參數是一個回呼函數,當前面指定的模組都載入成功後,它將被調用。載入的模組會以參數形式傳入該函數,從而在回呼函數內部就可以使用這些模組。

require()會非同步載入A,B,C三個模組,瀏覽器不會失去響應;它指定的回呼函數,只有前面的模組都載入成功後,才會運行,解決了依賴性的問題。

下面。我們就以jquery為例,說明這個函數是怎樣啟動並執行:

require([‘jquery‘], function ($){  // jquery代碼});

 require.js會先載入jQuery,然後再運行回呼函數。main.js的代碼就寫在回呼函數中。注意:require中的依賴是一個數組,即使只有一個依賴,你也必須使用數組來定義。

五:負載檔案

在上一部分中,main.js的相依模組是[‘jquery‘]。預設情況下,require.js會假定這個模組與main.js在同一個目錄,檔案名稱是 jquery.js,然後自動載入,除此之外,我們可以通過require.config()方法,我們可以對模組的載入行為進行自訂,require.config()就寫在main.js的頭部,它的參數是一個對象,這個對象的paths屬性指定各個模組的載入路徑。

require.config({    paths: {      "jquery": "jquery.min",      "anjular": "anjular.min"    }  });

 上述模組路徑預設與main.js在同一個目錄(js子目錄)。如果這些模組在其他目錄,比如js/lib目錄,則有兩種寫法。一種是逐一指定路徑:

require.config({    paths: {      "jquery": "lib/jquery.min",      "anjular": "lib/anjular.min"    }  });

 另一種則是直接改變根目錄(baseUrl):

require.config({    baseUrl: "js/lib",    paths: {      "jquery": "jquery.min",      "anjular": "anjular.min"    }  });

 之前的例子中載入模組都是本地js,但是大部分情況下網頁需要載入的JS可能來自本機伺服器、其他網站或CDN,這樣就不能通過這種方式來載入了,我們以載入一個jquery庫為例:

require.config({    paths : {        "jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery"]       }})

 上面的例子中重複出現了require.config配置,如果每個頁面中都加入配置,必然會十分麻煩,requirejs提供了一種叫"主要資料"的功能,我們可以將所有的require.config配置放到main.js中,在頁面中調用它,

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

 就可以使每一個頁面都使用這個配置,然後頁面中就可以直接使用require來載入所有的短模組名。

六:AMD模組的寫法

 

require.js載入的模組,採用AMD規範,也就是說,模組必須按照AMD的規定來寫。具體來說,就是模組必須採用特定的define()函數來定義。如果一個模組不依賴其他模組,那麼可以直接定義在define()函數之中。假定現在有一個math.js檔案,它定義了一個math模組。那麼,math.js就要這樣寫:

define(function (){    var add = function (x,y){      return x+y;    };    return {      add: add    };  });

 然後在頁面中:

require([‘math‘], function (math){  alert(math.add(1,1));});

 如果這個js檔案還依賴其他模組,那麼define()函數的第一個參數,必須是一個數組,指明該模組的依賴性。

define([‘jquery‘], function($){    $("#div1").css("background-color","red");})    

當require()函數載入上面這個模組的時候,就會先載入jquery.js檔案。 

七:第三方模組

通過require載入的模組一般都需要符合AMD規範即使用define來申明模組,但是部分時候需要載入非AMD規範的js,這時候就需要用到另一個功能:shim:

1. 非AMD模組輸出,將非標準的AMD模組變成可用的模組,例如:在老版本的jquery中,是沒有繼承AMD規範的,所以不能直接require["jquery"],這時候就需要shim

require.config({    shim: {        "jquery" : {exports : "$"}    }})

 這樣配置後,我們就可以在其他模組中引用jquery模組:

require(["jquery"], function(_){   $("#div1").css("background-color","red");})

 2.外掛程式形式的非AMD模組,我們經常會用到jquery外掛程式,而且這些外掛程式基本都不符合AMD規範,比如jquery.form外掛程式,這時候就需要將form外掛程式加入到jquery中:

require.config({    shim: {        "jquery.form" : {            deps : ["jquery"]        }    }})    

 

require.config(["jquery", "jquery.form"], function($){    $(function(){        $("#form").ajaxSubmit({...});    })})

 以上就是require的基本用法詳解。

 

require.js詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.