轻量级前端MVVM框架avalon - 整体架构

article/2025/10/10 13:40:21

官网提供架构图

 

单看这个图呢,还木有说明,感觉有点蛋疼,作者的抽象度太高了,还好在前面已经大概分析过了执行流程

如图

  • 左边是View视图,我们就理解html结构,换句话就是说用户能看到的界面,渲染页面,绑定事件,切换类名,什么脏活都揽
  • 右边是ViewModel 视图模式,就是开发者通过avalon.define("xxx", function(vm){vm.firstName = "模型"})
  • 既然是MVVM 那么还有个M跑哪里去了,M在MVVM定义中,M只是一个过客,被VM给再次包装,它与其他表示业务状态的东西融入VM(ViewModel)中,一个普通的JS对象,可能是后台传过来的,也可能是直接从VM中拿到 vm.firstName = "模型" 这个就是M咯,所以作者在图中就没体现出来吧

从定义ViewModel开始,扫描到vm关联的东东 形成访问器,好吧其实整个就这么简单

打开avalon源码,我们就看到这样的结构

(function(DOC) {内部代码})(document);

这种基本的结构虽然已经被写烂了 ,但是既然是分析就从来到位来一遍吧.

自调用匿名函数

jquery为例

  1. 这是一个自调用匿名函数。什么东东呢?在第一个括号内,创建一个匿名函数;第二个括号,立即执行
  2. 为什么要创建这样一个“自调用匿名函数”呢?

通过定义一个匿名函数,创建了一个“私有”的命名空间,该命名空间的变量和方法,不会破坏全局的命名空间。这点非常有用也是一个JS框架必须支持的功能,jQuery被应用在成千上万的JavaScript程序中,必须确保jQuery创建的变量不能和导入他的程序所使用的变量发生冲突。 

     3.  匿名函数从语法上叫函数直接量,JavaScript语法需要包围匿名函数的括号,事实上自调用匿名函数有两种写法

写法1
(function() {console.info( this );console.info( arguments );
}( window ) );写法2
(function() {console.info( this );console.info( arguments );
})( window );

 

       4.为什么要传入window呢?

       通过传入window变量,使得window由全局变量变为局部变量,当在jQuery代码块中访问window时,不需要将作用域链回退到顶层作用域,这样可以更快的访问window;这还不是关键所在,更重要的是,将window作为参数传入,可以在压缩代码时进行优化,看看jquery-1.6.1.min.js:

(function(a,b){})(window); // window 被优化为 a

     5.为什么要在在参数列表中增加undefined呢?

     在 自调用匿名函数 的作用域内,确保undefined是真的未定义。因为undefined能够被重写,赋予新的值。

undefined = "now it's defined";
alert( undefined );

浏览器测试结果:

       6.注意到源码最后的分号了吗?

        分号是可选的,但省略分号并不是一个好的编程习惯;为了更好的兼容性和健壮性,请在每行代码后加上分号并养成习惯。

 

总体架构

按代码结构

    (function(DOC) {//命名空间avalon = function(el) {return new avalon.init(el);};//avalon挂在工具函数// 迷你jQuery对象的原型方法//css操作相关的方法//ecma262兼容补丁//nextTick 高级定时器//Observable 观察者模式//Define 模型定义方法//Parse 解析求值函数与执行作用域//Scan 节点扫描//Bind html自定义标签绑定处理方法
})(document);

整个结构基本如上

以后会分析具体的每个实现,源码分析尽量到行...

转载于:https://www.cnblogs.com/snake-hand/p/3144973.html


http://chatgpt.dhexx.cn/article/tOcB07mX.shtml

相关文章

下载kaggle数据集出现的一系列问题

下载kaggle数据集出现了如下情况 按照下面的帖子安装kaggle库 https://www.cnblogs.com/shuaishuaidefeizhu/p/15170305.html 1.windowsR 打开命令提示符cmd,输入pip install kaggle --user 2.在C:\Users\(用户名)文件下会生成一个.kaggle文…

CT图像重建算法------射线驱动投影模型

在模拟CT扫描过程中被测物体保持静止不动,射线源与探测器绕Z轴做逆时针旋转,每隔一定角度进行一次投影数据的计算,而计算方法则取决于采用什么样的投影算法。本文主要介绍了投影算法的分类,并详细描述了射线驱动算法中的joseph算法…

尤雨溪告诉你为什么Vue比yox优秀

2019年6月8日来自全球各地的开发者齐聚上海交通大学文治堂,VueConf 2019 在上海成功举办。 VUE 3.0 最新进展 更快 使用 Object.defineProperty -> Proxy 速度 提升了1倍 VUE3.0 将 Virtual DOM 重构 速度 提升 6 倍 牛逼吧 !!&…

kubernetes的初认识

1.先谈容器。 一个“容器”,实践上是一个由Linux Namespace、Linux Cgroups 和 rootfs 三种技术构建出来的进程的隔离环境。 一个正在运行的linux容器,其实可以被“一分为二”地看待: 一组联合挂载在/var/lib/docker/overlay2下的rootfs&a…

KubeSphere简介,功能介绍,优势,架构说明及应用场景

