温故知新丨性能优化

231 阅读4分钟

CSS和JS的加载与执行

HTML页面的加载

  • 解析html请求
  • html自上至下词法分析DOM树
  • token
  • 并发加载静态资源,JSV8引擎执行,CSS资源浏览器渲染CSS树
  • 最后渲染

特点:

  • 顺序执行,并发加载上限,多个cdn域名,防止并发资源太多
  • 是否阻塞,CSS---JS
  • 依赖关系,JS的执行顺序
  • 引入方式:2个css,4个JS

CSS阻塞

  • CSS head中阻塞页面渲染
  • CSS 阻塞js执行
  • CSS 不阻塞外部脚本的加载

JS渲染

  • 直接引用JS阻塞页面的渲染
  • JS不阻塞资源的加载
  • JS顺序执行,阻塞后续js逻辑的执行

懒加载与预加载

懒加载

  • 图片进入可视区域之后请求资源
  • 页面长适用
  • 减少无效资源的加载
  • 并发加载的资源过多会阻塞JS的加载,影响网站的正常使用

预加载

  • 图片等静态资源在使用之前的提前请求
  • 资源使用奥是可以从缓存中加载,提升用户体验
  • 页面展示的依赖关系维护

重绘与回流

  • 一个线程js解析,一个线程UI渲染
  • 频繁的触发重绘与回流,会导致UI频繁渲染,导致js变慢
  • 重绘不一定回流,回流一定重绘

回流

  • 页面布局变化,元素大小变化
  • 当render tree中的一部分(或全部元素)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建,就是回流
  • 当页面布局和几何属性改变时就需要回流

重绘

  • 当render tree中的一些元素需要更新属性,而这些属性只影响元素的外观,风格,而不会影响布局,比如:背景,则叫做重绘
  • 外观属性变化

触发回流

  • 盒模型,定位属性及浮动,节点内部文字结构

触发重绘

如何避免

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

浏览器存储

Cookie

  • 初衷:cookie去维持客户端状态
  • set-cookie提取cookie并存储
  • 服务端通知客户端保存这个数据
  • document.cookie可以读写cookie
  • 作用:1.用于浏览器端和服务器端的交互 2.客户端自身存储数据
  • 大小只有4kb,需设置过期时间expire
  • httponly不支持js的读写,安全性的保证
  • cookie中在相关域名下---cdn的流量损耗区文化课:解决方法———CDN的域名和主站的域名分开

LocalStorage

  • html5设计的专门用于浏览器存储
  • 5M
  • 尽在客户端使用,不和服务器通信
  • 借口封装好,读写操作
  • 浏览器本地缓存方案

SessionStorage

  • 会话级别的浏览器存储
  • 5M
  • 仅在客户端使用,不和服务端进行通信
  • 接口封装好
  • 用于表单信息的维护

indexedDB

  • 存储大量结构化数据
  • 创建应用离线版本

PWA

  • 可靠:在没有网络环境中也能提供基本的页面访问,而不会出现‘没有连接到互联网’的页面
  • 快速:针对网页渲染及网络数据访问有较好的优化
  • 融入:应用可以被增加到手机桌面,并且和普通应用一样有全屏,推送等特性

缓存

  • httpheader

Cache-Control

  • max-age:缓存时间,在这段时间不用访问服务器
  • s-maxage:从cdn中拿public数据,公共数据的过期时间,优先级高于max-age
  • private:私人缓存
  • public:公共数据
  • no-cache:不会在浏览器直接读相关缓存,而是发请求到服务端进一步判断缓存是否过期
  • no-store:不使用缓存

Expires

  • 缓存的过期时间,用来指定资源的过期时间,服务端具体的时间点
  • 告诉浏览器在过期时间前,浏览器可以直接从浏览器缓存取数据,而无需再次请求
  • max-age 相对优先级更高

last-modified/if-modified-since

  • 文件版本时间,未更改就是304,更改了返回200
  • 协商缓存机制,可以去取到一个最新的更改,而不是直接读缓存
  • 如果有max-age,则max-age优先级更高
  • 缺点:1.某些服务端不能取得精确的修改时间 2.文件修改时间改了,可是内容没有修改,也会造成缓存失效

Etag/If-None-Match

  • 有一个文件内容的hash值,文件内容改变hash才会改变
  • 返回的ETag与之对比If-Node-Match

分级缓存策略

  • 200状态(from cache) 由expires/cache-control控制

服务端性能优化

  • 复杂运算可以用node.js代替
  • vue-ssr

多层次的优化方案

  • 构件层模板编译webpack构建
  • 数据无关的prerender的方式
  • 服务端渲染

服务端渲染