做爲命名空間; 做爲命名空間使用;
異步加載js,避免阻塞,提升性能; js經過require加載,沒必要寫不少scriptcss
require.js下載 下載後,放在指定目錄就能夠加載了html
1
|
<script src=
"js/require.js"
></script>
|
有人可能會想到,加載這個文件,也可能形成網頁失去響應。解決辦法有兩個,一個是把它放在網頁底部加載,另外一個是寫成下面這樣:java
1
|
<script src=
"js/require.js"
defer async=
"true"
></script>
|
async屬性代表這個文件須要異步加載,避免網頁失去響應。IE不支持這個屬性,只支持defer,因此把defer也寫上。node
這種寫法雖然簡單,但其實並不推薦,通常的寫法還要再加個屬性:jquery
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 加載。ajax
在data-main指定的主文件中,經過require.config來配置,並加載其餘js模塊json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
require.config({
baseUrl:
'js/'
,
paths: {
"backbone"
:
"backbone"
,
"underscore"
:
"underscore"
},
shim: {
"backbone"
: {
deps: [
"underscore"
],
exports:
"Backbone"
},
"underscore"
: {
exports:
"_"
}
}
});
|
baseUrl:指定基路徑 paths:模塊加載路徑 shim:加載非AMD規範模塊api
1
2
3
|
require([
'jquery'
,
'underscore'
,
'backbone'
], function ($, _, Backbone){
// some code here
});
|
1
2
3
4
5
6
7
8
9
|
// math.js
define(function (){
var add = function (x,y){
return
x+y;
};
return
{
add: add
};
});
|
1
2
3
4
|
// main.js
require([
'math'
], function (math){
alert(math.add(
1
,
1
));
});
|
1
2
3
4
5
6
7
8
|
define([
'myLib'
], function(myLib){
function foo(){
myLib.doSomething();
}
return
{
foo : foo
};
});
|
定義的模塊返回函數個數問題數組
一、define 的return只有一個函數,require的回調函數能夠直接用別名代替該函數名。瀏覽器
二、define 的return當有多個函數,require的回調函數必須用別名調用全部的函數。
1
2
3
4
5
6
|
require([
'selector'
,
'book'
], function(query,book) {
var els = query(
'.wrapper'
);
book.fun1();
book.fun2();
});
|
1
2
3
|
<script>
require( [
"some"
] );
</script>
|
1
2
3
4
5
6
|
<script>
require([
"aModule"
,
"bModule"
], function() {
myFunctionA();
// 使用 aModule.js 中的函數 myFunctionA
myFunctionB();
// 使用 bModule.js 中的函數 myFunctionB
});
</script>
|
require.js還提供一系列插件,實現一些特定的功能。
domready插件,可讓回調函數在頁面DOM結構加載完成後再運行。
1
2
3
|
require([
'domready!'
], function (doc){
// called once the DOM is ready
});
|
1
2
3
4
5
6
7
8
9
|
define([
'text!review.txt'
,
'image!cat.jpg'
],
function(review,cat){
console.log(review);
document.body.appendChild(cat);
}
);
|
1
|
<script data-main=
"js/main"
src=
"js/require-jquery.js"
></script>
|
三、在代碼中require一個文件屢次,不會致使瀏覽器反覆加載
不會,這是 RequrieJS 的優勢,即便你反覆 require 它,它只加載一次。
1
2
3
4
5
6
7
8
|
requirejs.config({
paths: {
jquery: [
'//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js'
,
'lib/jquery'
]
}
});
|
1
2
3
4
5
6
7
8
9
10
11
|
define({
forceChoke: function() {
},
forceLighting: function() {
},
forceRun: function() {
}
});
|
1
2
3
4
5
6
7
8
9
10
11
|
// js/app/moduleA.js
define( [
"require"
,
"app/app"
],
function( require, app ) {
return
{
foo: function( title ) {
var app = require(
"app/app"
);
return
app.something();
}
}
}
);
|
1
|
var path = require.toUrl(
"./style.css"
);
|
1
2
3
4
5
|
Require.js 提供一個腳本 r.js ,能夠將全部使用到的模塊壓縮成一個腳本文件,r.js 可使用 node.js 來執行。
在壓縮模塊前,須要寫一個配置文件,說明主模塊名,壓縮後的文件名,哪些模塊不要壓縮
沒有使用 define 定義的模塊都不要壓縮,包括 jquery,backbone 等庫及其插件
1
2
3
4
5
6
7
8
9
10
11
|
//build.js
({
baseUrl:
'.'
,
paths: {
'jquery'
:
'empty:'
,
'underscore'
:
'empty:'
,
'backbone'
:
'empty:'
,
},
name:
'main'
,
out:
'main.min.js'
})
|
1
|
node r.js -o build.js
|