Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Already on GitHub? Sign in to your account

seajs源码学习 #1103

Closed
sprying opened this Issue Feb 19, 2014 · 10 comments

Comments

Projects
None yet
5 participants

sprying commented Feb 19, 2014

前两天稍微看了源码,稍微有点思路。今天中午居然被支付宝电话面试问到了,当时一个捉急,语无伦次了,唉,悔之晚矣。
现在理下当时思路,也不知理解的对不对?

一个Js文件语句中,require"关键字"引入依赖的js,load事件回调中执行依赖下载;若发现没require,则从use定义的回调开始执行,貌似触发链式执行。

  • seajs.use 流程 先看看有无预加载的,然后组织回调,触发mod.load;
    load 解析有无依赖mod,有则循环fetch,fetch回调里若有嵌套依赖,则在子mod的load中再次循环fetch。无依赖,就触发下个onload方法...
  • 加载一个Js文件时,执行比load事件先。执行define函数时,正则判断有无require,有则解析;load时用解析结果重置mod。

疑问

以前看了玉伯大大在《程序员》上关于模块化开发,一直纠结怎么实现依赖加载,后来想到函数的字符串化解析。

如今研究源码,发现不仅如此,依赖的js文件下载时机,放到load事件触发后,即在事件处理函数中触发一系列流程,后接着下载。而不是在define函数中,立即触发下载,下面是define中最后两句

        meta.uri ? Module.save(meta.uri, meta) :
            // Save information for "saving" work in the script onload event
            anonymousMeta = meta

现在把解析的module保存到anonymousMeta,或cachedMods中。就如注释所说,等onload事件,再读出来。

整个流程

onload事件 -- 触发依赖的Js下载 --空白时间 -- Js下载好了,define执行--解析出依赖的Js--空白时间--onload事件--触发依赖的Js下载--

这样流程可行不

空白时间 -- Js下载好了,define执行--解析出依赖的Js--下载--空白时间--Js下载好了,define执行--

难道是因为

难道低版本的IE下载Js是串行的,必须要load事件后继续执行;Js是单线程的,如果define执行时下载,难道因为上个Js还在串行下载,会被直接被无视,还是怎样?@lifesinger

Owner

afc163 commented Feb 20, 2014

没看懂疑问。

sprying commented Feb 20, 2014

我已经在1楼改了描述,不知这样能看懂么?@afc163

Owner

afc163 commented Feb 20, 2014

仍然看不懂。

sprying commented Feb 20, 2014

+_+,Save information for "saving" work in the script onload event。就是说,为什么要保存好了,等onload

Owner

afc163 commented Feb 20, 2014

define 是发生在 script onload 之后的。

sprying commented Feb 20, 2014

在mac下Chrome调试,是先执行到define的~.~,后才跑到script onload回调的断点处

Owner

afc163 commented Feb 20, 2014

你对的,onload 要等都执行完了才触发。

sprying commented Feb 20, 2014

是啊,第一次发现是这样的。

但,我的疑问还没解决啊

@popomore popomore added the question label Feb 21, 2014

yessky commented Feb 25, 2014

define执行的时候并不知道对应的是那个模块,所以先把模块信息存储在anonymousMeta, 等onload事件触发的时候关联模块名与模块信息, 这里是通过onload事件e.target.getAttribute('src')获得模块名然后与anonymousMeta进行关联.

yessky commented Feb 25, 2014

define执行的时候并不知道对应的是那个模块,所以先把模块信息存储在anonymousMeta, 等onload事件触发的时候关联模块名与模块信息, 这里是通过onload事件e.target.getAttribute('src')获得模块名然后与anonymousMeta进行关联.

@army8735 army8735 closed this Apr 8, 2014

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment