PC端优化的策略很多,如 YSlow(YSlow 是 Yahoo 发布的一款 Firefox 插件,现 Chrome 也可安装,可以对网站的页面性能进行分析,提出对该页面性能优化的建议)原则,或者 Chrome 自带的 Audits 等,总结起来主要包括网络加载类、页面渲染类、CSS 优化类、JavaScript 执行类、缓存类、图片类、架构协议类等几类,下面逐一介绍。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
1.减少 HTTP 资源请求次数
在前端页面中,通常建议尽可能合并静态资源图片、JavaScript 或 CSS 代码,减少页面请求数和资源请求消耗,这样可以缩短页面首次访问的用户等待时间。通过构建工具合并雪碧图、CSS、JavaScript 文件等都是为了减少 HTTP 资源请求次数。另外也要尽量避免重复的资源,防止增加多余请求。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
2.减小 HTTP 请求大小
除了减少 HTTP 资源请求次数,也要尽量减小每个 HTTP 请求的大小。如减少没必要的图片、JavaScript、CSS 及 HTML 代码,对文件进行压缩优化,或者使用 gzip 压缩传输内容等都可以用来减小文件大小,缩短网络传输等待时延。前面我们使用构建工具来压缩静态图片资源以及移除代码中的注释并压缩,目的都是为了减小 HTTP 请求的大小。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
3.将 CSS 或 JavaScript 放到外部文件中,避免使用style
或script
标签直接引入
在 HTML 文件中引用外部资源可以有效利用浏览器的静态资源缓存,但有时候在移动端页面 CSS 或 JavaScript 比较简单的情况下为了减少请求,也会将 CSS 或 JavaScript 直接写到 HTML 里面,具体要根据 CSS 或 JavaScript 文件的大小和业务的场景来分析。如果 CSS 或 JavaScript 文件内容较多,业务逻辑较复杂,建议放到外部文件引入。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
<code><link rel="stylesheet" href="//cdn.domain.com/path/main.css">
...
<script src="//cdn.domain.com/path/main.js"></script></code>
4.避免页面中空的 href 和 src
当link
标签的 href 属性为空,或script
、img
、iframe
标签的 src 属性为空时,浏览器在渲染的过程中仍会将 href 属性或 src 属性中的空内容进行加载,直至加载失败,这样就阻塞了页面中其他资源的下载进程,而且最终加载到的内容是无效的,因此要尽量避免。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
<code><!--不推荐-->
<img src="" alt="photo">
<a href="">点击链接</a></code>
5.为 HTML 指定 Cache-Control 或 Expires
为 HTML 内容设置 Cache-Control 或 Expires 可以将 HTML 内容缓存起来,避免频繁向服务器端发送请求。前面讲到,在页面 Cache-Control 或 Expires 头部有效时,浏览器将直接从缓存中读取内容,不向服务器端发送请求。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
<code><meta http-equiv="Cache-Control" content="max-age=7200">
<meta http-equiv="Expires" content="Mon,20Jul201623:00:00GMT"></code>
6.合理设置 Etag 和 Last-Modified
合理设置 Etag 和 Last-Modified 使用浏览器缓存,对于未修改的文件,静态资源服务器会向浏览器端返回304,让浏览器从缓存中读取文件,减少 Web 资源下载的带宽消耗并降低服务器负载。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
<code><meta http-equiv="last-modified" content="Sun,05 Nov 2017 13:45:57 GMT"></code>
7.减少页面重定向
页面每次重定向都会延长页面内容返回的等待延时,一次重定向大约需要200毫秒不等的时间开销(无缓存),为了保证用户尽快看到页面内容,要尽量避免页面重定向。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
8.使用静态资源分域存放来增加下载并行数
浏览器在同一时刻向同一个域名请求文件的并行下载数是有限的,因此可以利用多个域名的主机来存放不同的静态资源,增大页面加载时资源的并行下载数,缩短页面资源加载的时间。通常根据多个域名来分别存储 JavaScript、CSS 和图片文件。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
<code><link rel="stylesheet" href="//cdn1.domain.com/path/main.css">
...
<script src="//cdn2.domain.com/path/main.js"></script></code>
9.使用静态资源 CDN 来存储文件
如果条件允许,可以利用 CDN 网络加快同一个地理区域内重复静态资源文件的响应下载速度,缩短资源请求时间。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
10.使用 CDN Combo 下载传输内容
CDN Combo 是在 CDN 服务器端将多个文件请求打包成一个文件的形式来返回的技术,这样可以实现 HTTP 连接传输的一次性复用,减少浏览器的 HTTP 请求数,加快资源下载速度。例如同一个域名 CDN 服务器上的 a.js,b.js,c.js 就可以按如下方式在一个请求中下载。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
<code><script src="//cdn.domain.com/path/a.js,b.js,c.js"></script></code>
11.使用可缓存的 AJAX
对于返回内容相同的请求,没必要每次都直接从服务端拉取,合理使用 AJAX 缓存能加快 AJAX 响应速度并减轻服务器压力。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
<code>$.ajax({
url : url,
type : 'get',
cache : true, //推荐使用缓存
data : {},
success (){//...},
error (){//...}
});</code>
12.使用 GET 来完成 AJAX 请求
使用 XMLHttpRequest 时,浏览器中的 POST 方法会发起两次 TCP 数据包传输,首先发送文件头,然后发送 HTTP 正文数据。而使用 GET 时只发送头部,所以在拉取服务端数据时使用 GET 请求效率更高。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
<code>$.ajax({
url : url,
type : 'get', //推荐使用get完成请求
data : {},
success (){//...},
error(){//...}
});</code>
13.减少 Cookie 的大小并进行 Cookie 隔离
HTTP 请求通常默认带上浏览器端的 Cookie 一起发送给服务器,所以在非必要的情况下,要尽量减少 Cookie 来减小 HTTP 请求的大小。对于静态资源,尽量使用不同的域名来存放,因为 Cookie 默认是不能跨域的,这样就做到了不同域名下静态资源请求的 Cookie 隔离。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
14.缩小 favicon.ico 并缓存
有利于 favicon.ico 的重复加载,因为一般一个 Web 应用的 favicon.ico 是很少改变的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
15.推荐使用异步 JavaScript 资源
异步的 JavaScript 资源不会阻塞文档解析,所以允许在浏览器中优先渲染页面,延后加载脚本执行。例如 JavaScript 的引用可以如下设置,也可以使用模块化加载机制来实现。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
<code><script src="main.js" defer=""></script>
<script src="main.js" async=""></script></code>
使用 async 时,加载和渲染后续文档元素的过程和 main.js 的加载与执行是并行的。使用 defer 时,加载后续文档元素的过程和 main.js 的加载是并行的,但是 main.js 的执行要在页面所有元素解析完成之后才开始执行。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
16.消除阻塞渲染的 CSS 及 JavaScript
对于页面中加载时间过长的 CSS 或 JavaScript 文件,需要进行合理拆分或延后加载,保证关键路径的资源能快速加载完成。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
17.避免使用 CSS import 引用加载 CSS
CSS 中的 @import
可以从另一个样式文件中引入样式,但应该避免这种用法,因为这样会增加 CSS 资源加载的关键路径长度,带有 @import
的 CSS 样式需要在 CSS 文件串行解析到 @import
时才会加载另外的 CSS 文件,大大延后 CSS 渲染完成的时间。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html
<code><!--不推荐-->
<style>
@import "path/main.css";
</style>
<!--推荐-->
<link rel="stylesheet" href="//cdn1.domain.com/path/main.css"></code>
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/3507.html