前端性能优化方案

文件压缩

图片压缩能够显著的减少资源体积,明显提升页面的加载速度。

  1. 图片压缩
    项目使用webpack编译的可以使用image-webpack-loader插件,npm地址
    如果项目中没有配置图片压缩,需要自己手动处理的,推荐png图片缩网站tinypng

  2. 合理选择图片存储格式
    下面介绍几种常用的图片格式:

  1. jpg,不支持透明,采用有损压缩方式处理图像
    这种压缩方式的图片并不会真实记录各像素点的数据,而是利用人眼的特性对数据进行处理,去掉会被人眼忽略的细节,使用附近的颜色通过渐变或其他形式进行填充。
  2. png,支持透明。采用无损压缩方式处理图像,这种压缩方式采用一些算法来真实记录各像素点的数据(比如记录一大块相同颜色的开始位置和结束位置)。
  3. gif,支持透明,可以用来做动图。一般来说项目中已经很少用到这种格式了,大部分动画都用css3来实现了。

综上:
jpg格式适合用来保存色彩层次比较丰富的图片。
png适合保存含颜色较少、具有大块颜色相近的区域或亮度差异十分明显的较简单的图片。
但是如果图片中存在透明部分,只能使用png来做。

  1. css压缩、js压缩混淆
    压缩会删除空格、删除注释、缩短变量以达到压缩体积的目的。
    对应webpack插件:
    css压缩:optimize-css-assets-webpack-pluginnpm地址需要配合cssnano
    js压缩:uglifyjs-webpack-pluginnpm地址

  2. gzip压缩
    使用gzip压缩后资源可以在以上压缩基础上再进行压缩,使体积更小。

压缩过程:
1、请求header中添加Accept-Encoding字段,说明自己可以接受的压缩方法;
2、服务端接选取Accept-Encoding中的一种对响应数据进行压缩并在响应的Content-Encoding字段中说明数据的压缩方式;

压缩方式:

  1. 构建时压缩
    在webpack编译时使用compression-webpack-plugin压缩npm地址
  2. 服务端压缩

合并文件

合并文件是为了减少http请求次数,浏览器对于同时发起的请求数量做了限制。

  1. 图片合并(雪碧图)
    多张图标合并到一张图表上再通过backgroud-size 和 background-position 属性控制显示。

  2. 小图片转base64。
    图片转成base64后体积会大1/3,所以在一般体积超过3k的图片才会这样做。

  3. 使用字体图标
    字体图标的害处除了能够减少http请求数量外还有:

  1. 放大不失真
  2. 可以通过css属性控制颜色、大小等效果
  3. 兼容性好,使用unicode方式可以兼容到ie6+。
    当然其本身也有一定的缺点:
  4. 字体图标只能单色或者css3渐变
  5. 开发和维护成,本更高
    不过综合考虑还是推荐字体图标。
  1. 图片懒加载
    懒加载技术目前已经被广泛应用,页面加载时图片显示占位图,当图片出现在屏幕上后再将src替换为真实图片地址。

合理利用缓存

浏览器缓存策略

浏览器里的缓存策略氛围强缓存和协商缓存。
强缓存:
Expires属性内容为GMT属性的字符串(Wed, 21 Oct 1900 07:28:00 GMT),兼容性较好但可能存在服务端时间与本地时间不一致的问题。

Cache-Control为HTTP/1.1标准内的属性,内容为毫秒的数字( max-age=60),同时存在Cache-Control和Expires时,会覆盖Expires。

协商缓存:
Last-Modified 和 If-Modified-Since
相应头中的Last-Modified属性中为GMT格式的字符串,当浏览器发起请求时,会把内容以If-Modified-Since属性返回给服务端。服务端根据属性判断,如果文件没有变化,返回304和空的响应体,浏览器会直接从缓存读取。如果If-Modified-Since的时间小于服务器中这个资源的最后修改时间,说明文件有更新,于是返回新的资源文件和200。

ETag 和If-None-Match
相应头中的ETag中为当前资源文件的一个唯一标识(由服务器生成),只要资源有变化,Etag就会重新生成。浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到request header里的If-None-Match里,服务器只需要比较客户端传来的If-None-Match跟自己服务器上该资源的ETag是否一致,一致则304,否则200。

减少页面的重绘重排

当DOM变化影响了节点的几何属性,浏览器需要重新计算节点的几何属性,并且页面中其他节点的可能受影响,浏览器会重新排布,这个过程称之为重排。
当元素发生了外观上的改变时,浏览器会根据节点的新属性重新绘制,这个过程称为重绘。
重排必然会触发重绘,重绘不一定会伴随着重排。

其他重发重排的情况:

  1. 调整浏览器窗口大小;
  2. 除了更改元素的几何属性会触发重排,获取元素的几何属性也会触发重排。
    现代浏览器对于重排进行了优化,多次DOM操作会合并一次操作。但是获取属性浏览器会立即进行重绘以确保用户获取的是最新状态的属性

如何最小化重绘和重排:

  1. 通过classname或者cssText修改多个样式
  2. 通过fragment批量添加DOM
  3. 对于进行复杂操作的元素,可以先将元素设置为display:none;隐藏,修改完毕之后再显示出来。这样只会触发两次重排和重绘。
  4. 对于会引起多次重排的元素,可以设置定位为absolute或fixed,使其脱离文档流。

其他

  1. 合理缓存变量以减少查找原型链和作用域链的次数、减少属性访问的次数。
  2. 不要省略分号;
  3. 避免资源404,减少重定向的次数。
  4. 避免使用with、eval、Function。
  5. 不需要与服务端交互的数据不要存放到cookie里。
  6. webpack打包优化,按需加载。
  7. 合理提取公共代码,减少冗余部分。
  8. 函数节流,限制某一个方法的频繁触发。
  9. 合理利用事件代理。
  10. CND分发资源。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,176评论 5 469
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,190评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,232评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,953评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,879评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,177评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,626评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,295评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,436评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,365评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,414评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,096评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,685评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,771评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,987评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,438评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,032评论 2 341

推荐阅读更多精彩内容