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,否则,只能在本地自己记录一个已经请求过的模块的列表,然后每次请求的时候从列表里面过滤

 posted on 2012-03-15 18:03 落叶满长沙 阅读(...) 评论(...) 编辑 收藏