




已阅读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至2030中国执法系统行业经营效益及前景运行态势分析报告
- 2025年广东省万阅大湾区百校联盟中考二模语文试题(含答案)
- 护士理论考试试题及答案
- 学生因病缺课管理制度
- 2025年江苏省苏州园区星海中考英语二模试卷
- 福建省厦门市2023-2024学年高一下学期期末质量检测历史试题(解析版)
- 工程项目经理竞聘演讲稿
- 天津水务集团有限公司招聘考试真题2024
- 《Linux系统安全》课件
- 办公家具产品设计方案
- 第三届全国技能大赛竞赛(装配钳工)选拔赛备考试题(附答案)
评论
0/150
提交评论