前端性能优化(摘录汇总)

PC浏览器前端优化策略

pc端优化的策略很多,如Slow(YSlow时Yahoo发布的一款Firefox插件,现Chrome也可以安装,可以对网站的页面性能进行分析,提出对该页面性能优化的建议。)或者Chrome自带的Audits等,总结起来包括网络加载类,也买你渲染类,CSS优化类,javaScript执行类、缓存类、图片类、架构协议类等几类。

网络加载类

  • 减少HTTP资源请求次数。
    在前端也页面中,通常建议尽可能合并静态资源图片、JavaScript或者CSS代码,减少页面请求数和资源请求消耗,这样可以缩短页面手册访问用户等待时间。通过构建工具合并雪碧图、CSS、javaScript文件都是为了减少HTTP资源的请求次数。另外也要尽量避免重复的资源,防止增加多余的请求。
  • 减小HTTP请求大小
    除了减少HTTP请求的次数,也要尽量减少每个HTTP请求的大小。如减少没必要的图片、JavaScript、CSS及HTML代码,对文件进行压缩优化,或者使用gzip压缩传输内容等都和以来减小为念大小,缩短传输等待时延。使用构建工具来压缩静态图片资源以及移除代码中的注释并压缩,目的都是问了减少HTTP请求的大小。
  • 将CSS或者JavaScript放到外部文件中,避免使用<style>或则和<script>标签直接引入

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

  • 避免页面中空的href和src
    当页面中的href属性位空,或者<script>、<img>、<iframe>标签的src属性为空时,浏览器在渲染过程中仍会将href属性或者src属性中的内容进行加载,直至加载失败,这样就阻塞了页面中其他资源的下载进程,而且最终加载到的内容是无效的,因此要尽量避免。

  • 为HTML制定Cache-Control或者Expires
    为HTML内容设置Cache-Control 或者Expires头部有效时,浏览器直接从缓存中读取内容,不向服务器发送请求。

    • cache-control:指定请求和响应遵循的缓存机制
    • 取值:
      1. no-cache: 先发送请求,与废弃确认该资源是否被更改,如果未被更改,则使用缓存。
      2. no-store :不允许缓存,每次都要区服务器上,下载完整的响应。(安全措施)
      3. public :缓存所有响应,但并非必须。因为max-age也可以做到相同的效果。
      4. private: 只为单个用户缓存,因此不允许热河中继进行缓存。(比如CDN就不允许缓存private的响应)
      5. max-age: 表示当前请求开始,该响应在多久内能被缓存和重用,而不去服务器重新请求。列如:max-age = 60表示响应何以在缓存和重用60秒。
  • express : 网页到期时间
    用于设定网页的到期时间,过期后必须到服务器上重新传输。

<meta http-equiv="Cache-Control" content="max-age=7200">
<meta http-equiv="Expires" content="Mon,20Jul201623:00:00GMT">

// 注意时间格式:必须使用GMT的时间格式
  • 合理设置Etag和last-Modified
    和理设置Etag和last-Modified使用浏览器缓存,对于未修改的文件,静态资源服务器会向浏览器端返回304,让浏览器从缓存文件中读取文件。减少web资源下载的带宽消耗并降低服务器负载。
<meta http-equiv="last-modified" content="Sun,05 Nov 2017 13:45:57 GMT">

详情请查看meta标签属性汇总

  • 减少页面重定向
    页面每次重定向都会延长页面内容的等待延时,一次重定向大约需要200ms不等的时间开销(无缓存),为了保证用户尽快看到也买你内容,要尽量避免页面重定向。

  • 使用静态资源分域存放来增加下载并行数
    浏览器在同一时刻相同一域名请求文件的并行下载数是有限的,因此可以利用多个域名的主机来存放不同的静态资源,增大页面加载时资源的并行下载数,缩短也买你资源加载的时间。通常根据多个域名来分别存储JavaScript、CSS、和图片文件。

<link rel="stylesheet" href="//cdn1.domain.com/path/main.css" >
...
<script src="//cdn2.domain.com/path/main.js"></script>
  • 使用cnd来存储文件
    如果条件允许,可以利用cnd网络加快同一个地理区域内重复静态资源文件的响应下载速度,缩短资源请求时间。
  • 使用CDN Combo下载传输内容
    CDN Combo 是在cdn服务器端将多个文件打包成一个文件的形式来返回的技术,这样可以实现HTTP连接传输的一次性复用性,减少浏览器的htttp请求数,加快资源下载速度。列如同一个域名CDN服务器上a.js, b.js, c.js就可以按如下方式在一个请求中下载。
    <script src="//cdn.domain.com/path/a.js,b,jsc,js">
    11.使用可缓存的AJAX对于返回内容相同的请求,没必要每次都直接从服务器拉去,合理使用AJAX缓存能加快AJAX响应速度并减轻服务器压力。
