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

摘要: 前端性能优化是一个很宽泛的概念,本书前面的部分也多多少少提到一些前端优化方法,这也是咱们一直在关注的一件重要事情。配合各类方式、手段、辅助系统,前端优化的最终目的都是提高用户体验,改善页面性能,咱们经常不遗余力进行前端页面优化,但却忽略了这样作的效果和意义。先不急于探究前端优化具体能够怎样去作,先看看什么是前端性能,应该怎样去了解和评价前端页面的性能。javascript

  

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

 

1、 网络加载类前端

 

1.减小HTTP资源请求次数java

  

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

 

2.减少HTTP请求大小跨域

  

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

 

3.将CSS或JavaScript放到外部文件中,避免使用<style>或<script>标签直接引入缓存

  

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

 

<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属性中的空内容进行加载,直至加载失败,这样就阻塞了页面中其余资源的下载进程,并且最终加载到的内容是无效的,所以要尽可能避免。

 

<!-- 不推荐 -->

<img src="" alt="photo">

<a href="">点击连接</a>

 

5.为HTML指定Cache-Control或Expires

 

为HTML内容设置Cache-Control 或Expires能够将HTML内容缓存起来,避免频繁向服务器端发送请求。前面讲到,在页面Cache-Control或Expires头部有效时,浏览器将直接从缓存中读取内容,不向服务器端发送请求。

 

<meta http-equiv="Cache-Control" content="max-age=7200" />

<meta http-equiv="Expires" content="Mon, 20 Jul 2016 23:00:00 GMT" />

 

6.合理设置Etag和Last-Modified

 

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

 

<meta http-equiv="last-modified" content="Mon, 03 Oct 2016 17:45:57 GMT"/>

 

7. 减小页面重定向

  

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

 

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

 

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

 

<link rel="stylesheet" href="//cdn1.domain.com/path/main.css">

<script src="//cdn2.domain.com/path/main.js"></script>

 

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

  

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

 

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

  

CDN Combo是在CDN服务器端将多个文件请求打包成一个文件的形式来返回的技术,这样能够实现HTTP链接传输的一次性复用,减小浏览器的HTTP请求数,加快资源下载速度。例如同一个域名CDN服务器上的a.js,b.js,c.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>

<script src="main.js" async></script>

 

使用async时,加载和渲染后续文档元素的过程和main.js的加载与执行是并行的。使用defer时,加载后续文档元素的过程和main.js的加载是并行的,可是main.js的执行要在页面全部元素解析完成以后才开始执行。

 

16.消除阻塞渲染的CSS及JavaScript

 

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

 

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

  

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

 

<!-- 不推荐 -->

<style>

@import "path/main.css";

</style>

 

<!-- 推荐 -->

<link rel="stylesheet" href="//cdn1.domain.com/path/main.css">

 

2、 页面渲染类

 

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

 

6.避免运行耗时的JavaScript

  

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

 

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

  

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

 

// 不推荐

.opacity{

    filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);

}