(轉)RequireJS是一個非常小巧的JavaScript模塊載入框架,是AMD規范最好的實現者之一。最新版本的RequireJS壓縮后只有14K,堪稱非常輕量。它還同時可以和其他的框架協同工作,使用RequireJS必將使您的前端代碼質量得以提升。
(補充:AMD規范:全稱是Asynchronous Module Definition,即異步模塊加載機制。AMD規范簡單到只有一個API,即define函數。
define([module-name?], [array-of-dependencies?], [module-factory-or-object]);
異步性。當define函數執行時,它首先會異步的去調用第二個參數中列出的依賴模塊,當所有的模塊被載入完成之后,如果第三個參數是一個回調函數則執行,然后告訴系統模塊可用,也就通知了依賴於自己的模塊自己已經可用。
異步和同步的區別顯而易見,前者不會阻塞瀏覽器,有更好的性能和靈活性。而對於NodeJs這樣的服務器端AMD,則模塊載入無需阻塞服務器進程,同樣提高了性能。)
使用requirejs好處:1、放置JS加載阻塞頁面渲染。2、減少多行JS代碼引入。
Require基本API:
require會定義三個變量:define,require,requirejs,其中require === requirejs,一般使用require更簡短
- define 定義一個模塊
- require 加載依賴模塊,並執行加載完后的回調函數
簡單使用:
HTML:
<!DOCTYPE html> <html> <head> <script type="text/javascript" src="require.js"></script> <script type="text/javascript"> require(["a"]); </script> </head> <body> <span>body</span> </body> </html>
通過define函數定義了一個模塊:
a.js:
define(function(){
function fun1(){
alert("it works");
}
fun1();
})
require用來加載該模塊(注意require中的依賴是一個數組,即使只有一個依賴,你也必須使用數組來定義),requir API的第二個參數是callback,一個function,是用來處理加載完畢后的邏輯,如:
require(["js/a"],function(){
alert("load finished");
})
(JS渲染阻塞:當不使用requirejs時,執行alert彈出框后不會HTML頁面不會顯示body,只有確定彈出框后才正常顯示頁面。這是JS渲染阻塞影響。)
加載文件
需要加載的JS可能來自本地服務器、其他網站或CDN:
require.config({
paths : {
"jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery"],
"a" : "js/a"
}
})
require(["jquery","a"],function($){
$(function(){
alert("load finished");
})
})
通過paths的配置會使我們的模塊名字更精煉,paths還有一個重要的功能,就是可以配置多個路徑,如果遠程cdn庫沒有加載成功,可以加載本地的庫,如:(這樣配置后,當百度的jquery沒有加載成功后,會加載本地js目錄下的jquery)
require.config({
paths : {
"jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery", "js/jquery"],
"a" : "js/a"
}
})
require(["jquery","a"],function($){
$(function(){
alert("load finished");
})
})
- 在使用requirejs時,加載模塊時不用寫
.js
后綴的,當然也是不能寫后綴 - 上面例子中的callback函數中發現有
$
參數,這個就是依賴的jquery
模塊的輸出變量,如果你依賴多個模塊,可以依次寫入多個參數來使用:
require(["jquery","underscore"],function($, _){
$(function(){
_.each([1,2,3],alert);
})
})
第三方模塊
通過require
加載的模塊一般都需要符合AMD規范即使用define
來申明模塊,但是部分時候需要加載非AMD規范的js,這時候就需要用到另一個功能:shim