$.ajax({
    url : url,
    type : 'get',
    cache : true, //推荐使用缓存
    data : {},
    success (){//...},
    error (){//...}
});

  • 使用GET来完成AJAX请求。
    使用XMLhttpRequest时,浏览器中的POST方法会发起两次TCP数据包传输,首先发送头文件,然后发送HTTP正文数据。而使用GET时只发送头部问价,所以在拉去服务端数据是,使用GET请求效率更高。
$.ajax({
    url : url,
    type : 'get', //推荐使用get完成请求
    data : {},
    success (){//...},
    error(){//...}
});
  • 减少Cookie的大小并进行Cookie隔离
    HTTP请求通常默认会带上浏览器端的Cookie一起发送给服务器,所以在非必要情况下,要尽量减少Cookie来减小HTTP请求的大小。对于静态资源,尽量使用不同的域名来存放,因为Cookie默认是不能跨域的,这样就做到了不同域名下静态资源请求的Cookie隔离。

  • 缩小favicon.ico并缓存,因为一般一个web应用的favicon.ico是很少改变的。

  • 推荐使用异步Javascript资源
    异步的javascript资源不会阻塞文档解析,所以允许在浏览器中优先渲染页面,延后加载脚本执行。列如Javascript的引用可以如下设置。也可以使用模块化加载机制来实现。

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

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

  • 消除阻塞渲染的css及javascript
    对于页面中加载时间过长的CSS或JavaScript文件,需要进行合理拆分或者延后加载,保证关键路径的资源能快速加载完成。

  • 避免使用CSS impor 引用加载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"

页面渲染类

  • 把css资源引用放到HTML文件顶部
    一般推荐奖所有CSS资源今早指定在文档的<head>中,这样浏览器可以优先下载css并今早完成页面渲染。
  • javascript资源引用放到HTML文件底部。
    javascrit资源引用放到HTML文档底部可以方式javascript的加载和解析执行对页面渲染造成阻塞。由于JavaScript资源默认是解析阻塞,除非被标记为异步或者通过其他的异步方式加载,否则会阻塞HTML DOM解析和CSS渲染的过程。
  • 尽量预先设定图片大小
    在加载大量图片元素是,尽量预先设定图片尺寸大小,否则在图片加载过程中,跟心图片的排版信息,会产生大量的重排。
  • 不要在HTML中直接缩放图片
    在HTML中直接缩放图片会导致页面内容的重排和重绘,此时可能会使页面的其他操作产生卡顿,因此要尽量减少页面中直接进行图片的缩放。
  • 减少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="图片" >

  • 尽量避免在选择器末尾添加通配符
    CSS解析匹配到渲染树的过程是从右到左的逆向匹配,在选择器末尾添加通配符至少会增加一倍多的计算量。
  • 减少使用关系类型样式表的写法
    直接使用唯一类名即可最大亵渎的提升渲染引擎绘制渲染树等效率。
  • 尽量减少使用js动画
    JS直接操作DOM极容易引起页面的重排
  • CSS动画使用translate、scale代替top、height
    尽量使用css3的translate、scale属性代替top、left和height、width,避免大量的重排计算。
  • 尽量避免使用<table>、<iframe>
    <table>内容的渲染是将table的DOM渲染树全部生成完成并一次性绘制到页面上的,所以在长表格渲染时很消耗性能,应该尽量避免使用他,可以考虑使用列表元素<ul>代替。尽量使用异步的方式添加iframe,英文iframe内资源的下载进程会阻塞父页面静态资源的下载与CSS及DOM的解析。
  • 避免运行耗时的javascript
    长时间运行的Javascript会阻塞浏览器构建DOM树,DOM渲染树、渲染页面。所以,任何与页面初次渲染无关的逻辑功能都应该延迟加载执行,这个Javascript资源的异步加载思路是一致的。
  • 避免使用CSS表达式,或者CSS滤镜
.opacity{
    filter : progid : DXImageTransform.Microsoft.Alpha( opacity = 50 );
}

移动浏览器前端优化策略:

  • 首屏数据提前请求,避免JavaScript文件加载后才请求数据
    为了进一步提升页面加载速度,可以考虑将页面的数据请求尽可能提前,避免在javascript加载完成后才去请求数据。通常数据请求是页面内容渲染中关键路径最长的部分,而且不能并行,所以如果能将数据请求提前,可以极大程度上缩短页面内容的渲染完成时间。
  • 首屏加载按需加载,非首内容滚屏加载,保证首屏内容最小化。
    由于移动端网络速度相对较慢,网络资源有限,因此为了尽快完成页面内容的加载,需要保证首屏加载资源最小,非首屏内容异步方式加载。一遍推荐移动页面首屏数据延时最长不超过3ms。目前中国联通3G的网络速度为338KB/s(2.71MS/s),所以推荐首屏资源所有最大不超过1MB。
  • 模块化资源并行下载
    在移动端加载资源中保证JavaScript资源并行加载,主要指的是模块化Javascript资源的异步加载,列如AMD的异步模块,使用并行的加载方式能够缩短多个文件资源的加载时间。
  • inline首屏必备的CSS和JavaScript
    通常为了在HTML加载完毕时能够使浏览器中有基本的样式。需要将页面渲染是必备的CSS和JavaScript通过<script>或者<style>内联到页面中,避免页面HTML载入完成到页面内容展示这段过程中页面出现空白。
<!DOCTYPE html>
<html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>样例</title>
    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
    <style>
    /*必备的首屏CSS*/
    html,body{
        margin:0;
        padding:0;
        background-color:#ccc;
    }
    </style>
</head>
<body>
</body>
</html>

后续内容

HTTP压缩:

现代浏览器进行htttp请求时,普遍支持gzip压缩。在发出请求时,会在htttp头部显示Accept-Enconding: gzip,deflate (在请求头中设置) 即就是告诉服务器可以接受这两种雅俗格式。于是服务器就把请求的资源文件压缩,并设置Content-Encoding:gzip (在响应头中设置),浏览器看到着个头部设置,自动解压缩。这种压缩可以减少至少60%的体积。CDN资源库对返回的脚本进行了压缩传输,所以在开发中有些资源可以通过CDN静态资源库来引用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335