extjs 文件加载、解析流程
extjs版本:4.2.1
在html中添加应用的启动脚本,如下:
<script src="app.js"></script>
2. 用户访问html的时候,会去加载app.js文件,app中定义了应用的名字,根路径等信息,并且调用Ext.application()方法,如下:
Ext.application({name: 'Seed',extend: 'Seed.Application',autoCreateViewport: true });
3. Ext.application的详解见 http://wangyuelucky.blog.51cto.com/
主要做如下三件事:
设置loader的path
调用Ext.define()
当Ext.onReady的时候,实例化app,代码如下
Ext.onReady(function() {// this won't be called until App has been created and its requires have been// met...Ext.app.Application.instance = new App();});
4. Ext.define()的详解见 http://wangyuelucky.blog.51cto.com/1011508/1594628
主要是调用Manager.create(),实例化生成新的对象new Class(ctor, data, fn);
其中,var ctor = makeCtor();代码如下:
// Creates a constructor that has nothing extra in its scope chain.function makeCtor () { // 什么作用? 工厂模式?function constructor () {// Opera has some problems returning from a constructor when Dragonfly isn't running. The || null seems to// be sufficient to stop it misbehaving. Known to be required against 10.53, 11.51 and 11.61.return this.constructor.apply(this, arguments) || null;}return constructor;}
另外,这里的Class就是Ext.Class,代码如下:
(function(Class, alias, arraySlice, arrayFrom, global) {var Manager = Ext.ClassManager = {create: function(className, data, createdFn) {// 略return new Class(ctor, data, /** fn略 */);}};}(Ext.Class, Ext.Function.alias, Array.prototype.slice, Ext.Array.from, Ext.global));
5.
Ext.Class源码详解http://wangyuelucky.blog.51cto.com/1011508/1594638
Ext.Class相当于是构造函数,主要做两件事:
根据构造器ctor和类的配置信息data,调用ExtClass.create()方法,实例化对象并返回
调用ExtClass.process()方法,执行拦截器
6. ExtClass.create(ctor,data)方法非常简单,就是把基类Ext.Base中的静态属性和方法,都复制到ctor上,并返回ctor
7. ExtClass.process(Class, data, onCreated),会执行三类拦截器className,extend,loader,详解见http://wangyuelucky.blog.51cto.com/1011508/1603157,然后执行ExtClass.onBeforeCreated(ctor,data,hooks) // 这里的hook其实就是拦截器 + 4步中的回调函数fn
这里会处理两件事:
Class.addMembers(data);
hooks.onCreated.call(Class, Class); // 执行4中的回调函数fn
8. 这三类拦截器中,比较复杂的是loader拦截器,详解见http://wangyuelucky.blog.51cto.com/1011508/1603255
主要作用如下:
按关键字查找当前类的所有直接依赖
检查循环依赖
调用Loader.require(dependencies,fn);加载依赖文件
9. Loader.require()方法详解见http://wangyuelucky.blog.51cto.com/1011508/1594617
检查依赖文件是否在例外列表中
如果第8步中的回调方法fn,定义了参数,需要把相关对象的引用传递回去
以dependencies数组的形式,把所有的待加载的依赖信息,放入到队列queue中
调用Loader.loadScriptFile(filePath,onFileLoaded); 加载每一个依赖文件,并且标记待加载的文件数+1
Loader.numPendingFiles++;
10. loadScriptFile()方法,就是对同步/异步加载,做一个判断,如果是异步加载,则调用Loader.injectScriptElement()方法
11. Loader.injectScriptElement()方法,会向html中添加<script>标签,并设置回调文件加载、解析成功的函数为第9步中的onFileLoaded,这样每当加载成功一个文件,就执行onFileLoaded()方法
12. onFileLoaded(className, filePath)方法,其实就是标记文件在Loader中的信息
标记类className已经被加载
isClassFileLoaded[className] =
true
;
标记文件filePath已经被加载
isFileLoaded[filePath] =
true
;
待加载文件数-1 Loader.numPendingFiles--;
处理missingClasses
当待加载文件数等于0,也就是说loader没有待加载的文件的时候,调用Loader.refreshQueue();
13. Loader.refreshQueue(),详解见http://wangyuelucky.blog.51cto.com/1011508/1604695,该方法会检查queue中的每一个对象的每一个依赖项dependence,是否已经被加载、创建Manager.isCreated(requires[j]).
如果已经被创建则删除此依赖项,如果某个对象的所有依赖项都已经被创建,则从queue中移除该对象。
如果队列queue为空,则调用Loader.triggerReady()方法
注:我这里有几个疑问
Loader的待加载数已经为0了,为什么不直接调用Loader.triggerReady()
Loader的待加载数已经为0了,就不会再有文件被加载了,也就不会再执行onFileLoaded和refreshQueue方法了,怎么破?
14. Loader.triggerReady()方法,会调用Loader.require()去加载use关键字依赖项。然后执行第3步中的Ext.onReady
序列图:
创建应用 https://www.websequencediagrams.com/?open=72341
加载文件 https://www.websequencediagrams.com/?open=72348
加载完成回调 https://www.websequencediagrams.com/?open=72453
Ext.onReady https://www.websequencediagrams.com/?open=72343
转载于:https://blog.51cto.com/wangyuelucky/1604815
extjs 文件加载、解析流程相关推荐
- 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | RawDexFile.cpp 分析 | dvmRawDexFileOpen函数读取 DEX 文件 )
文章目录 前言 一.RawDexFile.cpp 中 dvmRawDexFileOpen() 方法分析 前言 上一篇博客 [Android 逆向]整体加固脱壳 ( DexClassLoader 加载 ...
- dvm,art模式下的dex文件加载流程
dvm,art模式下的dex文件加载流程 dex加载是学习android的重中之重,刚看完几篇参考博客,对应android源码,收益匪浅,用一篇博客总结一下自己学到的东西. 1.dvm模式下的dex加 ...
- 用 C 语言开发一门编程语言 — 字符串与文件加载
目录 文章目录 目录 前文列表 字符串 读取字符串 注释 文件加载函数 命令行参数 打印函数 报错函数 源代码 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器> <用 C ...
- linux中人脸识别不了,虹软人脸识别在 linux中so文件加载不到的问题
其实是可以加载到的,不过是so文件放的位置不一对,最简单的方式是放在 /usr/lib64 目录下,也可自己设置. so文件加载不到会报这个错误: .lang.UnsatisfiedLinkError ...
- 浏览器加载解析渲染机制的全面解析
(注1:如果有问题欢迎留言探讨,一起学习!本文首发于我的简书,转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录.) 1. 简介 在前面一篇文章中,讲到了用户从输入url到看到页面的 ...
- python反编译luac_Lua程序逆向之为Luac编写IDA Pro文件加载器
距离上一次讲Lua程序逆向已经有一段时间了,这一次我们书接上回,继续开启Lua程序逆向系列之旅. 在软件逆向工程实践中,为第三方文件编写文件格式分析器与指令反汇编器是一种常见的场景.这一篇的主要目的是 ...
- Hibernate懒加载解析
Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来 ...
- 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 查找 DexFile 对应的C代码 | dalvik_system_DexFile.cpp 分析 )
文章目录 前言 一.查找 DexFile 对应的 C++ 代码 1.根据 Native 文件命名惯例查找 C++ 代码 2.根据方法名查找 二.dalvik_system_DexFile.cpp 源码 ...
- 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexFile loadDexFile 函数 | 构造函数 | openDexFile 函数 )
文章目录 前言 一.DexFile.loadDexFile 函数分析 二.DexFile 构造函数分析 三.DexFile.openDexFile 函数分析 前言 上一篇博客 [Android 逆向] ...
最新文章
- [Leetcode] Wiggle Sort 摇摆排序
- c#面试3(选择题)
- [原创]数据库视图介绍和使用
- 【Linux operation 07】 - SUSE 12 SP5系统挂载硬盘
- 《分布式系统架构:技术栈详解与快速进阶》导读
- dwg格式的计算机图,例举电脑dwg文件怎么打开
- cad卸载工具_装不上也卸不掉,我的CAD仿佛已没救!...(CAD/MAX完美安装工具)...
- 2018国内VR游戏现状
- XP系统屏幕倒立翻转了怎么办???
- C++模版与特化与偏特化
- 文本标注工具BRAT的安装与配置
- 混合开发中,H5页面与原生app交互(方法互相调用与传参)
- C-DOCSIS业务流
- 十大不良习惯让你衰老速度加快
- php投影,使用 CSS 3 制作长投影
- 外星世界,真实呈现,外星版Pokemon Go是如何做到的?
- 苹果系统这么没有关闭订阅服务器,iPhone 上没有取消订阅的选项怎么办?
- Linux系统关闭防火墙~
- 傅里叶变换和拉普拉斯变换的物理解释及区别
- 分享4款非常实用的黑科技APP,使用过后才发现离不开它们了
热门文章
- 同步Android与PC的时间
- 图片安全保护(未启动)
- 自定义能够for each的类,C#,Java,C++,C++/cli的实现方法
- 走马观花:Visual Studio Code Name Orcas Mar07CTP /体验DLINQ
- oracle不同库之间传送文件,EXCEL与ORACLE间的数据互传法数据库 -电脑资料
- 全国计算机等级考试题库二级C操作题100套(第84套)
- 全国计算机等级考试题库二级C操作题100套(第61套)
- java date 判断是否是今天_java——推断日期是否在今天之前
- flash和linux文件系统,面向大容量Flash的高效Linux文件系统改进和实现
- 计算机系统基础:文件管理相关知识笔记