最近一直为此头痛,姑且把我能想到的东西都写出来吧。由于不是简单把页面上手写的script转为javascript添加,我们需要考虑的东西主要有两个:加载的顺序,加载前后脚本的运作。
先说第一个,假如我们已有一加载机制了,要加载一个新模块,当然新模块是在另一个JS文件中。这时,我们可以描述为:
loader ---> a.js
这个加载过程可能会出些意外,如服务器忙碌等问题,暂时无法为我们生成JS文件,我们就需要再次请求,但也可能永远请求不上,因为那是死链,后台的人傻了脑袋,改了地址也不通知声,我们需要一个截止期限。这时,我们可以描述为:
loader ---> a.js ---> a.js ---> .....----> timeout
如果那个模块要依赖于其他模块呢,那么我就必须在加载它之前加载其他模块了。这时,我们可以描述为:
loader ---> b.js ---> a.js ---> .....----> timeout
但记录这些依赖关系的信息肯定在a.js上,而不在loader上,通过a.js我们才能得知b.js,换言之要遵循最少知识原则(Law of Demeter)。
这个问题的解决,MochiKit兴许能给我们一些灵感吧。
另一个问题是javascript是单线程的,而加载需要一个时间,并且通常是异步的。当我们执行加载函数后,可能JS引擎会继续执行下面需要新模块支援的代码片断,由于这时新模块还没有加载完毕,当要用到新模块的属性方法就会报错。解决方法有二,强制上面的loader活动的时间与加载时间一样长,换言之,创造一个阻塞的环境。这容易实现,可参照dojo。不过如果加载的模块过多,难免会造成body标签内一片空白。另一个方法是使用回调函数,那么就要求我们把接着下来的代码八卸大块,每个代码片断都是相对独立,所有逻辑都是写在一个函数体中。看上去非常不优雅,但也别无他法,这是YUI的做法。
嘛,基本上就是这样,是一个世界难题……不要问我要代码,认为没有必要搞这么复杂的同志们现在都被迫干这事呢,世事难料啊!