requirejs實現對動態combo的支持


combo是為了減少請求數, 但是全combo成一個不好, 最佳實踐還是合理拆分成幾個文件, 真實環境里能減小加載總時間, 並在一定程度上提高
瀏覽器端緩存的利用率;

現在seajs的例子里都是用的config的preload來支持服務器端combo, 但是有個問題:

 seajs要等preload數組里所有項目都加載完, 才會開始處理具體的seajs.use調用, 比如:

seajs.config({
  preload: ['m1', 'm2+m3']

});

seajs.use(['m1'], function(m1) { /*位置1*/ });
seajs.use(['m2', 'm3'], function(m2, m3) {...});

必須等'm1.js', 'm2+m3.js'兩個文件都加載完了, 才會開始執行/*位置1*/處的代碼.

萬一'm2+m3.js'要等比較久, 等於變相推遲了js的執行, 不懂有沒有好的解決方案.

在這個問題上require的path式id, 剛好能更平順的支持動態combo.對combo支持更好

combo.js

define('a',function(){
   return {
      name:'nick',
   }
});
define('b',function(){
   return {
	  sex:'man'
   }
});

 main.js

define(function(a){

	require.config({
			baseUrl: '',
			paths: {
					'a' : 'engine/combo',
					'b' : 'engine/combo'
			}
	});

    require(['a','b'],function(a,b){
	   alert(a.name+"|"+b.sex)
	})

});

 ok

這樣 requirejs不會在發a.js和b.js兩個了,而是發送combo.js動態請求給server,當然,需要server支持combo的功能來把a.js和b.js壓縮成為上面的combo.js

但是這樣還有這么一個問題,比如
有a.js b.js c.js三個模塊
有兩個請求src='a.js+b.js' 和 src='a.js+c.js'
那么這兩個請求里面都會包含有a.js 模塊,因為server的combo是不知道你已經請求過了a.js模塊了,那么,這也是個缺陷。至少浪費帶寬哇,也可能會覆蓋前面模塊的已經更新的屬性
不知道requirejs是否有檢查模塊是否已經存在的api,否則,只能在本地自己記錄一個已經請求過的模塊的列表,然后每次請求的時候從列表里面過濾


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM