浅谈前端性能优化

写在前面

前端性能优化是一门很深的学问,作为前端工程师往往会为了优化项目加载的几十毫秒而绞尽脑汁,当然这也是前端面试常问的问题,今天就结合我所学的简单分享给大家,顺便也是对知识的一次总结。

性能优化

性能优化主要从三个方面解析:

  • 提高外部css的加载速度
  • 减少重绘重排
  • 浏览器缓存

提高css的加载速度

  • 使用CDN节点进行外部资源加速

    • cdn是一组分布在多个不同地理位置的web服务器,用于更高效的向用户发布内容

    • cdn能够去协调各用户之间访问的效率,以最快、最佳的速度给予用户数据响应

  • 对css进行压缩(利用webpage、gulp等)

  • 减少http请求数;例如:将多个css文件合并、图片合成雪碧图(Css Sprites)

    • 将多张图片合并到一张图片中,可以减小图片的总大小。

    • 将多张图片合并成一张图片后,下载全部所需的资源,只需一次请求。可以减小建立连接的消耗。

  • 优化样式表代码(尽可能精简有效,去除无用css;把统一修改得样式放在一起执行等)

减少重绘和重排

重绘和重排都是以css图层为单位的,所以本质上是对图层在进行优化

  • 元素位置的改变尽量使用css3的transform来代替top、left等操作,因为变换(transform)和透明度(opacity)的改变只会影响图层的组合不会触发重排重绘
  • 用opacity代替visibility去实现元素的隐藏(opacity搭配图层不会触发重绘和重排)
  • 将多次改变样式的操作合并成一次,例如写成类然后只修改DOM的类
  • 将DOM元素离线后进行修改,也就是display:none===>有复杂操作时候可以先将那部分隐藏,让它脱离DOM树然后修改完成后,再显示渲染DOM树
  • 利用文档碎片(DocumentFragment)实现性能优化(vue采用的优化方案)
  • 在编写动画的时候,建议采用requestAnimationFrame实现

题外话:触发重绘重排的操作

重绘:当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的。-比如visibility、outline、背景色等属性的改变。

重排/回流:页面第一次渲染 在页面发生首次渲染的时候,所有组件都要进行首次布局,这是开销最大的一次回流。比如

  • 浏览器窗口尺寸改变

  • 元素位置和尺寸发生改变的时候

  • 新增和删除可见元素

  • 内容发生改变(文字数量或图片大小等等)

  • 元素字体大小变化。

  • 激活CSS伪类(例如::hover)。

  • 设置style属性

  • 查询某些属性或调用某些方法。比如说:
    offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight
    除此之外,当我们调用getComputedStyle方法,或者IE里的currentStyle时,也会触发回流,原理是一样的,都为求一个“即时性”和“准确性”


浏览器缓存

直接从浏览器缓存里取数据也是性能优化的方案之一;但是也并不是所有的页面数据都放在浏览器缓存中,这种方式只适合于一些简单但经常会被访问的页面中,比如百度的首页,访问量巨大而且用户访问的次数也非常多,读取的时候让浏览器直接在缓存中取数据渲染页面是一种非常快速的方式

  • 定义:浏览器在本地磁盘上将用户之前请求的数据存储起来,当访问者再次访问不需要再从服务器取数据,但是第一次还是需要的!

  • 缓存的好处:

    • 减少请求个数
    • 节省带宽、避免浪费不必要的资源
    • 减轻服务器压力
    • 提高浏览器网页加载速度
  • 缓存的分类:

    • 强缓存:(存在过期时间,会失效)
      • 不会向服务器发请求,直接从本地取数据
      • 请求资源的转态码为200
    • 协商缓存
      • 向服务器发请求,服务器会根据请求头的资源判断是否命中协商缓存
      • 如果命中,返回304状态码告知浏览器读取缓存,如果没有命中则说明页面过期返回最新的页面数据
    • 二者的共同点:都是从浏览器端读取资源
    • 二者的不同点:
      • 强缓存不发给服务器
      • 协商缓存会发给服务期根据服务器返回的信息决定是否缓存
  • 缓存中的header参数:

    • expires:http1.0规范;为一个绝对时间GMT格式;指的是有效期,表明强缓存的有效时间
    • cache-control:http1.1规范;为一个资源过期剩余时间:max-age=number

补充:
可用于优化 CSS 图片加载的技术有:

  • Css Sprite
  • Base 64
  • IconFont
  • SVG Sprite

页面渲染图示:

RenderPath

前端优化是一门很复杂的学问,我也是简单学了些,在此分享给大家,欢迎补充~

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

推荐阅读更多精彩内容