已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 46698-2025电子级四氯化钛
- 2025年长白朝鲜族自治县统计局公开招聘合同制普查工作人员(5人)备考考点题库及答案解析
- 2025中煤建设集团有限公司企业技术中心招聘1人参考笔试试题及答案解析
- 2025年蚌埠高新区天河社区行政事务管理中心公开招聘编外工作人员备考题库及答案详解(易错题)
- 2025上海复旦儿科社工部招聘项目社工备考题库含答案详解(培优a卷)
- 2025南平延平区水东街道社区卫生服务中心招聘临床医师1人备考考点题库及答案解析
- 2025徐汇区行政服务中心招聘会务主管备考题库附答案详解(考试直接用)
- 2025内蒙古鄂尔多斯市伊金霍洛旗消防救援大队招聘政府专职消防员15人备考题库及答案详解(网校专用)
- 2025贵州黔南州龙里县招聘城市社区工作者27人备考题库有答案详解
- 2026“梦工场”招商银行天津分行寒假实习生招聘备考题库含答案详解(培优)
- 2025广东广州南沙区南沙街道社区专职工作人员招聘32人考试笔试参考题库及答案解析
- 2025国家电投集团水电产业平台公司筹备组人员选聘备考题库及一套答案详解
- 2025版《煤矿安全规程》学习辅导课件(运输、提升和空压机)
- 平台合作协议书合同
- 护理学毕业论文
- 统编版(2024)八年级上册道德与法治第三单元《勇担社会责任》测试卷(含答案)
- 2026年企业人力资源管理师之四级人力资源管理师考试题库300道【考点梳理】
- 西藏自治区公务员2025年考试行测资料分析模拟试卷(含答案)
- 湘教版五年级上册音乐本教案
- 台球厅雇工合同范本
- 《轨道工程施工技术》课件 CRTSⅢ型轨道板预制
评论
0/150
提交评论