Skip to content
New issue

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

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

seajs源码学习 #1103

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

seajs源码学习 #1103

sprying opened this issue Feb 19, 2014 · 10 comments
Labels

Comments

@sprying
Copy link

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

@afc163
Copy link
Member

afc163 commented Feb 20, 2014

没看懂疑问。

@sprying
Copy link
Author

sprying commented Feb 20, 2014

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

@afc163
Copy link
Member

afc163 commented Feb 20, 2014

仍然看不懂。

@sprying
Copy link
Author

sprying commented Feb 20, 2014

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

@afc163
Copy link
Member

afc163 commented Feb 20, 2014

define 是发生在 script onload 之后的。

@sprying
Copy link
Author

sprying commented Feb 20, 2014

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

@afc163
Copy link
Member

afc163 commented Feb 20, 2014

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

@sprying
Copy link
Author

sprying commented Feb 20, 2014

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

但,我的疑问还没解决啊

@yessky
Copy link

yessky commented Feb 25, 2014

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

1 similar comment
@yessky
Copy link

yessky commented Feb 25, 2014

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

@army8735 army8735 closed this as completed Apr 8, 2014
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants