也谈模块加载,吐槽CMD

先吐槽CMD,不要没头没脑的搞出个CMD,没意思。

大家都看AMD好了,异步模块加载机制,CMD并没有改变这个模式。

模块加载的关口就是getCurrentScript,每次define被调用的时候,识别出是哪个脚本在调用它,把javascript内容解析出来,

识别出依赖的模块,(就是里面有require的资源部分),在执行前先准备好这些资源。

当然这里面有若干相对路径的转换。

 

AMD很好,人人都喜欢异步工作方式,所以QQ、email比电话更受欢迎,有什么事情我准备好了再回复你。

但是人也是有控制欲的,人喜欢别人以同步方式工作,恨不得别人停下手里所有事立刻为自己服务。

 

所以我对AMD不满足,使用过Node.js后,非常喜欢require的同步加载方式,请注意是同步模块加载,SMD就不叫了,就是require。

require(src)   三个参数,

   src 是资源相对路径,

内部步骤

    1.var str=ajax(src); 获取脚本内容

    2.var fn=new Function("module","require");

    3.var module={},newReq=hitch(require,base);/*构造一个新的require,绑定上下文参数  base指新的目录*/

    4.fn(module,newReq);

    5.return module.exports;

 

模块脚本编写样例:

    module.exports={a:10,b:10,sum:function(x,y){return x+y;}};/*返回一个对象*/

 或者

    module.exports=function(a,b){return a+b}/*返回一个函数,函数是一等公民*/

 

所有人都能看得到的就是阻塞问题,浏览器的UI进程被阻塞,如果模块加载花费太多时间,会出现浏览器不响应,甚至假死

这时候是多么希望有中断和唤醒机制啊, thread.sleep()

 

再换个思路,如果合理控制模块的大小,缓存,确保浏览器本地有所需的所有模块,那这个阻塞问题就不会成为大问题,

从缓存中读文件时毫秒级别。

这就需要用到离线应用程序功能了。

下一篇文章  离线应用程序尝试

     

 

posted @ 2013-09-24 09:01  web 的世界  阅读(271)  评论(0编辑  收藏  举报