1.zeptoԴ??
2.å端å¼ååwebå端å¼åçåºå«
3.读Zepto源码之Data模块
zeptoԴ??
在 zepto 源码中,$.fn 对象有个 ready 函数,其中有这样一句 setTimeout(fn,0);
时间设为 0 ,就是要立即执行,那为什么还要特意将 fn 套到 setTimeout 里面呢?
一、线程
1、千万源码浏览器的内核是多线程的,它们在内核控制下相互配合以保持同步,一个浏览器通常由以下常驻线程组成:GUI 渲染线程,javascript 引擎线程,浏览器事件触发线程,定时触发器线程,异步 http 请求线程。javaweb源码入门到精通
2、javascript 是单线程的,同一个时间只能做一件事。
二、任务队列(消息队列)
同步函数:如果在函数A返回的时候,调用者就能够得到预期结果(即拿到了预期的返回值或者看到了预期的效果),那么这个函数就是同步的。
异步函数即如果在函数A返回的时候,调用者还不能够得到预期结果,而是需要在将来通过一定的手段得到,那么这个函数就是异步的。
三、金波段主图源码setTimeout(fn, 0) 的作用
调用 setTimeout 函数会在一个时间段过去后在队列中添加一个消息。这个时间段作为函数的第二个参数被传入。如果队列中没有其它消息,消息会被马上处理。但是,如果有其它消息,setTimeout 消息必须等待其它消息处理完。因此第二个参数仅仅表示最少的时间,而非确切的时间。
零延迟 (Zero delay) 并不是意味着回调会立即执行。在零延迟调用 setTimeout 时,其并不是在线扒站源码能用过了给定的时间间隔后就马上执行回调函数。其等待的时间基于队列里正在等待的消息数量。也就是说,setTimeout()只是将事件插入了任务队列,必须等到当前代码(执行栈)执行完,主线程才会去执行它指定的回调函数。要是当前代码耗时很长,有可能要等很久,所以并没有办法保证回调函数一定会在setTimeout()指定的时间执行。
å端å¼ååwebå端å¼åçåºå«
移å¨å端å¼ååwebå端å¼åé½å±äºå端å¼åï¼å ·ä½æ以ä¸åºå«ã1ãä¸å¡çåºç¨åºæ¯
webå端å¼å主è¦æä¼ ç»çPC端ç½é¡µå¼åï¼é¡µé¢ä¸»è¦æ¯è¿è¡å¨PC端æµè§å¨ä¸ï¼ç§»å¨å端å¼ååºæ¥ç页é¢ä¸»è¦æ¯è¿è¡å¨ææºä¸ã
ç´è§ä¸ä¼æè§ï¼PC端页é¢å¤§ä¸äºï¼ç§»å¨ç«¯é¡µé¢å°ä¸äºï¼ä½æ¯æ ¹æ®å¼åç»éªï¼é¡µé¢å¤§å¯å¹¶ä¸ä»£è¡¨ä¹¦åç代ç å¤æï¼é¡µé¢å°ä¹å¹¶ä¸æå³çå¼åç®åï¼é¾ä¸æ主è¦è¿æ¯åå³äºå ·ä½çä¸å¡éæ±ã
2ãæ°ææ¯ç使ç¨
ç±äºå¨ç§»å¨ç«¯ä¸»è¦ä»¥webkitå æ ¸ä¸ºä¸»ï¼å¯¹äºHTML5çæ°ææ¯æ¯æçæ´å¥½ï¼æ以å¯ä»¥æ´å¤§èå´ç使ç¨æ°ææ¯ï¼èPC端å¼åç±äºå¾å¤åºæ¯ä¸è¦æ±å ¼å®¹IEçèçæ¬æµè§å¨ï¼åºäºæµè§å¨å ¼å®¹æ§çèèï¼æäºæ åµä¸éå¶äºæ°ææ¯ç使ç¨ã
3ã页é¢çéé æ§
ä¼ ç»PC端ç页é¢å¼åä¸è¬é½ä¼éæ©ç»é¡µé¢è®¾å®ä¸ä¸ªåºå®å®½åº¦ï¼ä¸¤ä¾§æçç½ï¼ä½æ¯ç§»å¨ç«¯ç页é¢ç±äºå ¶è½½ä½ææºå±å¹æ¯PCè¦å°å¾å¤ï¼ä¸è¬é½ä¼éæ©å°½å¯è½å¤çå¨ææºå±å¹ä¸æ¾ç¤ºå 容ï¼è¿å°±è¦æ±ç§»å¨ç«¯é¡µé¢è¦è½å¤å åéåºåç§å±å¹å°ºå¯¸çææºå¹¶è¿è¡æ大ç¨åº¦çå©ç¨ã
ä»è¿ä¸ç¹ä¸æ¥è¯´ç§»å¨ç«¯é¡µé¢çéé é¾åº¦æ´é«ä¸äºã
4ã页é¢çæ§è½
PC端çç½ç»æ åµä¸è¬æ¯è¾ç¨³å®ï¼é½æ¯éè¿ç½çº¿æè Wi-Fiè¿æ¥ç½ç»ï¼ä½æ¯ç§»å¨ç«¯å°±æ¯è¾å¤æï¼é¤äºWi-Fiï¼è¿æ2Gã3Gã4Gçè³æ¯å¨å ç§ä¸åçç½ç»è¿æ¥ä¸äº¤æ¿åæ¢ä¹ç»å¸¸åçã
ä¸ç¨³å®çç½ç»è¿æ¥å¯¹é¡µé¢æ§è½å¸¦æ¥çæææ¯ç§»å¨ç«¯ç页é¢èµæºä¸è½å¤ªå¤§ï¼å¦åå¨æ¶å£ç½ç»æ åµä¸æ¶ï¼é¡µé¢å°ä¼æ æ³è®¿é® ï¼ä¸¥éå½±åç¨æ·ä½éªã
5ãæ¡æ¶éå
ç±äºç§»å¨ç«¯ç½ç»æ åµçä¸ç¨³å®ï¼å¯¼è´æ们å¨ç§»å¨ç«¯é¡µé¢æ¡æ¶éåæ¶ï¼ä¸è¬åªèèå°èç¾çæ¡æ¶ï¼ä¾å¦åzepto.jsè¿æ ·çå缩ä¹ååªæ9.6Kï¼å°±è½æ»¡è¶³ä¸è¬ä¸å¡çéè¦ï¼å¦ææ¯æ³è¦æ建æ´å¤æçå页é¢åºç¨ï¼å¯ä»¥éæ©åvue.jsè¿æ ·çæ¡æ¶ï¼åè½å¼ºå¤§ï¼ä½ä½ç§¯å缩åå´åªæå¤Kã
èweb端ç¸å¯¹éæ©çèå´å°±æ¯è¾å¤§ï¼ä¸äºæ¯è¾éåçæ¡æ¶ä¹å¯ä»¥æ ¹æ®é¡¹ç®éæ±å 以èèï¼ä¾å¦å¤èä½åºå¤§çext.jsï¼ä¾ç¶ååçä¼å¤UIç»ä»¶æ´»è·å¨ä¸äºä¼ä¸çåå°ç®¡çç³»ç»é¡¹ç®ä¸ã
æ©å±èµæ
Webå端å¼åéè¦ææ¡çææ¯ï¼
1ãçç»ææ¡å端å¼åææ¯(HTML5ãJSãJSONãXHTMLãCSS3)ï¼äºè§£å项ææ¯çç¸å ³æ åã
2ãææ¡Ajaxå¼æ¥ç¼ç¨ï¼è½å¤ååºé«æ§è½ãå¯å¤ç¨çå端ç»ä»¶ã
3ã对OOãMVCãMVVMçç¼ç¨ææ³ãå端æ¡æ¶ææ·±å»ç解ï¼çç»ææ¡ä¸ä¸ªå端æ¡æ¶ï¼å¸¸ç¨å端æ¡æ¶ Vuejsï¼AngularJSï¼Reactï¼Bootstrapï¼QUICK UIï¼ç§»å¨ç«¯æï¼Frozen UIï¼weUI ï¼SUIï¼MUIï¼AUIï¼äºè§£å ¶åçï¼æ¡æ¶æå¾å¤ï¼éæ©ä¸¤ä¸ä¸ªä¸»æµçæ¡æ¶ï¼çç»ï¼æ·±åº¦äºè§£æå¯ä»¥ï¼ã
4ãåäºWebæ§è½ä¼åï¼å¯è®¿é®æ§ã对SEOçæè¯å¥½çä½éªï¼ç解表ç°å±ä¸æ°æ®å±å离çæ¦å¿µã Webè¯ä¹åï¼è¿äºä¹æ¯å¨æ¾å·¥ä½ä¸ï¼å¾æç¨çå å项ï¼ã
5ãäºè§£å端å®å ¨æºå¶ï¼çæHTTPå议以åæµè§å¨ç¼åçç¥ã
6ãçæ常è§JSå¼åæ¡æ¶æºç å®ç°ï¼ï¼å¦ï¼prototypeãjQueryãMootoolsï¼Extï¼ Dojoï¼underscoreãYUIãKissyï¼ï¼è³å°çç»ä¸ç§ï¼å½ç¶ä¹ä¸è¦å»éä¸äºç¨ç人å¾å°çæ¡æ¶ï¼è¦æç½å¤§é¡¹ç®é½æ¯å¢éåï¼ä¸è½èªå·±æä¸å¥ï¼ã
7ãæ¥æè¯å¥½ç代ç ç¼åï¼è®¾è®¡ææ¡£æ°åçç»éªï¼çç»ä½¿ç¨Gitççæ¬æ§å¶å·¥å ·ã
8ã对常è§çæµè§å¨å ¼å®¹é®é¢ææ¸ æ°çç解ï¼å¹¶æå¯é ç解å³æ¹æ¡ï¼å¦IE6/7/8/9ã FirefoxãSafariãChromeã
9ãå ·æè¾é«ç审ç¾ï¼è¿ä¸ªå¾éè¦ï¼å¤å»è§è¯ä¸äºæ¨¡æ¿ï¼é«ç«¯ç项ç®ï¼å°±è½æè§å°æå¤å¤§çå·®è·ï¼ã
读Zepto源码之Data模块
Zepto的Data模块主要负责处理DOM节点的数据,包括获取和存储与DOM相关的信息。本文将深度解析Data模块的工作机制,以Zepto1.2.0版本的财经创新源码实验源码为例。《reading-zepto》在GitHub上开源,欢迎star。
在内部方法中,attributeData负责获取节点中所有data-*属性的值,并将它们存储到store对象中。node.attributes获取的是所有属性,所以遍历时需要判断属性名是否以"data-"开头。存储时,去掉"data-"并转换为驼峰式,作为store对象的键。属性值默认为字符串,为方便操作,通过deserializeValue方法转换成对应的数据类型。
setData方法用于存储数据,通常不需要写入DOM,而是在内存中进行操作。它首先读取node的exp属性,以确保属性名的唯一性,避免覆盖用户自定义属性。如果node尚未标记exp,则设置数据存储。从data中获取缓存数据,如果为空,则调用attributeData获取所有data-*属性的值并缓存。
getData方法根据指定的属性名获取缓存值。没有指定名则返回所有缓存,缓存为空则调用setData。如果指定name在store中,则返回结果。兼容camel-name参数形式,提供更灵活的API。如果store中未找到,则返回通过$.fn.data查找的结果。
data方法能设置或获取节点的缓存数据,调用setData或getData。当传递name和value时,设置缓存,遍历所有元素进行设置。对于对象传值,遍历设置缓存。最后返回第一个元素的name缓存。
removeData方法用于删除缓存数据。若无参数,则清空所有,若有参数则仅删除指定数据。names为字符串时先转换为数组,遍历元素进行删除操作,根据names删除指定数据或清空store缓存。
.remove和.empty方法在移除DOM节点后,需要清空对应节点的数据以释放内存。elements包含所有子节点,如果是.remove方法,自身也被移除,因此加入到要删除的节点中。最后调用removeData方法清空数据,再移除节点。
$.data方法最终调用DOM的.data方法。$.hasData判断元素是否有缓存数据。通过从缓存中获取对应DOM的缓存store,若store存在且不为空,则返回true,反之返回false。
所有文章在微信公众号上同步发布,欢迎关注和提出宝贵意见。