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