require學習筆記總結

一、爲何使用require.js

做爲命名空間;
做爲命名空間使用;
異步加載js,避免阻塞,提升性能;
js經過require加載,沒必要寫不少script

二、require.js的加載

下載後,放在指定目錄就能夠加載了
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. <script src="js/require.js"></script>  
有人可能會想到,加載這個文件,也可能形成網頁失去響應。解決辦法有兩個,一個是把它放在網頁底部加載,另外一個是寫成下面這樣:
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. <script src="js/require.js" defer async="true" ></script>    
async屬性代表這個文件須要異步加載,避免網頁失去響應。IE不支持這個屬性,只支持defer,因此把defer也寫上。

 

 

 

 

這種寫法雖然簡單,但其實並不推薦,通常的寫法還要再加個屬性:javascript

[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. <script data-main="js/main" src="js/require-jquery.js"></script>    
就像一個c程序總有一個 main 方法做爲入口同樣,上面這種寫法,作了幾件事情:
一、加載了 require-jquery.js 文件。注意,官方提供了 require.js和 jquery 的打包版本,推薦。
二、在加載以後,加載入口文件 js/main.js ,注意,main.js 寫進去的時候,不須要後綴名。
你的全部其餘 js 模塊文件,均可以寫在 main.js 裏面,經過 main.js 加載。

三、require.js的配置

在data-main指定的主文件中,經過require.config來配置,並加載其餘js模塊
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. require.config({  
  2.     baseUrl: 'js/',  
  3.     paths: {  
  4.         "backbone": "backbone",  
  5.         "underscore": "underscore"  
  6.     },  
  7.     shim: {  
  8.         "backbone": {  
  9.             deps: [ "underscore" ],  
  10.             exports: "Backbone"  
  11.         },  
  12.         "underscore": {  
  13.             exports: "_"  
  14.         }  
  15.     }  
  16. });  
baseUrl:指定基路徑
paths:模塊加載路徑
shim:加載非AMD規範模塊     
  1. exports值(輸出的變量名),代表這個模塊外部調用時的名稱;
  2. deps數組,代表該模塊的依賴性。
  3. 主模塊能夠將項目基礎模塊加載加來並定義全局方法等
  4. [javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
     
     
    1. require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){  
    2.      // some code here  
    3.    });  

四、定義模塊(符合AMD規範)

require.js加載的模塊,採用AMD規範。也就是說,模塊必須按照AMD的規定來寫。
具體來講,就是模塊必須採用特定的define()函數來定義。若是一個模塊不依賴其餘模塊,那麼能夠直接定義在define()函數之中。
假定如今有一個math.js文件,它定義了一個math模塊。那麼,math.js就要這樣寫:
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. // math.js  
  2.    define(function (){  
  3.      var add = function (x,y){  
  4.        return x+y;  
  5.      };  
  6.      return {  
  7.        add: add  
  8.      };  
  9.    });  
加載方法以下:
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. // main.js  
  2.    require(['math'], function (math){  
  3.      alert(math.add(1,1));  
  4.    });  
若是這個模塊還依賴其餘模塊,那麼define()函數的第一個參數,必須是一個數組,指明該模塊的依賴性。
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. define(['myLib'], function(myLib){  
  2.      function foo(){  
  3.        myLib.doSomething();  
  4.      }  
  5.      return {  
  6.        foo : foo  
  7.      };  
  8.    });  

定義的模塊返回函數個數問題css

 

一、define 的return只有一個函數,require的回調函數能夠直接用別名代替該函數名。html

二、define 的return當有多個函數,require的回調函數必須用別名調用全部的函數。java

