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"
三、主模塊的寫法
如果主模塊依賴於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",
"underscore": "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 ) {}
});
});
以上內容參考:http://www.ruanyifeng.com/blog/2012/11/require_js.html
http://***/article/129714
require.js 總結