目录 一、KuberSphere简介 1.1 功能介绍 1.2 Kubernetes 资源管理 1.3 微服务治理 1.4 多租户管理 1.5 DevOps 工程 1.6 Source to Image 1.7 多维度监控 1.8 自研多租户告警系统 1.9 日志查询与收集 1.10 应用管理与编排 1.11 基础设施管理 1.12 多存储类型支持…

云原生钻石课程 | 第4课:Kubernetes存储架构原理深度剖析(上)

点击上方“程序猿技术大咖”,关注并选择“设为星标” 回复“加群”获取入群讨论资格! 本篇文章来自《华为云云原生王者之路训练营》钻石系列课程第4课,由云原生存储解决方案Everest2.0的架构设计专家Jabin主讲,详细介绍云原生存储…

1.k8s基本使用(测试加分)

测试为什么要学习容器技术及k8s k8s不是运维的专属技术 随着互联网技术的发展,架构也已经从单体架构发展到容器云( “微服务 k8s” 完美结合) 很多人认为,k8s只是运维需要掌握的技术,讲真,测试和运维、开发都有技术交集 所以&…

Kubernetes 持久化存储(Pod Volumes,PV和PVC)

一、Volumes 介绍 Pod Volumes 首先来看一下 Pod Volumes 的使用场景: 场景一:如果 pod 中的某一个容器在运行时异常退出,被 kubelet 重新拉起之后,如何保证之前容器产生的重要数据没有丢失?场景二:如果…

面试题引出的知识点整理

1、自旋锁&可重复锁&公平锁&共享锁&分段锁你都知道吗? 2、无锁&偏向锁&轻量级锁&重量级锁如何膨胀升级? 3、Lock底层AQS实现与Synchronized底层实现异同? 4、LongAdder的分段CAS优化机制如何设计的? 5、Java多线程内存模型…

云集成,给超大规模K8s运维带来的丝滑体验

根据IDC统计,未来五年容器基础架构软件市场将以超过40%的复合增长率爆发式增长,行业也从互联网向更多的传统行业渗透,比如金融、政府、电信,制造和能源等行业。 近年来,随着云技术的日益普及,越来越多的企…

Spring

目录 1.spring介绍 spring中的两个核心概念 1.1 IoC 1.2 AoP 1.3 Spring的优点 1.4 Spring工程构建 1.4.1 Maven Spring 依赖 1.4.2 Spring核心配置文件编写 1.4.2.1 完成控制反转以及依赖注入 1.4.2.2 测试 1.4.2.3 Spring中的IOC 产生的对象是否是单例模式 1.5 B…

动静分离 与 热点缓存

动静分离 让系统“快”起来:1、提高单次请求的效率2、减少没必要的请求 “动静分离”就是瞄着这个大方向去的。所谓“动静分离”,其实就是把用户请求的数据(如HTML页面)划分为“动态数据”和“静态数据”。简单来说,“…

天猫浏览型应用的CDN静态化架构演变

转载自:http://zhu-zhiguo.iteye.com/blog/2145496 在天猫双11活动中,商品详情、店铺等浏览型系统,通常会承受超出日常数倍甚至数十倍的流量冲击。随着历年来双11流量的大幅增加, 每年这些浏览型系统都要面临容量评估、硬件扩容、…

java 确保线程安全_确保不安全感

java 确保线程安全 33岁的克雷格斯宾塞(Craig Spencer)在治疗埃博拉病毒患者后于10月17日从非洲返回美国。 几天后,他的埃博拉病毒呈阳性React。 每个人(尤其是周围的人)和纽约人都感到关切。 纽约市市长走到媒体前&am…

经验:一个秒杀系统的设计思考

前言 秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。 从架构视角来看,秒杀系统本质是一个高性能、高一…

Java调用C++/C

Java调用C/C有3中方式:JNI、JNA、JNative。 注:1、个人觉得还是JNA的方式最好。 2、Java和C/C交互的难点在于数据结构的对应 3、java不可以直接调用C#代码,C#代码需要托管 JNI (Android调用,普通java类似)…

kubernetes 静态存储与动态存储

静态存储 Kubernetes 同样将操作系统和 Docker 的 Volume 概念延续了下来,并且对其进一步细化。Kubernetes 将 Volume 分为持久化的 PersistentVolume 和非持久化的普通 Volume 两类。为了不与前面定义的 Volume 这个概念产生混淆,后面特指 Kubernetes …

Java多线程整理

目录 1. 进程与线程 1.1 进程 1.2 线程 1.3 并发与并行 2. 多线程 2.1 多线程的概念 2.2 多线程的好处 2.3 主线程 3. 线程的创建与启动 3.1 继承Thread类 3.2 实现Runnable接口 3.3 实现Callable接口 3.4 run方法调用和start调用的区别 4.线程的状态 4.1 线程状…

th和td标签的区别

th和td标签的区别 开发工具与关键技术: Dw HTML 作者:邹贺汗 撰写时间:2019年2月4日 在写这篇文章的时候我就知道虽然我发的不是第一个,但是说不定我写刚好给有需要的人看到了呢,所以我就写了这篇文章,下面…

html中th标签添加方法,HTML th 标签

HTML 标签 标签表示HTML表格的表头部分,该标签中的内容会以粗体显示,请参考下述示例: 实例 一个简单的 HTML 表格,带有两个表头单元格和两个数据单元格: MonthSavingsJanuary$100 尝试一下 (更多实例见页面底部) 浏览…