[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. require(['selector','book'], function(query,book) {  
  2.     var els = query('.wrapper');  
  3.   
  4.     book.fun1();  
  5.     book.fun2();  
  6. });  
此處query 函數是1的狀況,book 函數是2的狀況。

五、加載js文件

到此爲止,咱們遇到了兩個關鍵詞,一個是 define ,能夠用來定義模塊(命名空間),第一部分咱們講了;還有一個是 require,能夠直接加載其餘 js。它除了簡單的用法:
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. <script>  
  2. require( ["some" ] );  
  3. </script>  
以外,還有和 define 相似的複雜用法:
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. <script>   
  2. require(["aModule", "bModule"], function() {   
  3.     myFunctionA(); // 使用 aModule.js 中的函數 myFunctionA  
  4.     myFunctionB(); // 使用 bModule.js 中的函數 myFunctionB  
  5. });   
  6. </script>   
總結一下,define 是你定義本身的模塊的時候使用,能夠順便加載其餘js;require 直截了當,供你加載用的,它就是一個加載方法,加載的時候,能夠定義別名。

六、requ.js插件

require.js還提供一系列插件,實現一些特定的功能。node

domready插件,可讓回調函數在頁面DOM結構加載完成後再運行。jquery

[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. require(['domready!'], function (doc){  
  2.   // called once the DOM is ready  
  3. });  
text和image插件,則是容許require.js加載文本和圖片文件。
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. define([  
  2.      'text!review.txt',  
  3.      'image!cat.jpg'  
  4.      ],  
  5.      function(review,cat){  
  6.        console.log(review);  
  7.        document.body.appendChild(cat);  
  8.      }  
  9.    );  
相似的插件還有json和mdown,用於加載json文件和markdown文件。

七、其餘問題

一、路徑與後綴名
在 require 一個 js 文件的時候,通常不須要加上後綴名。若是加上後綴名,會按照絕對路徑加載。沒有後綴名,是按照下面的路徑加載:
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. <script data-main="js/main" src="js/require-jquery.js"></script>  
也就是默認加載 data-main 指定的目錄,即 js/main.js 文件所在的目錄。固然,你能夠經過配置文件修改。
二、define 定義模塊方法只能用在獨立的js文件中,不能在頁面中直接使用。
不然會報 Mismatched anonymous define() module 錯誤。

三、在代碼中require一個文件屢次,不會致使瀏覽器反覆加載ajax

不會,這是 RequrieJS 的優勢,即便你反覆 require 它,它只加載一次。json

八、require深刻

一、cdn回退
其支持當CDN加載不正確時,回退加載本地相應的庫。咱們能夠經過require.config達到這個目的:
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. requirejs.config({  
  2.     paths: {  
  3.         jquery: [  
  4.             '//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js',  
  5.             'lib/jquery'  
  6.         ]  
  7.     }  
  8. });  
二、沒有依賴?對象字面量?沒問題!
當你寫一個沒有任何依賴的模塊,而且只是返回一個對象包含一些功能函數,那麼咱們可使用一種簡單的語法:
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. define({  
  2.     forceChoke: function() {  
  3.   
  4.     },  
  5.     forceLighting: function() {  
  6.   
  7.     },  
  8.     forceRun: function() {  
  9.   
  10.     }      
  11. });  
很簡單,也頗有用,若是該模塊僅僅是功能的集合,或者只是一個數據包。
三、循環依賴
在一些狀況中,咱們可能須要模塊moduleA和moduleA中的函數須要依賴一些應用。這就是循環依賴。
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. // js/app/moduleA.js  
  2. define( [ "require", "app/app"],  
  3.     function( require, app ) {  
  4.         return {  
  5.             foo: function( title ) {  
  6.                 var app = require( "app/app" );  
  7.                 return app.something();  
  8.             }  
  9.         }  
  10.     }  
  11. );  
四、獲得模塊的地址
若是你須要獲得模塊的地址,你能夠這麼作……
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. var path = require.toUrl("./style.css");  
五、JSONP
咱們能夠這樣處理JSONP終端:
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. require( [   
  2.     "http://someapi.com/foo?callback=define"  
  3. ], function (data) {  
  4.     console.log(data);  
  5. });  

九、r.js壓縮

Require.js 提供一個腳本 r.js ,能夠將全部使用到的模塊壓縮成一個腳本文件,r.js 可使用 Node.js 來執行。api

在壓縮模塊前,須要寫一個配置文件,說明主模塊名,壓縮後的文件名,哪些模塊不要壓縮數組

沒有使用 define 定義的模塊都不要壓縮,包括 jQuery,backbone 等庫及其插件

[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. //build.js  
  2. ({  
  3.     baseUrl: '.',  
  4.     paths: {  
  5.     'jquery': 'empty:',  
  6.     'underscore': 'empty:',  
  7.     'backbone': 'empty:',  
  8.   },  
  9.     name: 'main',  
  10.     out: 'main.min.js'  
  11. })  
壓縮命令:
[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
  1. node r.js -o build.js  
相關文章
相關標籤/搜索