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