前端性能优化之桌面浏览器优化策略

经过上篇文章前端性能测试的性能测试和分析,咱们基本能够获取收集到页面上的具体性能数据,如何根据这些数据采起适当的方法和手段对当前的页面进行优化呢?目前来看,前端优化的策略不少,如YSlow(YslowYahoo 发布的一款 Firefox 插件,能够对网站的页面性能进行分析,提出对该页面性能优化的建议)原则等,总结起来主要包括网络加载类、页面渲染类、CSS 优化类、JavaScript 执行类、缓存类、图片类、架构协议类等几类,本文主要介绍桌面端浏览器的性能优化策略,分为两部分,网络加载类和页面渲染类。javascript

网络加载类

1.减小 HTTP 资源请求次数

在前端页面中,一般建议尽量合并资源图片、JavascriptCSS 代码,减小页面请求数和资源请求消耗,这样能够缩短页面首次访问的用户等待时间。经过构建工具合并雪碧图、CSSJavaScript 文件等都是为了减小 HTTP 请求次数。另外也要尽可能避免重复的资源,防止增长多余请求。css

2.减少 HTTP 请求大小

除了减小 HTTP 资源请求次数,也要尽可能减少每一个 HTTP 请求的大小。如减小不必的图片、JavaScriptCSSHTML 代码,对文件进行压缩优化,或者使用 gzip 压缩传输内容等均可以用来减少文件大小,缩短网络传输等待延时。前面咱们使用构建工具来压缩静态图片资源以及移除代码中的注释并压缩,目的都是为了减少 HTTP 请求的大小。前端

3.将CSSJavaScript 放到外部文件中,避免使用 <style> 和 <script> 标签直接引入

HTML 文件中引用外部资源能够有效利用浏览器的静态资源缓存,但有时候在移动端页面 CSSJavaScript 比较简单的状况下为了减小请求,也会将 CSSJavaScript 直接写到 HTML 里面,具体要根据 CSSJavaScript 文件的大小和业务的场景来分析。若是 CSSJavaScript 文件内容较多,业务逻辑较复杂,建议放到外部文件引入。java

<link rel="stylesheet" href="//cdn.domain.com/path/main.css">
...
<script src="//cdn.domain.com/path/main.js"></script>
复制代码

4.避免页面中空的 href 和 src

当 <link>标签的 href 属性为空,或<script>、<img>、<iframe>标签的 src 属性为空时,浏览器在渲染的过程当中仍会将 href 属性或 src 属性中的空内容进行加载,直到加载失败,这样就阻塞了页面中其余资源的下载进程,并且最终加载到的内容是无效的,所以要尽可能避免。ajax

<!-- 不推荐 -->
<img src="" alt="photo">
<a href=""></a>
复制代码

5.为 HTML 指定 Cache-Control 或 Expires

HTML内容设置 Cache-ControlExpires 能够将 HTML内容缓存起来,避免频繁向服务器端发送请求。在页面Cache-ControlExpires 头部有效时,浏览器将从缓存中读取内容,不向服务器发送请求。跨域

<meta http-equiv="Cache-Control" content="max-age=7200" />
<meta http-equiv="Expires" content="Mon, 20 Jul 2017 23:00:00 GMT" />
复制代码

6.合理设置 EtagLast-Modified

合理设置 EtagLast-Modified 使用浏览器缓存,对于未修改的文件,静态资源服务器会向浏览器端返回 304 ,让浏览器从缓存中读取文件,减小 Web 资源下载的带宽消耗并下降服务器负载。浏览器

<meta http-equiv="Last-Modified" content="Mon, 03 Oct 2017 17:45:57 GMT" />
复制代码

7.减小页面重定向

页面每次重定向都会延长页面内容返回的等待延时,一次重定向大约须要 600 毫秒的时间开销,为了保证用户尽快看到页面的内容,要尽可能避免页面重定向。缓存

8.使用静态资源分域存放来增长下载并行数

浏览器在同一时刻向同一个域名请求文件的并行下载数是有限的,所以能够利用多个域名的主机来存放不一样的静态资源,增大页面加载时资源的并行下载数,缩短页面资源加载的时间。一般根据多个域名来分别存储 JavaScriptCSS 和图片文件。性能优化

<link rel="stylesheet" href="//cdn1.domain.com/path/main.css">
...
<script src="//cdn2.domain.com/path/main.js"></script>
复制代码

9.使用静态资源 CDN 来存储文件

若是条件容许,能够利用 CDN 网络加快同一个地理区域内重复静态资源文件的响应下载速度,缩短资源请求时间。bash

10.使用 CDN Combo 下载传输内容

CDN Combo 是在 CDN 服务器端将多个文件请求打包成一个文件的形式来返回的技术,这样能够实现 HTTP 链接传输的一次复用,减小浏览器的 HTTP 请求数,加快资源下载速度。例如同一个域名 CDN 服务器上的 a.jsb.jsc.js 就能够按以下方式在一个请求中下载。

<script src="//cdn.domain.com/path/a.js,b.js,c.js"></script>
复制代码

11.使用可缓存的 AJAX

对于返回内容相同的请求,不必每次都直接从服务端拉取,合理使用 AJAX 缓存能加快 AJAX 响应速度并减轻服务器压力。

