require.js 總結

1、爲何要使用require.jshtml

      首先一個頁面若是在加載多個js文件的時候,瀏覽器會中止網頁渲染,加載文件越多,網頁失去響應的時間就會越長;其次,因爲js文件之間存在依賴關係,所以必須嚴格保證加載順序,當依賴關係很複雜的時候,代碼的編寫和維護都會變得困難。java

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

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

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

2、require.js的加載數組

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

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

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

      <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後綴能夠省略

3、主模塊的寫法

      若是主模塊依賴於jQuery能夠這樣寫

      require(['jquery'], function ($){

     alert($);

  });

      

4、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",
      "underscore": "underscore.min",
      "backbone": "backbone.min"

    }

  });

     若是某個模塊在另外一臺主機上,也能夠直接指定它的網址,好比

     require.config({

    paths: {

      "jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"

    }

  });

 

5、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文件。

 

6、加載非規範的模塊(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 ) {}     
         });    
    });

     以上內容參考:http://www.ruanyifeng.com/blog/2012/11/require_js.html       

http://***/article/129714

相關文章
相關標籤/搜索