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({});
});
 
													