$.ajax({
    url:url,
    type: 'get',
    cache: true,        //推荐使用缓存
    data: {}
    success(){
        //...
    },
    error(){
        //...
    }
});
复制代码

12.使用 GET 来完成 AJAX 请求

使用 XMLHttpRequest 时,浏览器中的 POST 方法发送请求首先发送文件头,而后发送 HTTP 正文数据。而使用 GET 时只发送头部,因此在拉取服务端数据时使用 GET 请求效率更高。

$.ajax({
    url:url,
    type: 'get',       //推荐使用 get 完成请求
    data: {}
    success(){
        //...
    },
    error(){
        //...
    }
});
复制代码

13.减小 Cookie 的大小并进行 Cookie 隔离

HTTP 请求一般默认带上浏览器端的 Cookie 一块儿发送给服务器,因此在非必要的状况下,要尽可能减小 Cookie 来减少 HTTP 请求的大小。对于静态资源,尽可能使用不一样的域名来存放,由于 Cookie 默认是不能跨域的,这样就作到了不一样域名下静态资源请求的 Cookie 隔离。

14. 缩小 favicon.ico 并缓存

有利于 favicon.ico 的重复加载,由于通常一个 Web 应用的 favicon.ico 是不多改变的。

15.推荐使用异步 JavaScript 资源

异步的 JavaScript 资源不会阻塞文档解析,因此容许在浏览器中优先渲染页面,延后加载脚本执行。例如 JavaScript 的引用能够以下设置,也可使用模块化加载机制来实现。

<script src="//main.js" defer></script> //使用defer时,加载后续文档元素的过程和main.js的加载是并行的,但main.js的执行要在页面全部元素解析完成以后才开始执行
<script src="//main.js" async></script> //使用async时,加载后续文档元素的过程和main.js的加载是并行的
复制代码

16.消除阻塞渲染的 CSSJavaScript

对于页面中加载时间过长的 CSSJavaScript 文件,须要进行合理拆分或延后加载,保证关键路径的资源能快速加载完成。

17.避免使用 CSS import 引用加载 CSS

CSS 中的 @import 能够从另外一个文件中引入样式,但应该避免这种用法,由于这样会增长 CSS 资源加载的关键路径长度,带有 @importCSS 样式须要在 CSS 文件串行解析到 @import 时才会加载另外的 CSS 文件,大大延后 CSS 渲染完成的时间。

<!--不推荐-->
<style>
@import "path/main.css";
</style>

<!--推荐-->
<link rel="stylesheet" href="//cdn1.domain.com/path/main.css">
复制代码

页面渲染类

1. 把 CSS 资源引用放到 HTML 文件顶部

通常推荐将全部 CSS 资源尽早指定在 HTML 文档 <head> 中,这样浏览器能够优先加载 CSS 并尽早完成页面渲染。

2.JavaScript 资源引用放到 HTML 文件底部

JavaScript 资源放到 HTML 文档底部能够防止 JavaScript 的加载和解析执行对页面渲染形成阻塞。因为 JavaScript 资源默认是解析阻塞的,除非被标记为异步或者经过其余的异步方式加载,不然会阻塞 HTML DOM 解析和 CSS 渲染的过程。

3.不要在 HTML 中直接缩放图片

HTML 中直接缩放图片会致使页面内容的重排重绘,此时可能会使页面中的其余操做产生卡顿,所以要尽可能减小在页面中直接进行图片缩放。

4.减小 DOM 元素数量和深度

HTML 中标签元素越多,标签的层级越深,浏览器解析 ** DOM** 并绘制到浏览器中所花的时间就越长,因此应尽量保持 DOM 元素简洁和层级较少。

<!--不推荐-->
<div>
    <span>
        <a href="javascript: void(0);">
            <img src="./path/photo.jpg" alt="图片">
        </a>
    </span>
</div>

<!--推荐-->
<img src="./path/photo.jpg" alt="图片">
复制代码

5.尽可能避免使用 <table>、<iframe>等慢元素

<table>内容的渲染是将 tableDOM 渲染树所有生成完并一次性绘制到页面上的,因此在长表格渲染时很耗性能,应该尽可能避免使用它,能够考虑使用列表元素 <ul> 代替。尽可能使用异步的方式动态添加 iframe 内资源的下载进程会阻塞父页面静态资源的下载与 CSSHTML DOM的解析。

6.避免运行耗时的 Javascript

长时间运行的 JavaScript 会阻塞浏览器构建 DOM 树、DOM 渲染树、渲染页面。因此,任何与页面初次渲染无关的逻辑功能都应该延迟加载执行,这和 JavaScript 资源的异步加载思路是一致的。

7.避免使用 CSS 表达式或 CSS 滤镜

CSS 表达式或 CSS 滤镜的解析渲染速度是比较慢的,在有其余解决方案的状况下应该尽可能避免使用。

//不推荐
.opacity{
    filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);
}
复制代码

关于桌面浏览器页面优化的经常使用技术和思路主要包括以上这些,尽管列出不少,但仍可能有少数遗漏,可见前端性能优化不是一件简简单单的事情,其涉及的内容不少。你们能够根据实际状况将这些方法应用到本身的项目当中,要想所有作到几乎是不可能的,但作到用户可接受的原则仍是很容易实现的。欢迎你们加入QQ 前端技术交流群 544587175,技术来自于交流。