代码数量

1.2.0版本代码量为1650行,去掉注释大概1500左右

代码模块

默认版本只包括核心模块,事件模块,ajax模块,form模块和ie模块,其它模块需要自行拓展加入,其中form模块只包含序列化操作和submit提交事件实现,ie模块只包括一点兼容性处理,两者码量极少,因此不做分析

执行结构

典型的即时函数,保证封装性

    (function (global, factory) {
// amd,cmd的模块化检测
})(this, function(window) {
// zepto初始化代码
})

模块结构

    (function (global, factory) {
// amd,cmd的模块化检测
})(this, function(window) {
// 核心模块
var Zepto = (function () { }(); // 事件模块
;(function (){ })(Zepto) // ajax模块
;(function (){ })(Zepto) // form模块
;(function (){ })(Zepto) // ie模块
;(function (){ })()
})

架构原理

    (function (global, factory) {
// amd,cmd的模块化检测
})(this, function(window) {
// 核心模块
var Zepto = (function () {
var $, zepto = {}; // 第四步
function Z(dom, selector) {
// zepto对象创建,返回this
} // 第三步
zepto.Z = function(dom, selector) {
return new Z(dom, selector)
} // 是否为zepto.Z实例
zepto.isZ = function(object) {
return object instanceof zepto.Z
} // 第二步
zepto.init = function(selector, context) {
// 选择器解析,获得dom元素集合
return zepto.Z(dom, selector);
}
// 第一步
$ = function (selector, context) {
return zepto.init(selector, context)
} // 定义代表原型对象的fn属性
$.fn = {
constructor: zepto.Z,
length: 0
} // 串通原型链
zepto.Z.prototype = Z.prototype = $.fn; // 赋值zepto引用给$
$.zepto = zepto; return $
}(); // window上注册Zepto
window.Zepto = Zepto
window.$ === undefined && (window.$ = Zepto) // 其它模块省略...
})

1.库的架构方面,先是定义了2个变量,未声明的$和zepto对象;将$赋值为函数,定义fn属性来作为库本身的原型对象,对zepto对象定义一些操作方法

2.通过$方法实现选择器初始化操作,通过zepto.init实现dom集合生成,通过zepto.Z和Z函数生成一个Zepto对象,也就是如上注释的1,2,3,4步

3.其中Z.prototype = $.fn是为new Z实例定义原型,zepto.Z.prototype = Z.prototype则只是用于zepto.isZ函数操作,以便判断是否传入的内容为zepto.Z实例

4.个人感觉zepto.isZ函数实现略微麻烦,改成如下形式会更简洁

// 核心模块
var Zepto = (function () {
var $, zepto = {}; zepto.isZ = function(object) {
// zepto.Z改成Z
return object instanceof Z
} // zepto.Z改成Z
$.fn = {
constructor: Z,
length: 0
} // zepto.Z.prototype = Z.prototype去掉
Z.prototype = $.fn; return $
}();

对比jquery架构

    var jQuery = function( selector, context ) {
// 避免this instanceof jQuery判断
// 避免new jQuery的死循环
// 初始化方法采用原型上的init方法
return new jQuery.fn.init( selector, context );
} // 定义fn属性指向jQuery原型
jQuery.fn = jQuery.prototype = {
constructor: jQuery
} // 通过将init方法的原型指向jquery原型解决this问题
jQuery.fn.init.prototype = jQuery.fn; // 通过this的力量共享extend拓展方法,实现根据调用对象进行对应拓展
jQuery.extend = jQuery.fn.extend = function() { }

jQuery的原型链构建和extend实现真是精妙绝伦,jQuer的架构实现比Zepto更简洁,作用上更清晰,Zepto的实现相对繁琐

zepto源码分析·整体架构的更多相关文章

  1. 精尽 MyBatis 源码分析 - 整体架构

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  2. Fresco 源码分析 —— 整体架构

    Fresco 是我们项目中图片加载专用框架.虽然我不是负责 Fresco 框架,但是由本人负责组里的图片加载浏览等工作,因此了解 Fresco 的源码有助于我今后的工作,也可以学习 Fresco 的源 ...

  3. jquery-2.0.3 源码分析 整体架构

    关键 var jQuery = function( selector, context ) { return new jQuery.fn.init(); } jQuery.fn = jQuery.pr ...

  4. [转]Libev源码分析 -- 整体设计

    Libev源码分析 -- 整体设计 libev是Marc Lehmann用C写的高性能事件循环库.通过libev,可以灵活地把各种事件组织管理起来,如:时钟.io.信号等.libev在业界内也是广受好 ...

  5. zepto源码分析系列

    如果你也开发移动端web,如果你也用zepto,应该值得你看看.有问题请留言. Zepto源码分析-架构 Zepto源码分析-zepto(DOM)模块 Zepto源码分析-callbacks模块 Ze ...

  6. 一个普通的 Zepto 源码分析(二) - ajax 模块

    一个普通的 Zepto 源码分析(二) - ajax 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核心模块,以 ...

  7. 一个普通的 Zepto 源码分析(三) - event 模块

    一个普通的 Zepto 源码分析(三) - event 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核心模块, ...

  8. 一个普通的 Zepto 源码分析(一) - ie 与 form 模块

    一个普通的 Zepto 源码分析(一) - ie 与 form 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核 ...

  9. Zepto源码分析(一)核心代码分析

    本文只分析核心的部分代码,并且在这部分代码有删减,但是不影响代码的正常运行. 目录 * 用闭包封装Zepto * 开始处理细节 * 正式处理数据(获取选择器选择的DOM) * 正式处理数据(添加DOM ...

随机推荐

  1. linux下安装pip(centos)

    centos系统中自带python2.7.5但是却没有pip工具 直接yum install pip会提示没有这个包 解决方案: 需要先安装扩展源EPEL. EPEL(http://fedorapro ...

  2. Dubbo学习系列之八(分布式事务之MQ方案)

    自从小王玩起了微服务,发现微服务果然很强大,好处真是太多,心中暗喜,然而,却也遇到了分布式中最棘手的问题:分布式事务.小王遍访各路神仙,也无个完美开源解决方案,当然,也有些实际可行的手法,虽不算完美, ...

  3. Win系统下使用命令链接MySQL数据库

    方法一: 1:打开[开始]>[运行]输入[cmd]单击[确定]后出现CMD命令黑色窗口,这就是我们说的CMD命令行 2:默认进入C盘,于是我们可以进入E盘,点击回车.因为我的数据库是存放在E盘的 ...

  4. Angular7 HttpClient处理多个请求

    1. MergeMap - 串联请求 后一个请求需要前一个请求的返回结果时,需要使用串联请求. 可以使用MergeMap实现, 优势是减少嵌套,优化代码: 代码如下: import {HttpClie ...

  5. centos7 安装 docker

    一.概念 1.Docker引擎 (docker engine) 也称docker daemon,也称为docker服务,只要启动服务,就可以通过docker client发送相关docker命名,与d ...

  6. Web调用Linux客户端remmina运维

    相信你遇到过这样的场景,在浏览器网页中点击QQ图标咨询,就能唤起本机的装的qq或tim,下载百度网盘的资源的时候,点击链接浏览器会启动本地百度云进行下载.   最近因为项目需要,也要实现类似的操作,不 ...

  7. 从0开始学FreeRTOS-(创建任务)-2

    # 补充 开始今天的内容之前,先补充一下上篇文章[从单片机到操作系统-1](https://jiejietop.gitee.io/freertos-1/)的一点点遗漏的知识点. ```js BaseT ...

  8. js时间查询补充

    先来看下JS中的日期操作: var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年 ...

  9. 初探内核之《Linux内核设计与实现》笔记上

    内核简介  本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核   原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单.2. 高效 ...

  10. Hive 官方手册翻译 -- Hive DDL(数据定义语言)

    Hive DDL(数据定义语言) Confluence Administrator创建, Janaki Lahorani修改于 2018年9月19日 原文链接 https://cwiki.apache ...