RequireJS是一個javascript 的 Module Loader,好處是可以將Javascript模組化
以下這段範例,必須考慮到套件與套件之間相依性的問題手動進行順序的調整
<script src="jquery.js"></script> <script src="jqueryUI.js"></script> <script src="jqueryPlugin.js"></script>
使用RequireJS後就可以避開這些狀況,更有效的管理外部引用的Javascript套件
使用方法
專案架構
Project index.php require.js js/ lib/
require RequireJS
引入
<script src="require.js"></script>
如果怕要存取許多套件會讓網頁卡住,可以調整成async讀入
<!-- defer for IE --> <script src="js/require.js" defer async="true" ></script>
include main.js
引入時可以同時定義讀取自己寫的main.js
<!-- 可省略.js副檔名 --> <script src="require.js" data-main="js/main"></script>
main.js
alert(123);
如果有跳出alert就代表運作成功了,只要在main.js使用require函式就可以引入套件
以引入jQuery、Underscore.js、Backbone.js為例使用require.js
main.js
//注意,這邊的jquery、underscore、backbone是檔案名稱
require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){
//測試jQuery是否引入
alert($);
});
注意:這邊有一點要注意,因為underscore和backbone並不是按照AMD(Asynchronous Module Definition)標準開發,因此單純直接使用require是無法取得物件的
詳細取得物件的做法下面會提到
利用require.config定義引入的套件路徑
main.js
require.config({
//定義path根目錄路徑
baseUrl : "js/lib",
//記得拿掉.js副檔名
paths : {
"jquery" : "https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min",
"underscore" : "Underscore/underscore.min",
"backbone" : "../backbone.min"
},
//在開發時會遇到cache狀況,可以加個時間參數排除cache(官網用法)
urlArgs: "bust=" + (new Date()).getTime()
});
require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){
alert($);
});
自訂AMD套件
在RequireJS中要引入自己寫的套件,必須要參照AMD標準來開發
say.js(custom module)
define(function() {
var hello = function () {alert("Hello");}
var no = function () {alert("No~~~~~~~");}
return {
Hello : hello,
No : no
}
});
main.js
require(['say'], function (say){
say.Hello();
say.No();
});
依附其他套件的AMD套件
如果開發的套件有依附在其他套件上(例如jQuery),可以先讓jQuery引入後再引入自行開發的套件
say.js
define(['jquery'],function($) {
var jq = function () {alert($);}
return {
jq : jq
}
});
main.js
require(['say'], function (say){
say.jq();
});
jQuery plugin
hello.js
define(['jquery'],function($) {
$.fn.hello = function(){
return this.each(function(key,value){
alert(key + " " + value);
});
};
});
main.js
require.config({
paths : {
'jquery' : 'https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min',
'hello' : 'hello'
},
});
require(['jquery','hello'], function ($){
$([1,2,3]).hello();
});
引入非AMD標準的套件
上面有提到,underscore和backbone並不是按照AMD標準開發,因此需要另外設定才能取得引入的物件
main.js
require.config({
paths : {
"jquery" : "https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min",
"underscore" : "underscore",
"backbone" : "backbone"
},
//定義套件的物件特徵
shim: {
'underscore':{
exports: '_'
},
'backbone': {
//Dependency
deps: ['underscore', 'jquery'],
exports: 'Backbone'
}
}
});
require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){
console.log(_);
});
Backbone.js實例
main.js
require.config({
paths : {
'jquery' : 'lib/jquery.min',
'underscore' : 'lib/underscore.min',
'backbone' : 'lib/backbone.min',
'view' : 'view'
},
//Define Shim
shim: {
'underscore' : {
exports: '_'
},
'backbone': {
deps: ['underscore', 'jquery'],
exports: 'Backbone'
}
}
});
require(['jquery', 'underscore', 'backbone', 'view'], function ($, _, Backbone, view){
new view();
});
view.js
define(['jquery','underscore','backbone'],function($, _, Backbone) {
return Backbone.View.extend({});
});