【前端】Require.js使用方法總結


一、為什么要使用require.js

      首先一個頁面如果在加載多個js文件的時候,瀏覽器會停止網頁渲染,加載文件越多,網頁失去響應的時間就會越長;其次,由於js文件之間存在依賴關系,因此必須嚴格保證加載順序,當依賴關系很復雜的時候,代碼的編寫和維護都會變得困難。

      require.js,就是為了解決這兩個問題:

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

 

二、require.js的加載

      第一步,去官網下載最新版本,直接放到頁面進行加載

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

      加載這個文件可能會導致網頁失去響應,可以將它放到頁面的底部加載,也可以這樣寫 

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

      async屬性表明這個文件需要異步加載,避免網頁失去響應。IE不支持這個屬性,只支持defer,所以把defer也寫上。

      加載require.js以后,下一步就要加載我們自己的代碼了,也就是入口,可以叫主模塊,如果文件名叫main.js,寫成下面這樣就可以了:

<script src="js/require.js" data-main="js/main"></script>    .js后綴可以省略

  

三、主模塊的寫法

      如果主模塊依賴於jQuery可以這樣寫

 require(['jquery'], function ($){
   alert($);
});

 

四、require.config()方法

 

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

 

    上面的代碼給出了三個模塊的文件名,路徑默認與main.js在同一個目錄(js子目錄)。如果這些模塊在其他目錄,比如js/lib目錄,則有兩種寫法。

  • 一種是逐一指定路徑
require.config({
  paths: {
    "jquery": "lib/jquery.min",
    "underscore": "lib/underscore.min",
    "backbone": "lib/backbone.min"
  }
});
  •  另一種則是直接改變基目錄(baseUrl)。
require.config({
  baseUrl: "js/lib",
  paths: {
    "jquery": "jquery.min",
    "underscor: "underscore.min",
    "backbone": "backbone.min"
  }
});
  •      如果某個模塊在另一台主機上,也可以直接指定它的網址,比如
require.config({
  paths: {
    "jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"
  }
});

  

五、AMD模塊的寫法

     require.js加載的模塊,采用AMD規范。也就是說,模塊必須按照AMD的規定來寫。

     具體來說,就是模塊必須采用特定的define()函數來定義。如果一個模塊不依賴其他模塊,那么可以直接定義在define()函數之中。

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

  加載方法如下:

 // main.js
require(['math'], function (math){
  alert(math.add(1,1));
});

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

 define(['myLib'], function(myLib){
  function foo(){
    myLib.doSomething();
  }
  return {     //返回模塊中的函數
    foo : foo
  };
});

     當require()函數加載上面這個模塊的時候,就會先加載myLib.js文件。

 

六、加載非規范的模塊(shim的使用方式)

 

 //  app.js
 function sayHello(name){
  alert('Hi '+name);
}

 

 //  main.js
require.config({
  shim: {
    'app': { //這個鍵名為要載入的目標文件的文件名,不能隨便命名。
      exports: 'sayHello' //exports的值為my.js提供的 對外接口的名稱
    }
  }
});

require(['app'], function(sayHello) {
    alert(sayHello())  
})

  

      導出一個函數,意味着我們得到了一個javaScript類

      但是如果在my.js中寫了很多function,整合成一個function有點麻煩,想直接導出?方法如下:

 // app.js
function sayHi(name){
    alert('Hi '+name);
}
function sayHello(name){
    alert('Hiello  '+name);
}
// main.js  
  require.config({
    shim: {
      app: {
        init: function() { //這里使用init將2個接口返回
          return {
            sayHi: sayHi,
            sayHello: sayHello
          }
        }
      }
    }
  });

  require(['app'], function(a) {
    a.sayHi('zhangsan');
    a.sayHello('lisi');
  });

     shim的有序導入

   require.config({  

    shim: {  
      'jquery.ui.core': ['jquery'],  //表示在jquery導入之后導入
      'jquery.ui.widget': ['jquery'],  
      'jquery.ui.mouse': ['jquery'],  
      'jquery.ui.slider':['jquery']
     },  
    paths : {    
       jquery : 'jquery-2.1.1/jquery',    
       domReady : 'require-2.1.11/domReady',    
       'jquery.ui.core' : 'jquery-ui-1.10.4/development-bundle/ui/jquery.ui.core',    
       'jquery.ui.widget' : 'jquery-ui-1.10.4/development-bundle/ui/jquery.ui.widget',    
       'jquery.ui.mouse' : 'jquery-ui-1.10.4/development-bundle/ui/jquery.ui.mouse',    
       'jquery.ui.slider' : 'jquery-ui-1.10.4/development-bundle/ui/jquery.ui.slider' 
        }
  });    
 
  require(['jquery', 'domReady','jquery.ui.core','jquery.ui.widget','jquery.ui.mouse','jquery.ui.slider'],    function($) {            
      $("#slider" ).slider({              
       value:0,           
       min: 0,           
       max: 4,           
       step: 1,           
       slide: function( event, ui ) {}     
        });    
   });

  


免責聲明!

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



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