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,否則,只能在本地自己記錄一個已經請求過的模塊的列表,然后每次請求的時候從列表里面過濾