日期:2014-05-16  浏览次数:20391 次

seajs的require和require.async的区别?
官方文档说,require用来获取指定模块的接口,require.async用来加载模块。这两种描述有什么区别?
SeaJS javascript

------解决方案--------------------
seajs github的issue list里有说,要大家把require()这个看做是js的语法,看成类似java里的import,php里的include。require无法完成条件加载。如下代码:

define(function(require){
    if(false) {
        require("module-A");
    } else {
        require("module-B");
    }
});
其实在加载该模块后,A、B两个模块会被加载,也就是说if(false)被无视了。因此这里就引进了require.async来满足条件加载的需求。

没仔细读过玉伯大神的源码,但是猜测在define一个模块的时候,seajs肯定是调用了该匿名funtion的toString方法,也就是得到我们定义的模块的静态源码,然后分析其中的require语句(就是字符串分析喽),得到其所依赖的模块,然后把这些模块统统加载了,再执行当前模块,得到模块的module对象和exports并加以缓存。这就解释了为什么require的参数必须写成原始字符串了。这种预处理的方式,使得require看上去像同步加载,实则事先把所有依赖的模块都已经准备好了。require.async自然没有这个语法限制,但是由于模块加载是异步过程,因此后续的逻辑代码只能写在回调函数内部。

其实区别就是一点,require模块的加载过程是发生在模块源码分析期; require.async加载发生在模块执行期。