1.zeptoԴ??
2.å端å¼ååwebå端å¼åçåºå«
3.读Zepto源码之Data模块
zeptoԴ??
在 zepto 源码中,$.fn 对象有个 ready 函数,其中有这样一句 setTimeout(fn,0);
时间设为 0 ,就是要立即执行,那为什么还要特意将 fn 套到 setTimeout 里面呢?
一、线程
1、外国电商源码浏览器的内核是多线程的,它们在内核控制下相互配合以保持同步,一个浏览器通常由以下常驻线程组成:GUI 渲染线程,javascript 引擎线程,浏览器事件触发线程,定时触发器线程,异步 http 请求线程。qftp 源码
2、javascript 是单线程的,同一个时间只能做一件事。
二、任务队列(消息队列)
同步函数:如果在函数A返回的时候,调用者就能够得到预期结果(即拿到了预期的返回值或者看到了预期的效果),那么这个函数就是同步的。
异步函数即如果在函数A返回的时候,调用者还不能够得到预期结果,而是需要在将来通过一定的手段得到,那么这个函数就是异步的。
三、漏洞 源码setTimeout(fn, 0) 的作用
调用 setTimeout 函数会在一个时间段过去后在队列中添加一个消息。这个时间段作为函数的第二个参数被传入。如果队列中没有其它消息,消息会被马上处理。但是,如果有其它消息,setTimeout 消息必须等待其它消息处理完。因此第二个参数仅仅表示最少的时间,而非确切的时间。
零延迟 (Zero delay) 并不是意味着回调会立即执行。在零延迟调用 setTimeout 时,其并不是-32源码过了给定的时间间隔后就马上执行回调函数。其等待的时间基于队列里正在等待的消息数量。也就是说,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。
所有文章在微信公众号上同步发布,欢迎关注和提出宝贵意见。