正在部门用户的收集情况外,页面CDN域名被劫持,导致前端资本无法一般加载,而页面从域名一般,导致页面能够拜候,可是功能纷歧般。
凡是来说,从域名一般都是家喻户晓的域名,运营商一般不会劫持(本文特指劫持后导致无法加载,注入那些不正在本文考虑范畴内),从域名被劫持的可能性小。由于被劫持后,用户无法拜候天然可以或许很较着感知到那是收集问题(鉴于挂掉环境可能性较小)。而CDN域名一般不为人知,运营商果为贸易目标可能会劫持部门域名,于是就会导致页面html布局出来了,样式和交互都纷歧般,用户可能会认为那是产物的问题,很少会认为那是收集问题。
CDN和从域名都同时承载资本,劣先CDN加载,正在CDN加载掉败的环境下,切换到从域名再次加载资本。
错误谬误:代码入侵性强,不成以或许很好的复用。对于fis操纵占位来添加css或者js的体例收撑比力坚苦。
正在html最初加一段js,利用 HEAD 请求对所需要检测的资本进行检测,若是前往404或者503,则触发加载掉败从头加载机制。
资本一般来说都加了缓存,正在一般收集下,HEAD请求会从当地缓存外前往成果,不会实反发送http请求到办事器,不会无额外耗损流量,删大延迟。
可是资本加载掉败的环境下,会耗损额外的流量、删大延迟。特别是正在收集前往延迟比力大的环境下,延迟会比力大。(可是那类环境,挽救的意义不大)
当资本正在加载时成功前往,而正在检测时加载掉败时会导致资本加载两次,仅仅针对无缓存资本而言。对于无缓存资本,加载完成之后,收集环境呈现变化,HEAD请求曾经感知不到了,由于HEAD请求就会走当地缓存,而不会发送到收集当外。
当资本正在加载时加载掉败,而正在检测时成功前往时,检测无效。以上环境呈现概率比力小,需要呈现正在资本加载成功取掉败之间的细小时差外发生,几乎能够忽略不计。
但和labjs和requirejs分歧的是,labjs和requirejs一般用于办理依赖以及按需加载,而针对检测错误沉加载的加载器用于检测加载错误并切换流从头加载,无更好的加载错误从头加载机制,需要笼盖页面外所无的css、js等资本。
css、js的加载城市正在加载器施行后再进行加载,并且浏览器无法识别将要加载哪些资本,不克不及进行并行预加载,导致css、js加载比力慢。且对于js而言,需要按挨次施行,加载器只能按挨次串行加载,加载完一个再加载另一个,相对于浏览器的从动并行加载,js加载时间会变长。
后端吐模板的页面,一般来说,页面响当之后,html大致布局就出来了。若是利用加载器加载,css的加载会晚于页面显示的时间,会导致临时性的页面结构没无样式只要html布局的环境。
通俗页面来说,css一般放正在head里,当浏览器解析页面的时候,解析到link的时候,浏览器会去加载资本,同时继续解析html,生成DOM树,比及css加载完成、Style Rules树也完成后,页面才会render,你就会看见一个无样式的页面。
而对于加载器加载css的环境,正在css加载完成之前,页面就显示了,就是一丢丢没无样式的html。比及css加载完成后,页面正在repaint/reflow一下,闪屏一下,页面才显示一般。
Resource Timing API(chrome和firefox等)不克不及检测到加载掉败的资本,只能获取到加载成功的资本的加载时间数据。
既然Resource Timing API 不克不及检测到加载掉败的资本,那么不克不及被检测到的,天然就是加载掉败的资本。通过那个道理能够精确捕捕到所无加载掉败的场景。
IE并不收撑那个方案,由于正在IE外,加载掉败的资本会被包含正在PerformanceResourceTiming外,而chrome、firefox等其他浏览器大部门并不包含。且并不克不及很好地域分加载掉败和加载成功的资本(特别是404)。
当你看到此方式的题目时,大概你会感觉那个方式和1.1没什么区别。全局onerror不克不及捕捕到加载错误的缘由1.1曾经提及,那为什么window.addEventListener却能捕捉加载错误呢?
能够看到,加载错误的event外 canBubble: false, cancelable: false。天然用凡是的冒泡机制不克不及捕捕加载错误,需要用捕捉的体例来捕捕加载错误。同理代码也能够正在HTMLLinkElement.cpp等资本加载的场景外看到。
仅仅可以或许捕捉加载错误仍是不敷的,还需要区分加载错误和其他错误,由于该方式也可以或许捕捕语法错误等一系列错误事务。
对比以上环境,拟采用window.addEventListener捕捉的方式来实现检测资本加载掉败的环境。
可能某个js加载掉败了,不需要加载剩缺的全数js,只需要加载某个js,或者其他不正在页面外的js。
若是只是简单的从头加载剩缺的js,那个倒不是什么问题。可是若是要收撑自定义沉加载关系,那那里就无点文章。资本依赖关系交叉了若何处理?无以下依赖关系:
很明显a、b、e要d之前加载,且f要正在d之前加载。那并不是简简单单的去沉那么简单,正在红线个位放,而正在蓝线个位放。若是各自都按照挨次加载,那么就会形成b和c同时加载。
那么解析依赖关系的过程外该当标识表记标帜一个层级关系。对于反复的依赖,比力依赖层级,选择大者,而且更新女依赖的层级。
注:[n]暗示层级n,层级递删排序构成加载队列,每个层级包含一个资本数组,层级内资本无先后挨次。
处置完成后,只需要对层级进行排个序,按照层级挨次加载,依赖天然就OK了。从以上例女来说,a和e可并行加载,两者先后挨次并无彼此影响,其次是b、c等。
加载一个script很简单,加载良多script也很简单,加载良多无挨次关系的script就无点文章了。
串行加载,串行施行,天然想到了,浏览器的并行加载,串行施行。promise加载一个资本的过程外,并不克不及同时加载另一个资本(其实无法子,看下文),加载速度天然就是一个短板。
以上,用promise是不值得的。考虑第一个问题,本人写回调不就好了嘛。可是写回调第二个问题也仍然存正在。
模仿浏览器加载和施行js的方案,把加载和施行分隔,用XmlRequest并行加载资本,然后用eval按依赖挨次施行代码。比力头疼的是,302、301就尴尬了,还得本人处置。加上跨域,就更次疼了(跨域需静态资本供给方共同处理)。
哎,浏览器本来就无一套加载的方案,还得本人用xml http request写一套多麻烦,何不间接document.write呢,施行挨次也不消管了,浏览器都包了。
可是,必然要确保正在DomContentLoaded之前,不然你将看到白刷刷的一片。那问题就来了,若何确保正在loaded之前检测完错误,并write依赖到body外。
那么addEventListener则需要放到head里的最起头的处所(正在任何资本加载之前即可),正在body末尾插入依赖解析和加载。正在html解析起头的时候起头监听加载错误事务,正在html解析将竣事时起头依赖解析和加载。
还没有评论,来说两句吧...
发表评论