MrZWH / Web-front-end-performance-optimization

剖析web前端性能优化原理,分析当前大公司在性能优化上所做的实践。
MIT License
6 stars 2 forks source link

Web前端性能优化

剖析web前端性能优化原理,分析当前大公司在性能优化上所做的实践。

浏览器的一个请求从发送到返回都经历了什么?

请求过程中一些潜在的性能优化点

深入理解 http 请求过程是前端性能优化的核心

资源的合并与压缩

google 首页案例学习

html 压缩

CSS 压缩

JS 压缩与混乱

文件合并

文件合并存在的问题:

在线压缩工具

实战 fis3

新建 fis-conf.js

图片相关优化

一张 JPG 图片的解析过程

png8/png24/png32 之间的区别

每种图片格式都有自己的特点,根据不同的业务场景选择不同的图片格式是很有必要的。

不同格式图片常用的业务场景

图片压缩

CSS 雪碧图

优点:可以减少网站的 HTTP 请求数量 缺点:整合图片比较大时,一次加载比较慢

Image inline

使用矢量图

在安卓下使用 webp

webp 的优势体现在它具有更优的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量;同时具备了无损有损压缩模式、Alpha 透明以及动画的特性,在 JEPG 和 PNG 上的转化效果都非常优秀、稳定和统一。

图片压缩案例分析

www.iconfont.cn https://tinypng.com

图片压缩实战

图片转换网站:zhitu.isux.us 在图片小于8kb的时候做一个构建工具inline 的选择 雪碧图:www.spritecow.com

css 和 js 的装载与执行

HTML 页面加载渲染的过程

HTML 渲染过程的一些特点

顺序执行、并发加载

css 阻塞和 js 阻塞

依赖关系

js 引入方式

加载和执行的一些优化点

懒加载与预加载

懒加载

预加载

懒加载原生 js 和 zepto.lazyload

需要去监听 scroll 事件,在 scroll 事件的回调中去判断我们懒加载的图片是否进入可视区域。

// 获取可视区域的高度
var viewHeight = document.documentElement.clientHeight

function lazyload() {
    var eles = document.querySelectorAll('img[data-original][lazyload]')
    Array.prototype.forEach.call(else, function(item, index) {
        var rect
        if (item.dataset.original === '') return
        rect = item.getBoundingClientRect()

        if (rect.bottom >= 0 && rect.top < viewHeight) {
            !function() {
                var img = new Image()
                img.src = item.dataset.original
                img.onload = function() {
                    item.src = img.src
                }
                item.removeAttribute('data-original')
                item.removeAttribute('lazyload')
            }()
        }
        })
}

lazyload()

document.addEventListener('scroll', lazyload)

预加载原生 js 和 PreloadJS 实现

重绘与回流

css 性能会让 js 变慢吗?

频繁触发重绘回流,会导致UI 频繁渲染,最终导致js 变慢

什么是重绘与回流

回流

重绘

触发页面重布局的属性

只触发重绘的属性

新建 DOM 的过程

  1. 获取 dom 后分割为多个图层
  2. 对每个图层的节点计算样式结果(Recalculate style--样式重计算)
  3. 为每个节点生成图形和位置(Layout--回流和重布局)
  4. 将每个节点绘制填充到图层位图中(Paint Setup 和 Paint--重绘)
  5. 图层作为纹理上传至 GPU
  6. 符合多个图层到页面上生成最终屏幕图象(Composite Layers--图层重组)

将频繁重绘回流的 DOM 元素单独作为一个独立图层,那么这个 DOM 元素的重绘与回流的影响只会在这个图层中。

如何将 DOM 元素变成新的独立图层?

Chrome 创建图层的条件

避免使用触发重绘回流的 css 属性 将重绘、回流的影响范围限制在单独的图层之内

实战优化点

浏览器存储

cookie

因为 HTTP 请求无状态,所以需要 cookie 去维持客户端状态。

cookie 的生成方式:

  1. 用于浏览器和服务端的交互
  2. 客户端自身的数据存储

过期时间 expire

cookie存储的限制

cdn 域名要和主站域名分开

local storage

session storage

IndexedDB

Service workers 产生的意义

在后台或者其他线程中进行相关的大规模的数据运算和获取,获取了之后将数据返回到主线程,避免主线程被巨大的逻辑阻塞。

PWA

Service Workers

  1. 使用拦截和处理网络请求的能力,去实现一个离线应用
  2. 使用Service Worker 在后台运行同时能和页面进行通信的能力,去实现大规模后台数据的处理

service worker 生命周期

chrome 中检查浏览器中启动的 serviceworker以及内置的

缓存优化

cache-control

expires

Last-Modified/If-Modified-Since

Last-Modified 有什么缺点

ETag/If-None-Match

分级缓存策略

SSR 服务端渲染

多层次的优化方案

Server Side Rendering

with streaming support + component caching