怎么在JavaScript中使用requireJS實現(xiàn)按需加載?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、成都微信小程序、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了萬秀免費建站歡迎大家使用!
模塊加載器的概念可能稍微接觸過前端開發(fā)的童鞋都不會陌生,通過模塊加載器可以有效的解決這些問題:
JS文件的依賴關系。
通過異步加載優(yōu)化script標簽引起的阻塞問題
可以簡單的以文件為單位將功能模塊化并實現(xiàn)復用
主流的JS模塊加載器有requireJS,SeaJS等,加載器之間可能會因為遵循的規(guī)范不同有微妙的差別,從純用戶的角度出發(fā),之所以選requireJS而不是SeaJS主要是因為:
功能實現(xiàn)上兩者相差無幾,沒有明顯的性能差異或重大問題。
文檔豐富程度上,requireJS遠遠好于SeaJS,就拿最簡單的加載jQuery和jQuery插件這回事,雖然兩者的實現(xiàn)方法相差無幾,但requireJS就有可以直接拿來用的Demo,SeaJS還要讀文檔自己慢慢折騰。一些問題的解決上,requireJS為關鍵詞也更容易找到答案。
requireJS 加載jQuery + jQuery插件
可能對于一般Web App來說,引入jQuery及相關插件的概率是最大的,requireJS也親切的給出了相應的解決方案及動態(tài)加載jQuery及插件的文檔及實例代碼。
在最新的jQuery1.9.X中,jQuery已經(jīng)在最后直接將自己注冊為一個AMD模塊,即是說可以直接被requireJS作為模塊加載。如果是加載舊版的jQuery有兩種方法:
1. 讓jQuery先于requireJS加載
2. 對jQuery代碼稍做一點處理,在jQuery代碼包裹一句:
define(["jquery"], function($) {
// $ is guaranteed to be jQuery now */
});requireJS的示例中,直接將requireJS與jQuery合并為一個文件,如果是采用jQuery作為核心庫的話推薦這種做法。
同樣對于jQuery插件來說也有兩種方法
1. 在插件外包裹代碼
define(["jquery"], function($){
// Put here the plugin code.
});2. 在使用reuqireJS代碼加載前注冊插件(比如在main.js)中
requirejs.config({
"shim": {
"jquery-cookie" : ["jquery"]
}
});requireJS加載第三方類庫
在實例的App中還用到了jQuery以外的第三方類庫,如果類庫不是一個標準的AMD模塊而又不想更改這些類庫的代碼,同樣需要提前進行定義:
require.config({
paths: {
'underscore': 'vendor/underscore'
},
shim: {
underscore: {
exports: '_'
}
}
});CSS文件的模塊化處理
在requireJS中,模塊的概念僅限于JS文件,如果需要加載圖片、JSON等非JS文件,requireJS實現(xiàn)了一系列加載插件。
但是遺憾的是requireJS官方?jīng)]有對CSS進行模塊化處理,而我們在實際項目中卻往往能遇到一些場景,比如一個輪播的圖片展示欄,比如高級編輯器等等。幾乎所有的富UI組件都會由JS與CSS兩部分構成,而CSS之間也存在著模塊的概念以及依賴關系。
為了更好的與requireJS整合,這里采用require-css來解決CSS的模塊化與依賴問題。
require-css是一個requireJS插件,下載后將css.js與normalize.js放于main.js同級即可默認被加載,比如在我們的項目中需要加載jQuery Mobile的css文件,那么可以直接這樣調用:
require(['jquery', 'css!../css/jquery.mobile-1.3.0.min.css'], function($) {
});不過由于這個CSS本質上是屬于jQuery Mobile模塊的一部分,更好的做法是將這個CSS文件的定義放在jQuery Mobile的依賴關系中,最終我們的requireJS定義部分為:
require.config({
paths: {
'jquerymobile': 'vendor/jquery.mobile-1.3.0',
'jstorage' : 'vendor/jstorage',
'underscore': 'vendor/underscore'
},
shim: {
jquerymobile : {
deps: [
'css!../css/jquery.mobile-1.3.0.min.css'
]
},
underscore: {
exports: '_'
}
}
});在使用模塊時,只需要:
require(['jquery', 'underscore', 'jquerymobile', 'jstorage'], function($, _) {
});jQuery Mobile的CSS文件就會被自動加載,這樣CSS與JS就被整合為一個模塊了。同理其他有復雜依賴關系的模塊也可以做類似處理,requireJS會解決依賴關系的邏輯。
數(shù)據(jù)源的加載與等待
Web App一般都會動態(tài)加載后端的數(shù)據(jù),數(shù)據(jù)格式一般可以是JSON、JSONP也可以直接是一個JS變量。這里以JS變量為例:
var restaurants = [
{
"name": "KFC"
},
{
"name": "7-11"
},
{
"name": "成都小吃"
}
]載入這段數(shù)據(jù):
$.getScript('data/restaurants.json', function(e){
var data = window.restaurants;
alert(data[0].name); //KFC
});單一的數(shù)據(jù)源確實很簡單,但是往往一個應用中會有多個數(shù)據(jù)源,比如在這個實例App中UI就需要載入用戶信息、餐廳信息、訂餐信息三種數(shù)據(jù)后才能工作。如果僅僅靠多層嵌套回調函數(shù)的話,可能代碼的耦合就非常重了。
為了解決多個數(shù)據(jù)加載的問題,我習慣的解決方法是構造一個dataReady事件響應機制。
var foodOrder = {
//數(shù)據(jù)載入后要執(zhí)行的函數(shù)暫存在這里
dataReadyFunc : []
//數(shù)據(jù)源URL及載入狀態(tài)
, dataSource : [
{ url : 'data/restaurants.json', ready : false, data : null },
{ url : 'data/users.json', ready : false, data : null },
{ url : 'data/foods.json', ready : false, data : null }
]
//檢查數(shù)據(jù)源是否全部載入完畢
, isReady : function(){
var isReady = true;
for(var key in this.dataSource){
if(this.dataSource[key].ready !== true){
isReady = false;
}
}
return isReady;
}
//數(shù)據(jù)源全部加載完畢,則逐一運行dataReadyFunc中存放的函數(shù)
, callReady : function(){
if(true === this.isReady()){
for(var key in this.dataReadyFunc){
this.dataReadyFunc[key]();
}
}
}
//供外部調用,會將外部輸入的函數(shù)暫存在dataReadyFunc中
, dataReady : function(func){
if (typeof func !== 'function') {
return false;
}
this.dataReadyFunc.push(func);
}
, init : function(){
var self = this;
var _initElement = function(key, url){
$.getScript(url, function(e){
//每次載入數(shù)據(jù)后,將數(shù)據(jù)存放于dataSource中,將ready狀態(tài)置為true,并調用callReady
self.dataSource[key].data = window[key];
self.dataSource[key].ready = true;
self.callReady();
});
}
for(var key in this.dataSource){
_initElement(key, this.dataSource[key].url);
}
}
}用法為:
foodOrder.dataReady(function(){
alert(1);
});
foodOrder.init();關于怎么在JavaScript中使用requireJS實現(xiàn)按需加載問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關知識。
網(wǎng)站題目:怎么在JavaScript中使用requireJS實現(xiàn)按需加載
文章來源:http://www.chinadenli.net/article42/igjghc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、自適應網(wǎng)站、網(wǎng)站制作、微信公眾號、虛擬主機、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)