seajs的require和require.async的区别?

Opera_mini 2013-08-14 04:38:02
官方文档说,require用来获取指定模块的接口,require.async用来加载模块。这两种描述有什么区别?
...全文
328 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
l676331991 2013-08-15
  • 打赏
  • 举报
回复
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加载发生在模块执行期。

87,991

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