从按需装载到并行异步,再至递归依赖和串行异步,javascript的潜力也在被开发者们尽情地挖掘。最初是谁先提出来这个的?老道?这个周末也尝试实现了下,这种思维模式的确很让人受到启发。
按需装载
数年前web2.0刚刚起步之时,按需装载首先被提出,这个思维比较简单:只有当用到某个js(确切说法应该是模块)时才会去装载它。举个例子而言,根据cookie确定用户有没有登录,有的话才去ajax请求用户信息并且显示在页面上的某个地方,没有的话不请求也不显示。这是很普遍的技术了,没什么好多说的。
并行异步
随后请求被细分,可能我要执行某个操作的时候,需要加载2个甚至多个js的情况,那么这个加载过程肯定是并行的。没理由先加载一个成功再加载另外一个再成功后才能执行操作——这是浪费时间。
并行异步中唯一要解决的就是同时并发2个请求时,客户端如何判断2个请求全部加载执行完成。很简单,为这个操作设一个计数器,值为依赖请求的个数(如2)。每个依赖请求加载成功后回调计数器自减,当计数器归零时说明全部加载完成。
这个算法很简单,但是需要考虑交叉的情况。即操作1请求了模块a和模块b,操作2请求了模块b和模块c的时候,共用一个模块b的请求要写好。
递归依赖
还有更复杂的情况。比如操作1依赖模块a和b,操作2依赖模块b和c,但是模块c依赖模块d,这该如何是好?
此时需要递归计算依赖,将每个操作所需要的依赖统统找出来,再并发异步即可。
串行异步
好了,真正的难点来了,如果还记得计算机操作系统中的线程的概念的话,这里将触及到类似线程睡眠的东西。
操作1依赖模块a和b,操作2依赖模块b和c,c又依赖d,d再依赖a。这可不是简单的一次性并发请求的问题了。试问:假如使用并发异步的话,模块d可能在模块a之前被加载进来并执行,那么这将会是个错误,用户会在他的浏览器上看到一个大大的叉。
但是我们又不想死板地先加载a,等a加载完成后再去并发。我们想实现串行异步,这该如何呢?
很简单,在d加载完成后先“审时度势”,查看下a有没有加载并执行好。当a已经好了的时候,我们尚可无所顾忌地执行d;而当尚未完成时将d休眠,并且在a的加载成功回调函数中加入一个新的回调:去唤醒d。
完成了这部,可算是实现了串行异步的一半了。还有另一半,即是串行异步的交叉,多个模块依赖多个模块并且彼此之间有交叉的情况出现,这和上面并发异步的交叉类似,需要递归计算并使用计数器。原理就说到这里,具体的实现就不贴了。
因为这些将是“达克斯”可能在d2上的演讲提到的东西,暂且保密。
防止死循环
http://limu.javaeye.com/blog/840159
提到的死循环很给力,虽然属设计上的失误,但合作开发难免会出现,应预防之。抽空补上。
附:已补上,下一篇就是。
Tags: javascript, 串行异步, 并行异步
http://bugs.adobe.com/jira/browse/FP-240
不多说,回复中有个解决办法,利用jQuery的live(为所有可能的object对象绑定侦听):
$(document).ready(function(){
gPageTitle = $("title").html();
$("object").live("mouseenter mouseleave mousedown mouseup",function(){
document.title = gPageTitle;
});
});
想触发对object的wmode属性还有要求。
Tags: flash, ie, title
com.adobe.crypto官方库的md5算法性能实在不敢恭维,算个10m的byteArray在我机子上跑了大概12s!我勒个去,这可怎么叫人活。随后找到个by.blooddy.crypto,提升了2个数量级的性能!
作者博客:http://va.lent.in/blog/2010/06/23/100x-times-faster-md5-and-more/
更新的博客:http://va.lent.in/blog/2010/07/10/more-on-faster-md5/
下载地址:http://www.blooddy.by/en/crypto/
我实际测试了下,10M的东西大概用了100ms左右,的确至少提升了100倍,作者此言非虚也!只是这个swc必须在flash cs5下编译才能成功,我用cs4调试半天老是报Main方法异常,郁闷很久才发现为什么。
Tags: as3, md5
用过一段时间JSA,也用过很久的YUIc,当然compiler也早早地接触了。
在使用js模板渲染时,为了可读性经常会如下写:
var tpl = [
'<div>',
'<div><%=someVars%></div>',
'</div>'
].join('');
TUI.renderTpl(tpl, {
someVars: '...'
});
内容多时,array.join()也会耗时。记得compiler可以合并字符串拼接,但不知道它居然还可以解析语义将这条声明也给优化了!
var tpl="<div><div><%=someVars%></div></div>";
不得不说,google的东西就是好!而且校验功能也比javascript lint准确多了,只是出现类似的注释时候,会显示警告,应该忽略掉它们的:
/**
* @public 定义/执行action,和action无先后顺序
* @param {function} key
* @param {boolean} 如果已经do过,再次do是否重复此action列表,默认false
*/
WARNING - Parse error. missing opening (
* @param {function} key
^
0 error(s), 1 warning(s)
Tags: compiler

推广下~
有人qq上问我土豆那位yy是男的还是女的,我后悔说真话了。
Tags: d2