RequireJS

1 RequireJS初步試用

1.1 基本使用

Define定義模塊
定義模塊語法如下,3個參數(shù)分別為模塊名,模塊依賴,模塊實現(xiàn)function。在function中返回一個對象,如下面例子中返回trim方法

define('helper', ['jquery'], function($) {
    console.log('helper');
    return {
        trim: function(str) {
            return $.trim(str);
        }
    };
});

Require加載模塊
通過如下代碼加載模塊,參數(shù)為模塊名的數(shù)組,模塊的實現(xiàn)function

require(['helper'], function(helper) {  
    var str = helper.trim('  amd  ');
    console.log(str);
});

加載文件
RequireJS以一個相對于BaseUrl的地址來加載代碼
設(shè)置 baseUrl,在app.js中設(shè)置baseUrl,這樣就定義了模塊的base路徑

require.config({
    baseUrl: './js'
})
require(['helper'], function(helper) {
    
    var str = helper.trim('  amd  ');
    console.log(str);
});

加載機制
RequireJS使用head.appendChild()將每一個依賴加載為一個script標簽。并且加載即執(zhí)行。
通過控制臺可以看到加載helper時是用的javascript,加載后就執(zhí)行console.log('helper');

1.2 配置路徑

require.jsjquery.js放到lib目錄下
此時helper.js加載的依賴需要改成./lib/jquery,通過控制臺可以發(fā)現(xiàn),此時雖然jquery加載成功,但$對象為undefined

define('helper', ['./lib/jquery'], function($) {
    console.log($);
    return {
        trim: function(str) {
            return $.trim(str);
        }
    };
});

這是因為這樣加載jquery對象名為./lib/jquery,而在jquery定義中其定義了對象名為jquery

if ( typeof define === "function" && define.amd ) {
    define( "jquery", [], function() {
        return jQuery;
    });
}

配置模塊路徑如下,模塊名:模塊路徑,然后再helper.js加載時仍然用['jquery'],path中的jquery后面可以跟數(shù)組,按順序嘗試加載

require.config({
    baseUrl: './js',
    paths:{
        'jquery': 'lib/jquery'
    }
})

1.3 定義模塊

模塊定義可以通過函數(shù)模式,如上面helper模塊的定義。
也可以通過簡單對象的方式

define({
    username: 'leo',
    name: 'leo zhang',
    email: 'test@126.com',
    gender: '男'
});

首頁添加按鈕<button class="btn btn-default" id="user">獲取用戶信息并打印</button>
修改app.js,通過jquery獲取user按鈕,綁定click事件,通過api獲取user,并在then中將其打印

require(['jquery'], function($) {
    
    $('#user').click(function () {
        api.getUser().then(function (user) {
            console.log(user);
        })
    })
});

定義app.js,返回user,

define(['jquery'], function($) {
    return {
        getUser: function() {
            var def = $.Deferred();
            require(['./app/user'], function(user) {
                def.resolve(user);
            });
            return def;
        }
    }
});

修改app.js,添加api依賴

require(['jquery','./app/api1'], function($,api) {
    
    $('#user').click(function () {
        api.getUser().then(function (user) {
            console.log(user);
        })
    })
});

2 requirejs配置

2.1 配置不支持AMD

加載不支持AMD的庫,如Modernizr.js
加載不支持AMD的框架,如bootstrap
shim配置方法如下



在app.js中,首先在path中引入,然后再shim中進行配置

    paths:{
        'jquery': 'lib/jquery',
        'bootstrap': 'lib/bootstrap',
        'modernizr': 'lib/modernizr'
    },
    shim: {
        'modernizr': {
            exports: 'Modernizr'
        },
        'bootstrap': ['jquery']
    }

2.2 JSONP

跨域遠程地址:http://www.baidu.com/user?callback=onloaded
返回數(shù)據(jù):

onloaded({
    username: 'leo',
    name: 'leo zhang',
    email: 'test@126.com',
    gender: '男'
});

傳統(tǒng)JSONP實現(xiàn)
將app.js中獲取數(shù)據(jù)改為api.getUserByJsonp();,定義ajax的jsonp請求,并定義全局的onload方法(jquery中已經(jīng)定義了onloaded方法,通過success可以取到data)

        getUserByJsonp: function() {
            $.ajax({
                url: 'http://localhost:8066/src/main/resources/static/src/js/jsonp/user.js',
                dataType: 'jsonp',
                jsonpCallback: 'onloaded',
                success: function (data) {
                    console.log(data);
                }
            })
        }
...
function onloaded(user) {
    console.log(user);
}

requirejs實現(xiàn)
RequireJS需要返回數(shù)據(jù)為define

define({
    username: 'leo',
    name: 'leo zhang',
    email: 'test@126.com',
    gender: '男'
});

請求方式如下

        getUserByJsonp: function() {
            
            require(['http://localhost:8066/src/main/resources/static/src/js/jsonp/user-amd.js'], function(user) {
                console.log(user);
            })
        },
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • requirejs、require方法沖突 如果加載了多個requirejs腳本,每個requirejs會判斷是否...
    Howie223閱讀 1,769評論 1 2
  • 導語: 之前一直有聽說RequireJS,但是一直都沒機會去了解,只知道它是一個給js做模塊化的API。最近在做R...
    wuqke閱讀 41,167評論 11 78
  • 概念 JavaScript語言本身是沒有模塊化的概念的,但是我們可以借助requirejs這個模塊化工具,實現(xiàn)js...
    阿凡農(nóng)閱讀 1,535評論 0 0
  • 參考資料 RequireJS 中文網(wǎng)Javascript模塊化編程(三):require.js的用法——阮一峰 前...
    BeYanJin閱讀 7,403評論 2 12
  • ——讀《窮查理寶典》每周小結(jié)week6 本周閱讀了《窮查理寶典》的第四章第四講《關(guān)于現(xiàn)實思維的現(xiàn)實思考?》。在本章...
    dream2024閱讀 801評論 0 4

友情鏈接更多精彩內(nèi)容