当前位置: 首页 > Web前端 > HTML5

前端面试常问的问题:如何提高网站性能总结

时间:2023-04-05 18:09:32 HTML5

1.使用dns预解析DNS请求需要的带宽很少,但是延迟有点高,在移动网络上尤为明显。预取DNS可以显着减少延迟,例如当用户单击链接时。在某些情况下,延迟可以减少一秒。在某些浏览器中,这种预取将与页面的实际内容并行(而不是连续)发生。正因为如此,一些高延迟域名的解析过程不会阻塞资源的加载。这可以大大加快页面加载速度(尤其是在移动网络环境中)。在一些图片较多的页面,在发起图片加载请求前预解析域名,至少可以提升5%的图片加载速度。您可以通过在服务器端发送X-DNS-Prefetch-Control标头,或通过在文档中使用值为http-equiv的标记来执行此操作:TurnDNSprefetchonandoffa标记由默认在高级浏览器中预解析,但在https协议中默认关闭。这句话是强制开启img脚本等标签的预解析。链接dns预解析标签你可以改变通过将内容参数设置为“on”来设置。Forcelookupforaspecifichostname您可以通过在链接类型中使用具有dns-prefetch的rel属性值的标记来预取特定域名:在这个例子中,Firefox会预先解析域名“www.spreadfirefox.com”。此外,元素可以使用不完整的URL主机名来标记预解析,但这些主机名必须以双斜杠开头:Forcing预取域名可能很有用,例如,在站点的主页上,强制预解析整个站点中经常引用的域,即使它们未在主页本身上使用。即使首页的性能可能不受影响,这也会提高网站的整体性能2.资源压缩合并,减少HTTP请求通过webpack、grunt等打包工具,将js和css文件打包成一个js和css,并使用gzip进行代码压缩,从而减少请求文件的大小和数量。每个js和css文件加载都需要发送一个http请求,所以可以通过合并js和css文件来减少http请求的数量。3.浏览器缓存1.强缓存Expire(绝对时间,发布服务器时间,客户端和服务器时间可能不一致。Expire:Thu,21Jan201723:39:02GMT);//在前端inthehead>标签//在后台设置response.setDateHeader("Expires",date.getTime()+20000);//Expires:过期时间值response.setDateHeader("Expires",0);//不允许浏览器或缓存服务器缓存当前页面信息。Cache-Control(相对时间,根据客户端时间,在3600秒内使用缓存。Cache-Control:max-age=3600)//在前端标签中设置//在响应中设置后端。addHeader("Cache-Control","no-cache");//浏览器和缓存服务器都不应该缓存http响应头中的页面信息。如果两者都有,则以Cache-Control为准。2.NegotiationCache(询问服务器)Last-Modified(添加到服务器发送的响应头中,Last-Modified:Thu,21Jan201723:39:02GMT)If-Modified-Since,(添加到http请求头,时间和Last-Modified一样,缺点:文件没有变化但是时间到了,会重新加载//Setresponse.setDateHeader("Last-Modified",date.getTime());//Last-Modified:页面上次生成时间Etag(哈希值,添加到服务器发送的响应头中,如果文件没有变化可以继续使用缓存)If-None-Match(添加到httprequestheader,时间与发送的Etag一致)//ResponseMessageheaderEtag:"a030f020ac7c01:1e9f"下面HTTP请求头字段及相关http知识,可以看一本书《图解http》,里面有详细的文字说明和illustrationsExpireCache-ControlLast-ModifiedIf-Modified-SinceIf-Modified-SinceIf-None-Match4.异步加载异步加载方法:1.动态脚本加载(动态创建节点:document.createElement("/script/"),创建一个labelwithjs,并将其添加到文档中);2.defer(将此属性添加到script标签);3.async(将此属性添加到脚本标签中)。异步加载的区别:1.defer是在解析完html之后执行的。defer属性指定是否延迟脚本的执行,直到页面加载完毕。如果有多个,则按照加载的先后顺序执行;加载后立即执行。async属性规定一旦脚本可用,就会异步执行。如果有多个脚本,执行顺序与加载顺序无关。这里贴一张defer和async的图,或者用图说清楚。这张图告诉我们以下几点:defer和async在网络读取(下载)上是一样的,都是异步的(相对于HTML解析)两者的区别在于脚本下载后什么时候执行。显然,defer是最接近我们对应用程序脚本加载和执行的要求的。这张图没有提到的是,它是按照加载顺序执行脚本的。用好async是乱序执行的高手。反正对于它来说,脚本的加载和执行是紧挨着的,所以不管你声明的顺序如何,只要加载了,就会立即执行。仔细想想,async对应用脚本用处不是很大,因为它根本不考虑依赖关系(即使是最低阶执行),但是非常适合不能依赖或者被任何脚本依赖的脚本,最典型例子:GoogleAnalytics