SlideShare uma empresa Scribd logo
1 de 70
Lazyload实践 口碑网 吴天豪
Introduce  吴天豪 口碑网-UED-前端开发工程师 大三 爱折腾 博客: www.f2es.com
关于交流会 主动分享 分享没有大小 一个困扰你很久的问题 一个五分钟的小发现 一个好的提高开发效率的工具 一份好的开发经验
Lazyload 直译:惰性加载 一般我们都会叫它做“延迟加载” http://en.wikipedia.org/wiki/Lazy_loading
http://docs.kissyui.com/kissy/docs/datalazyload/index.html http://www.appelsiini.net/projects/lazyload http://developer.yahoo.com/yui/imageloader/
Why lazyload Start sooner Stop waiting
一般我们会用于 加载js 加载html块
延迟加载js http://book.douban.com/subject/5362856/ http://book.douban.com/subject/4719162/
Total_Speed = Time_to_Download + Time_to_parse + Time_to_execute(evaluation)
Js-其实是一个老话题了 为什么要延迟加载js 当浏览器下载执行js时,页面的下载和渲染处于等待状态 为什么停滞? 大家思考一下 1.当页面一边渲染html和css,一边下载并执行脚本,what will happen? 脚本操作的元素可能根本就还没有渲染出来
如果我们的脚本放在页面的顶部,比如head里面,或者把脚本在页面中间,页面会等待脚本下载和执行 这在页面生存周期中是必要的,因为脚本执行过程中可能会修改页面内容
组织脚本 脚本放到页面底部 合并URL (minify) 因为http请求会带来额外的性能消耗,因此下载单个100k的文件比下载4个25k的文件要快。 无阻塞的脚本 异步加载js文件
动态加载脚本 方式: XHR 动态脚本 Defer Async …….
文件之间的依赖关系 执行顺序 并行下载
介绍一个比较少见的方式 Script in iframe 页面中的iframe和其他元素是并行加载的,这样就可以无阻塞的加载script脚本 存在跨域问题
动态脚本能很好的处理脚本之间的依赖关系
监听js是否加载并准备就绪 Firefox,Opera,Chrome,Safari 3+ script.onload ie script.readystatechange script.readyState  === “loaded”   script.readyState === “complete”
LoadScript(“jQuery.js”, function(){ 	$(function(){ 		//jQuery code 	};  }
不过…文件一多… loadScript(“a.js”, function(){ loadScript(“b.js”, function(){ loadScript(“c.js”, function(){ loadScript(“d.js”, function(){ 				alert(“哎呀我擦,终于加载好了”); 			} 		} 	} }
这样看起来就舒服多了 Load([“a.js”, “b.js”, “c.js”, “d.js”] , function(){ 	//do something  });
这样就更好了 Load(“d.js”, function(){ 	//do something }) “d.js” 依赖于[“a.js”, “b.js”, “c.js”]
豆瓣do http://site.douban.com/widget/notes/22456/note/87598595/
n.onload = n.onreadystatechange = function () {     if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') {         _loaded[this.getAttribute('src')] = true;         if (cb) { cb(this.getAttribute('src'), context);         }         //防止ie6的内存泄漏问题 n.onload = n.onreadystatechange = null;     } };
加载单个文件的处理。接受五个参数:url, type(文件类型), charset(编码), cb(要对应执行的方法), context(执行上下文环境)
Do.add('common', {path: 'http://img3.douban.com/js/site/packed_common0.js', type: 'js'}); Do.add('common-eventhandler', {path: 'http://img3.douban.com/js/site/packed_common_eventhandler0.js', type: 'js', requires: ['common']}); Do('common', 'common-eventhandler');
问题依然存在: 下载a.js -> 执行a.js回调 -> 下载b.js -> 执行b.js的回调-> 下载c.js -> 执行c.js的回调-> 下载d.js -> 执行d.js的回调 不能做到并行下载….
在chrome和safari里,通过动态script加载的脚本并不会按照插入的顺序执行,而是哪个先加载好哪个执行 That’s pretty bad!
那么在chrome/safari里,可以插入一个<script type=“text/cache” src=“#”>来实现,type=“text/cache”的脚本下载好后会缓存并触发onload,但不会执行。之后再插入script type=“text/javascript”,因为这个时候脚本都已经下载好,所以插入的顺序就是执行的顺序了
多一次插入就多浪费一次资源 使用这个方法实属无奈
最后,统一的解决方案 同域文件 用xmlhttprequest请求过来 这时,脚本是以字符串的形式传递过来的 var s = document.createElement('script');  s.text = xhrObj.responseText; head.appendChild(s);
这种方法避开了evil eval,并且和DOM Script一样,可以按顺序加载js文件,当然,不会阻塞后续资源的加载。更为重要的是,在所有浏览器下,这种方法都不会阻止渲染和onload事件,体现了XMLHTTPRequest异步请求的本色。
跨域的脚本 Firefox/opera里可以用动态 Script DOM element ,完美地实现并行下载和顺序执行 对于 Safari/Chrome/IE ,无法保证顺序执行,通过插入一个 <script type=“text/cache” src=“#”> 来实现。
defer和async的区别 Defer 延迟 Async异步
关于defer <script src=" " defer></script> 加上 defer 等于在页面完全在入后再执行脚本,相当于 window.onload,但应用上比 window.onload更灵活 告诉浏览器这段脚本不需要立即执行,从而做到异步加载,不阻塞其他资源下载 在window.onload处理之前执行defer的脚本
Defer的水很深… http://msdn.microsoft.com/en-us/library/ms533719(VS.85).aspx https://developer.mozilla.org/En/HTML/Element/Script#attr-defer 都没有涉及执行顺序的问题…
defer 在ie下能保持执行顺序,无论哪个先下载好---《高性能网站建设进阶指南》35页 测试结果很怪异… http://www.websiteoptimization.com/speed/tweak/defer/ 动态插入的脚本,即使设置defer,依然不能保证执行顺序
<head> <script defer>   	 alert(3); </script> <script>  	 alert(1); </script> </head> <body> <script defer>   	 alert(4); </script> <script>  	 alert(2); </script> <script> window.onload = function(){   	  alert(5);   } </script> </body> http://stevesouders.com/cuzillion/?ex=10017&title=IE+Ensure+Order+Excution
Html5 async This Boolean attribute is set to indicate that the browser should, if possible, execute the script asynchronously. If the script cannot be executed asynchronously, or the browser doesn’t support this attribute, the script is executed synchronously (and loading the content blocks until the script finishes running). 加了这个属性就意味这该脚本的执行不会影响页面的加载
区别
回到根源 Reduce(减少文件大小) Defer(延迟) Go Async(异步) Be Lazy(懒加载) Bite Size(真的需要 JS 吗)
更好的了解script标签 https://developer.mozilla.org/En/HTML/Element/Script http://msdn.microsoft.com/en-us/library/ms535892(VS.85).aspx
Html lazyload 对html片段进行延迟加载 极大地减少页面渲染时间 同时解决了图片加载的问题
实践 Sina微博 Twitter 淘宝商城 等等
思路 1.正常渲染一屏多一点大小的页面 2.把剩下的html代码放到一个容器中,这时不会解析,以文本的形式存在 3.随着用户进行的页面滚动操作逐步渲染页面 4.为开发人员提供相应操作的接口
1.容器的选择 textarea noscript 你会选择哪个?
容器要求 内部的元素全部以文本或者文本节点的形式解析 可以可判断位置 访问内部的文本
Textarea 应用:淘宝商城 其实,挺好,貌似没有什么大问题,我们需要的基本功能都已经实现了
noscript 在开启脚本的情况下,元素本身可以获取,但是不含占位属性,比如offsetTop,offsetLeft,或者height,width之类的 在IE789下,内部的文本节点是不可访问的或者说在浏览器在开启脚本的情况下渲染好之后就把内部的文本删除了,No dom, no data
看起来textarea对noscript有着压倒性的优势
是么?
你希望那些不开启脚本的用户就没法使用你的产品了么?
在口碑网上一次调查时,不开启脚本的访问用户占0.5%到1%,不是一个小数目
页面的优化和可用性不应该是两个不同的走向
noscript解决方案 对于noscript的占位属性丢失 获取到noscript元素,并在外层套一个textarea元素,textarea元素用visibility:hidden隐藏 为什么不用display:none? 之后,判断noscript元素是否在视口内的任务就顺利移交给了textarea 为什么不用别的元素?比如div之类的 这里就涉及到了文本转义的问题
noscript解决方案 对于IE789对noscript内部元素的处理 感谢stackoverflow,有位老兄也在研究这个问题 使用iframe来引入noscript元素,然后用ajax动态请求iframe的html代码,因为这部分代码实际上已经在用户浏览的页面上了 拿到完整的html之后用正则把每个noscript内部的文本切割到一个数组里
<iframe class="k2-display-none" src="?noscript=true"></iframe> 我们可以这样发一个请求 Y.io("?noscript=true", cfg); o.responseText就是含有当前页面noscript标签的html字符串
坚持noscript 为了提高页面的可访问性
还有问题 开发人员的脚本和一些元素有依赖关系 如果元素没有加载就执行脚本会导致脚本报错 让开发人员在每次获取元素之前都先判断元素是否存在不靠谱,并且脚本并不能直接知道元素到底加载好了米
把脚本的初始化放到对应的html块里? 好处,脚本会随着元素的加载执行 好吧,这让页面的维护变的非常困难,脚本东一段西一段的
自定义事件 我们创建一个自定义事件,这个事件的目的就是在某个html块加载好的时候发出一个广播,让脚本知道所要操作的元素已经加载好。 脚本绑定这个事件。
自定义事件 Y. publish(evt_type, opts) 在Y.EventTarget. _yuievt.events里存储 Y. fire( evt_type ) 触发绑定的回调事件队列
再具体一点 添加自定义事件 Y.pulish("lazyloadReady:" + i, {           type : "lazyloadReady:" + i,           preventable : false });
触发事件 ev = "lazyloadReady:" + (i + 1); Y.fire(ev);
绑定事件 Y.on("lazyloadReady:1" , function(){      alert("第一个模块加载完成"); }); 暂时使用了页面上noscript标签的序号作为事件名…还在考虑更好的方法
创建iframe元素带来的开销是其他元素的1~2数量级 频繁的字符串操作,性能上有待提高…
看看kissy怎么做的 dataLazyload.addCallback(el, fn)  表示当 el 即将出现时,触发 fn 具体实现我觉得应该是类似的,有兴趣的可以看看源代码的实现
QA
谢谢

Mais conteúdo relacionado

Mais procurados

跟著 geerlingguy 大神
一起測試 Ansible Roles
跟著 geerlingguy 大神
一起測試 Ansible Roles跟著 geerlingguy 大神
一起測試 Ansible Roles
跟著 geerlingguy 大神
一起測試 Ansible RolesChen Cheng-Wei
 
開發的效能與效率-twMVC#15
開發的效能與效率-twMVC#15開發的效能與效率-twMVC#15
開發的效能與效率-twMVC#15twMVC
 
twMVC#21 | 你所不知道的 Visual Studio
twMVC#21 | 你所不知道的 Visual StudiotwMVC#21 | 你所不知道的 Visual Studio
twMVC#21 | 你所不知道的 Visual StudiotwMVC
 
MVC實戰分享 分頁與排序相關技巧-tw mvc#13
MVC實戰分享 分頁與排序相關技巧-tw mvc#13MVC實戰分享 分頁與排序相關技巧-tw mvc#13
MVC實戰分享 分頁與排序相關技巧-tw mvc#13twMVC
 
twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API
twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API
twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API twMVC
 
Javascript stacktrace
Javascript stacktraceJavascript stacktrace
Javascript stacktracecazhfe
 
twMVC#23 | 一個Mobile App開發、維護與改版的愛恨之路
twMVC#23 | 一個Mobile App開發、維護與改版的愛恨之路twMVC#23 | 一個Mobile App開發、維護與改版的愛恨之路
twMVC#23 | 一個Mobile App開發、維護與改版的愛恨之路twMVC
 
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 Continuous Delivery Workshop with Ansible x GitLab CI (5th) Continuous Delivery Workshop with Ansible x GitLab CI (5th)
Continuous Delivery Workshop with Ansible x GitLab CI (5th)Chu-Siang Lai
 
twMVC#29 -Learning Machine Learning with Movie Recommendation
twMVC#29 -Learning Machine Learning with Movie RecommendationtwMVC#29 -Learning Machine Learning with Movie Recommendation
twMVC#29 -Learning Machine Learning with Movie RecommendationMia Chang
 
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊twMVC
 
MakerBoard: MT7688 Emulator
MakerBoard: MT7688 EmulatorMakerBoard: MT7688 Emulator
MakerBoard: MT7688 EmulatorFred Chien
 
Java script 全面逆襲!使用 node.js 打造桌面環境!
Java script 全面逆襲!使用 node.js 打造桌面環境!Java script 全面逆襲!使用 node.js 打造桌面環境!
Java script 全面逆襲!使用 node.js 打造桌面環境!Fred Chien
 
twMVC#19 | 微信公眾平台申請與wechat api 開發血淚史
twMVC#19 | 微信公眾平台申請與wechat api 開發血淚史twMVC#19 | 微信公眾平台申請與wechat api 開發血淚史
twMVC#19 | 微信公眾平台申請與wechat api 開發血淚史twMVC
 
HTML5 Web workers
HTML5 Web workersHTML5 Web workers
HTML5 Web workersTom Fan
 
twMVC#24 | 開發團隊的敏捷之路(未完成)
twMVC#24 | 開發團隊的敏捷之路(未完成)twMVC#24 | 開發團隊的敏捷之路(未完成)
twMVC#24 | 開發團隊的敏捷之路(未完成)twMVC
 
twMVC#31網站上線了然後呢
twMVC#31網站上線了然後呢twMVC#31網站上線了然後呢
twMVC#31網站上線了然後呢twMVC
 
專案分層架構 twMVC#18
專案分層架構 twMVC#18專案分層架構 twMVC#18
專案分層架構 twMVC#18twMVC
 
ASP.NET MVC 善用網路資源快速完打造網站
ASP.NET MVC 善用網路資源快速完打造網站ASP.NET MVC 善用網路資源快速完打造網站
ASP.NET MVC 善用網路資源快速完打造網站twMVC
 

Mais procurados (19)

跟著 geerlingguy 大神
一起測試 Ansible Roles
跟著 geerlingguy 大神
一起測試 Ansible Roles跟著 geerlingguy 大神
一起測試 Ansible Roles
跟著 geerlingguy 大神
一起測試 Ansible Roles
 
開發的效能與效率-twMVC#15
開發的效能與效率-twMVC#15開發的效能與效率-twMVC#15
開發的效能與效率-twMVC#15
 
twMVC#21 | 你所不知道的 Visual Studio
twMVC#21 | 你所不知道的 Visual StudiotwMVC#21 | 你所不知道的 Visual Studio
twMVC#21 | 你所不知道的 Visual Studio
 
MVC實戰分享 分頁與排序相關技巧-tw mvc#13
MVC實戰分享 分頁與排序相關技巧-tw mvc#13MVC實戰分享 分頁與排序相關技巧-tw mvc#13
MVC實戰分享 分頁與排序相關技巧-tw mvc#13
 
twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API
twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API
twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API
 
Javascript stacktrace
Javascript stacktraceJavascript stacktrace
Javascript stacktrace
 
twMVC#23 | 一個Mobile App開發、維護與改版的愛恨之路
twMVC#23 | 一個Mobile App開發、維護與改版的愛恨之路twMVC#23 | 一個Mobile App開發、維護與改版的愛恨之路
twMVC#23 | 一個Mobile App開發、維護與改版的愛恨之路
 
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 Continuous Delivery Workshop with Ansible x GitLab CI (5th) Continuous Delivery Workshop with Ansible x GitLab CI (5th)
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 
twMVC#29 -Learning Machine Learning with Movie Recommendation
twMVC#29 -Learning Machine Learning with Movie RecommendationtwMVC#29 -Learning Machine Learning with Movie Recommendation
twMVC#29 -Learning Machine Learning with Movie Recommendation
 
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
 
MakerBoard: MT7688 Emulator
MakerBoard: MT7688 EmulatorMakerBoard: MT7688 Emulator
MakerBoard: MT7688 Emulator
 
Java script 全面逆襲!使用 node.js 打造桌面環境!
Java script 全面逆襲!使用 node.js 打造桌面環境!Java script 全面逆襲!使用 node.js 打造桌面環境!
Java script 全面逆襲!使用 node.js 打造桌面環境!
 
twMVC#19 | 微信公眾平台申請與wechat api 開發血淚史
twMVC#19 | 微信公眾平台申請與wechat api 開發血淚史twMVC#19 | 微信公眾平台申請與wechat api 開發血淚史
twMVC#19 | 微信公眾平台申請與wechat api 開發血淚史
 
App house
App houseApp house
App house
 
HTML5 Web workers
HTML5 Web workersHTML5 Web workers
HTML5 Web workers
 
twMVC#24 | 開發團隊的敏捷之路(未完成)
twMVC#24 | 開發團隊的敏捷之路(未完成)twMVC#24 | 開發團隊的敏捷之路(未完成)
twMVC#24 | 開發團隊的敏捷之路(未完成)
 
twMVC#31網站上線了然後呢
twMVC#31網站上線了然後呢twMVC#31網站上線了然後呢
twMVC#31網站上線了然後呢
 
專案分層架構 twMVC#18
專案分層架構 twMVC#18專案分層架構 twMVC#18
專案分層架構 twMVC#18
 
ASP.NET MVC 善用網路資源快速完打造網站
ASP.NET MVC 善用網路資源快速完打造網站ASP.NET MVC 善用網路資源快速完打造網站
ASP.NET MVC 善用網路資源快速完打造網站
 

Destaque

Technology K- 12 in the classroom
Technology K- 12 in the classroomTechnology K- 12 in the classroom
Technology K- 12 in the classroomDebbie Greer
 
模块化和组件化Css
模块化和组件化Css模块化和组件化Css
模块化和组件化CssWu tianhao
 
Sara's presentation (3)
Sara's presentation (3)Sara's presentation (3)
Sara's presentation (3)polag
 
Music video presentation
Music video presentationMusic video presentation
Music video presentationpolag
 
前端基础知识回顾
前端基础知识回顾前端基础知识回顾
前端基础知识回顾Wu tianhao
 
Pps ghiray 11 09 10
Pps ghiray 11 09 10Pps ghiray 11 09 10
Pps ghiray 11 09 10ghirayprop
 
Game live broadcast
Game live broadcastGame live broadcast
Game live broadcastAlex Choi
 
Pps ghiray 01 10 10
Pps ghiray 01 10 10Pps ghiray 01 10 10
Pps ghiray 01 10 10ghirayprop
 
새로운 앱 수익 모델과 광고
새로운 앱 수익 모델과 광고새로운 앱 수익 모델과 광고
새로운 앱 수익 모델과 광고Alex Choi
 
Affordable House and lot for sale Alexandra (Murang bahay at Lupa)
Affordable House and lot for sale Alexandra (Murang bahay at Lupa)Affordable House and lot for sale Alexandra (Murang bahay at Lupa)
Affordable House and lot for sale Alexandra (Murang bahay at Lupa)Affordable House and Lot
 
Affordable House and lot For Sale Montefaro (Murang Bahay at LUpa)
Affordable House and lot For Sale Montefaro (Murang Bahay at LUpa)Affordable House and lot For Sale Montefaro (Murang Bahay at LUpa)
Affordable House and lot For Sale Montefaro (Murang Bahay at LUpa)Affordable House and Lot
 

Destaque (14)

Technology K- 12 in the classroom
Technology K- 12 in the classroomTechnology K- 12 in the classroom
Technology K- 12 in the classroom
 
模块化和组件化Css
模块化和组件化Css模块化和组件化Css
模块化和组件化Css
 
Sara's presentation (3)
Sara's presentation (3)Sara's presentation (3)
Sara's presentation (3)
 
Music video presentation
Music video presentationMusic video presentation
Music video presentation
 
前端基础知识回顾
前端基础知识回顾前端基础知识回顾
前端基础知识回顾
 
Wasting energy
Wasting energyWasting energy
Wasting energy
 
Pps ghiray 11 09 10
Pps ghiray 11 09 10Pps ghiray 11 09 10
Pps ghiray 11 09 10
 
Noti ghiray
Noti ghirayNoti ghiray
Noti ghiray
 
Game live broadcast
Game live broadcastGame live broadcast
Game live broadcast
 
Pps ghiray 01 10 10
Pps ghiray 01 10 10Pps ghiray 01 10 10
Pps ghiray 01 10 10
 
MDB Firm Overview
MDB Firm OverviewMDB Firm Overview
MDB Firm Overview
 
새로운 앱 수익 모델과 광고
새로운 앱 수익 모델과 광고새로운 앱 수익 모델과 광고
새로운 앱 수익 모델과 광고
 
Affordable House and lot for sale Alexandra (Murang bahay at Lupa)
Affordable House and lot for sale Alexandra (Murang bahay at Lupa)Affordable House and lot for sale Alexandra (Murang bahay at Lupa)
Affordable House and lot for sale Alexandra (Murang bahay at Lupa)
 
Affordable House and lot For Sale Montefaro (Murang Bahay at LUpa)
Affordable House and lot For Sale Montefaro (Murang Bahay at LUpa)Affordable House and lot For Sale Montefaro (Murang Bahay at LUpa)
Affordable House and lot For Sale Montefaro (Murang Bahay at LUpa)
 

Semelhante a Lazyload实践

拆分初始化负载
拆分初始化负载拆分初始化负载
拆分初始化负载kaven yan
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swttka
 
Proud Plone on Cloud
Proud Plone on CloudProud Plone on Cloud
Proud Plone on CloudTsungWei Hu
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介GO LL
 
高性能网站最佳实践
高性能网站最佳实践高性能网站最佳实践
高性能网站最佳实践longhao
 
Docker Compose
Docker ComposeDocker Compose
Docker ComposeMiles Chou
 
Presta shop 1.6 详细安装指南
Presta shop 1.6 详细安装指南Presta shop 1.6 详细安装指南
Presta shop 1.6 详细安装指南YUCHENG HU
 
Performance 入門 - 前端工程開發實務訓練
Performance 入門 - 前端工程開發實務訓練Performance 入門 - 前端工程開發實務訓練
Performance 入門 - 前端工程開發實務訓練Joseph Chiang
 
如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)
如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)
如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)Cyril Wang
 
Phalcon2014 Startup
Phalcon2014 StartupPhalcon2014 Startup
Phalcon2014 StartupSteve Luo
 
互联网创业服务器运维工具集
互联网创业服务器运维工具集互联网创业服务器运维工具集
互联网创业服务器运维工具集zhen chen
 
广告前端代码优化
广告前端代码优化广告前端代码优化
广告前端代码优化taobao.com
 
Flash RIA Usability
Flash RIA UsabilityFlash RIA Usability
Flash RIA Usabilitynbaction
 
Php可调试团队开发环境配置
Php可调试团队开发环境配置Php可调试团队开发环境配置
Php可调试团队开发环境配置wangkangluo1
 
Php可调试团队开发环境配置
Php可调试团队开发环境配置Php可调试团队开发环境配置
Php可调试团队开发环境配置xinqi yang
 
张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐zhangsuoyong
 

Semelhante a Lazyload实践 (20)

拆分初始化负载
拆分初始化负载拆分初始化负载
拆分初始化负载
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt
 
Proud Plone on Cloud
Proud Plone on CloudProud Plone on Cloud
Proud Plone on Cloud
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介
 
高性能网站最佳实践
高性能网站最佳实践高性能网站最佳实践
高性能网站最佳实践
 
Docker Compose
Docker ComposeDocker Compose
Docker Compose
 
Presta shop 1.6 详细安装指南
Presta shop 1.6 详细安装指南Presta shop 1.6 详细安装指南
Presta shop 1.6 详细安装指南
 
Performance 入門 - 前端工程開發實務訓練
Performance 入門 - 前端工程開發實務訓練Performance 入門 - 前端工程開發實務訓練
Performance 入門 - 前端工程開發實務訓練
 
如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)
如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)
如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)
 
Phalcon2014 Startup
Phalcon2014 StartupPhalcon2014 Startup
Phalcon2014 Startup
 
Html5
Html5Html5
Html5
 
互联网创业服务器运维工具集
互联网创业服务器运维工具集互联网创业服务器运维工具集
互联网创业服务器运维工具集
 
广告前端代码优化
广告前端代码优化广告前端代码优化
广告前端代码优化
 
Flash RIA Usability
Flash RIA UsabilityFlash RIA Usability
Flash RIA Usability
 
Flash ria usability 刘轩飞
Flash ria usability 刘轩飞Flash ria usability 刘轩飞
Flash ria usability 刘轩飞
 
Flutter實作概述 | GDSC NYCU
Flutter實作概述 | GDSC NYCUFlutter實作概述 | GDSC NYCU
Flutter實作概述 | GDSC NYCU
 
Inline Script
Inline ScriptInline Script
Inline Script
 
Php可调试团队开发环境配置
Php可调试团队开发环境配置Php可调试团队开发环境配置
Php可调试团队开发环境配置
 
Php可调试团队开发环境配置
Php可调试团队开发环境配置Php可调试团队开发环境配置
Php可调试团队开发环境配置
 
张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐
 

Lazyload实践