




已阅读5页,还剩64页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SteveSouderssouders,EvenFasterWebSites,Disclaimer:Thiscontentdoesnotnecessarilyreflecttheopinionsofmyemployer.,17%,83%,iGoogle,primedcache,theimportanceoffrontendperformance,9%,91%,iGoogle,emptycache,timespentonthefrontend,April2008,14Rules,MakefewerHTTPrequestsUseaCDNAddanExpiresheaderGzipcomponentsPutstylesheetsatthetopPutscriptsatthebottomAvoidCSSexpressionsMakeJSandCSSexternalReduceDNSlookupsMinifyJSAvoidredirectsRemoveduplicatescriptsConfigureETagsMakeAJAXcacheable,25%discountcode:ssouders25,Sept2007,June2009,EvenFasterWebsites,SplittheinitialpayloadLoadscriptswithoutblockingCoupleasynchronousscriptsDontscatterinlinescriptsSplitthedominantdomainFlushthedocumentearlyUseiframessparinglySimplifyCSSSelectors,Ajaxperformance(DougCrockford)WritingefficientJavaScript(NicholasZakas)Creatingresponsivewebapps(BenGalbraith,DionAlmaer)Comet(DylanSchiemann)BeyondGzipping(TonyGentilcore)OptimizeImages(StoyanStefanov,NicoleSullivan),whyfocusonJavaScript?,scriptsblock,blocksparalleldownloadsandrendering,Scriptsandotherresourcesdownloadedinparallel!How?Secretsauce?!varp=g.getElementsByTagName(HEAD)0;varc=g.createElement(script);c.type=text/javascript;c.onreadystatechange=n;c.onerror=c.onload=k;c.src=e;p.appendChild(c),MSN.com:parallelscripts,asynchronousscriptloading,XHREvalXHRInjectionScriptinIframeScriptDOMElementScriptDeferdocument.writeScriptTag,XHREval,scriptmusthavesamedomainasmainpagemustrefactorscript,varxhrObj=getXHRObject();xhrObj.onreadystatechange=function()if(xhrObj.readyState!=4)return;eval(xhrObj.responseText);xhrObj.open(GET,A.js,true);xhrObj.send();,XHRInjection,varxhrObj=getXHRObject();xhrObj.onreadystatechange=function()if(xhrObj.readyState!=4)return;varse=document.createElement(script);document.getElementsByTagName(head)0.appendChild(se);se.text=xhrObj.responseText;xhrObj.open(GET,A.js,true);xhrObj.send();,scriptmusthavesamedomainasmainpage,ScriptinIframe,iframemusthavesamedomainasmainpagemustrefactorscript:/accessiframefrommainpagewindow.frames0.createNewDiv();/accessmainpagefromiframeparent.document.createElement(div);,ScriptDOMElement,varse=document.createElement(script);se.src=,scriptandmainpagedomainscandiffernoneedtorefactorJavaScript,ScriptDefer,onlysupportedinIE(justlandedinFF3.1)scriptandmainpagedomainscandiffernoneedtorefactorJavaScript,document.writeScriptTag,document.write(+);,parallelizationonlyworksinIEparalleldownloadsforscripts,nothingelsealldocument.writesmustbeinsamescriptblock,browserbusyindicators,browserbusyindicators,goodtoshowbusyindicatorswhentheuserneedsfeedbackbadwhendownloadinginthebackground,Ensurescriptsexecuteinorder:necessarywhenscriptshavedependenciesIE:,ensure/avoidorderedexecution,loadscriptswithoutblocking,*Onlyotherdocument.writescriptsaredownloadedinparallel(inthesamescriptblock).,andthewinneris.,loadscriptswithoutblocking,dontletscriptsblockotherdownloadsyoucanstillcontrolexecutionorder,busyindicators,andonloadeventWhataboutinlinescripts?,synchronousJSexample:menu.js,varaExamples=couple-normal.php,NormalScriptSrc,couple-xhr-eval.php,XHREval,.managed-xhr.php,ManagedXHR;functioninit()EFWS.Menu.createMenu(examplesbtn,aExamples);init();,asynchronousJSexample:menu.js,vardomscript=document.createElement(script);domscript.src=menu.js;document.getElementsByTagName(head)0.appendChild(domscript);varaExamples=couple-normal.php,NormalScriptSrc,couple-xhr-eval.php,XHREval,.managed-xhr.php,ManagedXHR;functioninit()EFWS.Menu.createMenu(examplesbtn,aExamples);init();,scriptDOMelementapproach,before,after,loadscriptswithoutblocking,*Onlyotherdocument.writescriptsaredownloadedinparallel(inthesamescriptblock).,!IE,asynchronousscriptswrap-up,whataboutinlinedcodethatdependsonthescript?,whataboutinlinedcodethatdependsonthescript?,baselinecouplingresults(notgood),*ScriptsdownloadinparallelregardlessoftheDeferattribute.,needawaytoloadscriptsasynchronouslyANDpreserveorder,couplingtechniques,hardcodedcallbackwindowonloadtimerdegradingscripttagsscriptonload,technique1:hardcodedcallback,varaExamples=couple-normal.php,NormalScriptSrc,.;functioninit()EFWS.Menu.createMenu(examplesbtn,aExamples);vardomscript=document.createElement(script);domscript.src=menu.js;document.getElementsByTagName(head)0.appendChild(domscript);init()iscalledfromwithinmenu.jsnotveryflexibledoesntworkfor3rdpartyscripts,technique2:windowonload,varaExamples=couple-normal.php,NormalScriptSrc,.;functioninit()EFWS.Menu.createMenu(examplesbtn,aExamples);if(window.addEventListener)window.addEventListener(load,init,false);elseif(window.attachEvent)window.attachEvent(onload,init);init()iscalledatwindowonloadmustuseasynctechniquethatblocksonload:ScriptinIframedoesthisacrossmostbrowsersinit()calledlaterthannecessary,technique3:timer,vardomscript=document.createElement(script);domscript.src=menu.js;document.getElementsByTagName(head)0.appendChild(domscript);varaExamples=couple-normal.php,NormalScriptSrc,.;functioninit()EFWS.Menu.createMenu(examplesbtn,aExamples);functioninitTimer(interval)if(undefined=typeof(EFWS)setTimeout(initTimer,interval);elseinit();initTimer(300);loadifintervaltoolow,delayiftoohighslightincreasedmaintenanceEFWS,JohnResigsdegradingscripttags,varaExamples=couple-normal.php,NormalScriptSrc,.;functioninit()EFWS.Menu.createMenu(examplesbtn,aExamples);init();,attheendofmenu-degrading.js:varscripts=document.getElementsByTagName(script);varcntr=scripts.length;while(cntr)varcurScript=scriptscntr-1;if(curScript.src.indexOf(menu-degrading.js)!=-1)eval(curScript.innerHTML);break;cntr-;,/blog/degrading-script-tags/,cleanerclearersaferinlinedcodenotcalledifscriptfailsnobrowsersupportsit,technique4:degradingscripttags,varaExamples=couple-normal.php,NormalScriptSrc,.;functioninit()EFWS.Menu.createMenu(examplesbtn,aExamples);vardomscript=document.createElement(script);domscript.src=menu-degrading.js;if(-1!=navigator.userAgent.indexOf(Opera)domscript.innerHTML=init();elsedomscript.text=init();document.getElementsByTagName(head)0.appendChild(domscript);elegant,flexible(cool!)notwellknowndoesntworkfor3rdpartyscripts(unless.),technique5:scriptonload,varaExamples=couple-normal.php,NormalScriptSrc,.;functioninit()EFWS.Menu.createMenu(examplesbtn,aExamples);vardomscript=document.createElement(script);domscript.src=menu.js;domscript.onloadDone=false;domscript.onload=function()if(!domscript.onloadDone)init();domscript.onloadDone=true;domscript.onreadystatechange=function()if(loaded=domscript.readyState)if(!domscript.onloadDone)init();domscript.onloadDone=true;document.getElementsByTagName(head)0.appendChild(domscript);prettynice,mediumcomplexity,whataboutmultiplescriptsthatdependoneachother,andinlinedcodethatdependsonthescripts?,twosolutions:ManagedXHRDOMElementandDocWrite,multiplescriptexample:menutier.js,varaRaceConditions=couple-normal.php,Normal.;varaWorkarounds=hardcoded-callback.php,Hardcod.;varaMultipleScripts=managed-xhr.php,ManagedXH.;varaLoadScripts=loadscript.php,loadScript,.;varaSubmenus=RaceConditions,aRaceConditions,Workarounds,aWorkarounds,MultipleScripts,aMultipleScripts,GeneralSolution,aLoadScripts;functioninit()EFWS.Menu.createTieredMenu(examplesbtn,aSubmenus);,technique1:managedXHR,varaRaceConditions=couple-normal.php,Normal.;varaWorkarounds=hardcoded-callback.php,Hardcod.;varaMultipleScripts=managed-xhr.php,ManagedXH.;varaLoadScripts=loadscript.php,loadScript,.;varaSubmenus=RaceConditions,aRaceConditions,.;functioninit()EFWS.Menu.createTieredMenu(examplesbtn,aSubmenus);EFWS.Script.loadScriptXhrInjection(menu.js,null,true);EFWS.Script.loadScriptXhrInjection(menutier.js,init,true);XHRInjectionasynchronoustechniquedoesnotpreserveorderwehavetoaddthat,before,after,EFWS.loadScriptXhrInjection,/Loadanexternalscript./Optionallycallacallbackandpreserveorder.loadScriptXhrInjection:function(url,onload,bOrder)variQ=EFWS.Script.queuedScripts.length;if(bOrder)varqScript=response:null,onload:onload,done:false;EFWS.Script.queuedScriptsiQ=qScript;varxhrObj=EFWS.Script.getXHRObject();xhrObj.onreadystatechange=function()if(xhrObj.readyState=4)if(bOrder)EFWS.Script.queuedScriptsiQ.response=xhrObj.responseText;EFWS.Script.injectScripts();elseeval(xhrObj.responseText);if(onload)onload();xhrObj.open(GET,url,true);xhrObj.send();,processqueue(nextslide),or.evalnow,callcallback,saveresponsetoqueue,addtoqueue(ifbOrder),EFWS.injectScripts,/Processqueuedscriptstoseeifanyarereadytoinject.injectScripts:function()varlen=EFWS.Script.queuedScripts.length;for(vari=0;ilen;i+)varqScript=EFWS.Script.queuedScriptsi;if(!qScript.done)if(!qScript.response)/STOP!needtowaitforthisresponsebreak;elseeval(qScript.response);if(qScript.onload)qScript.onload();qScript.done=true;,readyforthisscript,evalandcallcallback,bailneedtowaittopreserveorder,ifnotyetinjected,preservesexternalscriptorder,non-blocking,worksinallbrowsers,coupleswithinlinedcode,workswithscriptsacrossdomains,workswithscriptsacrossdomains,technique2:DOMElementandDocWrite,FirefoxrelyonSafari4andChrome2,EFWS.loadScripts,loadScripts:function(aUrls,onload)/firstpass:seeifanyofthescriptsareonadifferentdomainvarnUrls=aUrls.length;varbDifferent=false;for(vari=0;inUrls;i+)if(EFWS.Script.differentDomain(aUrlsi)bDifferent=true;break;/pickthebestloadingfunctionvarloadFunc=EFWS.Script.loadScriptXhrInjection;if(bDifferent)if(-1!=navigator.userAgent.indexOf(Firefox)|-1!=navigator.userAgent.indexOf(Opera)loadFunc=EFWS.Script.loadScriptDomElement;elseloadFunc=EFWS.Script.loadScriptDocWrite;/secondpass:loadthescriptsfor(vari=0;inUrls;i+)loadFunc(aUrlsi,(i+1=nUrls?onload:null),true);,multiplescriptswithdependencies,varaRaceConditions=couple-normal.php,Normal.;varaWorkarounds=hardcoded-callback.php,Hardcod.;varaMultipleScripts=managed-xhr.php,ManagedXH.;varaLoadScripts=loadscript.php,loadScript,.;varaSubmenus=RaceConditions,aRaceConditions,.;functioninit()EFWS.Menu.createTieredMenu(examplesbtn,aSubmenus);EFWS.Script.loadScripts(menu.js,menutier.js,init);scriptsonsamedomain:orderpreserved,noblockingscriptsondifferentdomain:orderpreserved:allloadsscriptsinparallel:allexceptSaf3,Chr1loadscriptandimageinparallel:FF,Saf4,Chr2,asynchronousscriptswrap-up,casestudy:GoogleAnalytics,recommendedpattern:1vargaJsHost=(https:=tocol)?https:/ssl.:http:/www.);document.write(unescape(%3Cscriptsrc=+gaJsHost+google-,1,casestudy:dojox.analytics.Urchin1,_loadGA:function()vargaHost=(https:=tocol)?https:/ssl.:http:/www.;dojo.create(script,src:gaHost+google-,1/dojox/analytics/Urchin,asynchronousloadingFF2,3.0,3.1b2;Safari3.2,4;Opera9.63,10;Chrome1.0,2.0,iframesblockonload,parentsonloaddoesntfireuntiliframeandallitscomponentsaredownloadedworkaroundforSafariandChrome:setiframesrcinJavaScriptdocument.getElementById(iframe1).src=url;,scriptsblockiframe,nosurprisescriptsintheparentblocktheiframefromloading,IE,Firefox,SafariChromeOpera,script,script,script,stylesheetsblockiframe(IE,FF),surprisestylesheetsintheparentblocktheiframeoritsresourcesinIE&Firefox,IE,Firefox,Saf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025安徽芜湖鸠江区招聘区属国有企业领导人员拟聘用人员(二)考前自测高频考点模拟试题及完整答案详解一套
- 2025华晋焦煤井下操作技能人员招聘100人(山西)考前自测高频考点模拟试题及1套参考答案详解
- 2025年4月福建厦门市市场监督管理局所属事业单位厦门市标准化研究院简化程序招聘事业单位专业技术岗位人员2人考前自测高频考点模拟试题及一套参考答案详解
- 第1课 独一无二的我教学设计小学心理健康苏教版三年级-苏科版
- 2025东方电气集团春季校园招聘笔试题库历年考点版附带答案详解
- 2025健身房转让合同标准协议书范本
- 2025职员雇佣合同协议样本
- 福利彩票课件
- 协议书宅基地
- 协议书一协议书二协议书三
- 2025年学校少先队知识应知应会题库(含答案)
- (2025)企业首席质量官培训考核试题(附含答案)
- DB31∕T 1545-2025 卫生健康数据分类分级要求
- 起重机指挥Q1练习测试题附答案
- 《网络与新媒体概论》教学课件合集
- 2023类器官技术与行业研究报告-复刻结构重现功能 构建组织器官替身
- 国有资产交易法律实务与疑难问题
- 中华人民共和国基本医疗卫生与健康促进法课件
- 初中毕业证在哪里查询
- 九宫格智力数独200题(题答案)版
- GB/T 5796.4-2022梯形螺纹第4部分:公差
评论
0/150
提交评论