require是什么?能做什么


本來是做后端的,拿到一個偏前端的項目,js文件里好多define和require,看的有點蒙,只能自己動手查找資源了,了解這到底是個什么,它能做什么?

1.什么是require.js?

1):require.js是一個js腳本加載器,它遵循AMD(Asynchronous Module Definition)規范,實現js腳本的異步加載,不阻塞頁面的渲染和其后的腳本的執行,並提供了在加載完成之后的執行相應回調函數的功能;

2):require.js要求js腳本必須要實現模塊化,即文件化;而require.js的作用之一就是加載js模塊,也就是js文件。

3):require.js可以管理js模塊/文件之間的依賴;即不同的框架例如Jquery,AngularJs等采用了不同的語法,而使用這些語法的js文件在導入時必須排在Jquery.js或Angular.js之后才能順利執行,require.js則能夠解決排序依賴問題。

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

 

2.為什么要使用require.js?

<!DOCTYPE html>
<html>
   <head>
     <script type= "text/javascript" src= "a.js" ></script>
   </head>
   <body>
    <span>Hellow World</span>
   </body>
</html>
以上代碼,會先加載head中引入的js文件及js文件中的腳本函數,再渲染body中的內容
這就是JS阻塞瀏覽器渲染導致的結果。加載文件越多,網頁失去響應的時間就會越長。
由於js文件之間存在依賴關系,因此必須嚴格保證加載順序,依賴性最大的模塊一定要放到最后加載,當依賴關系很復雜的時候,代碼的編寫和維護都會變得困難。
 

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

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

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

 

3、require.js的使用-加載

官方網址:http://requirejs.org/docs/download.html

<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

 

4.require.js的使用-API

3步中引入了main.js文件,main.js的寫法

define( function (){
   function fun1(){
    alert( "main.js已生效" );
   }
   fun1();
})
通過define函數定義了一個模塊,然后在頁面中通過require()函數使用:
require([ "js/main" ]);
一般情況下,它會依賴於其他的js框架,比如jquery等等
require([ 'jquery' , 'B' , 'C' ], function (A, B, C){
   // js代碼
});

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

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

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

 

5、加載文件

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>
 
6、 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" );
})
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM