# 优化方案初探

# 从PNG到IconFont

  • 多个图表 -> 一套字体,减少获取时的请求数量和体积

  • 矢量图形,可伸缩

  • 直接通过CSS修改样式(颜色,大小等)

# 从IconFont到SVG

  • 保持了图片能力,支持多色彩

  • 独立的矢量图形

  • XML雨大,搜索引擎SEO和无障碍读屏软件读取

# Flexbox优化布局

# Flexbox的优势

  • 更高性能的实现方案

  • 容器有能力决定子元素的大小、顺序、对齐、间隔等

# 优化资源加载顺序

  • preload:提前加载较晚出现,但对当前页面非常重要的资源

  • prefetch:提前加载后继路由需要的资源,优先级低

# preload

Preload 来告诉浏览器预先请求当前页需要的资源,从而提高这些资源的请求优先级。比如,对于那些本来请求优先级较低的关键请求,我们可以通过设置 Preload 来提升这些请求的优先级。合理的安排优先级可以提升网站的性能,比如我们可以优先字体资源的下载

# prefetch

Prefetch 来告诉浏览器用户将来可能在其他页面(非本页面)可能使用到的资源,那么浏览器会在空闲时,就去预先加载这些资源放在 http 缓存,最常见的 dns-prefetch.

从加载优先级上看,Preload 会提升请求优先级;而Prefetch会把资源的优先级放在最低,当浏览器空闲时才去预加载。

# 预渲染

如果觉得 SSR 或者同构方案成本太大,可以考虑使用 预渲染,使用也是非常简单 react-snap (opens new window)

# 预渲染的作用

  • 大型单页应用的性能评级鞥:JS下载+解析+执行

  • SSR的主要问题:牺牲TTFB来不就First Paint;实现复杂

  • Pre-rendering 打包时提前渲染页面,没有服务端参与

# windowing(窗口化)提高列表性能

在遇到大量的列表渲染时,我们可以使用窗口化技术,在一定的区域内只显示一定的DOM元素,提高列表性能。 比较成熟的有 React-virtualized ,这里强烈推荐 react-window (opens new window),配合 AutoSize (opens new window)

# 使用骨架组件

骨架屏可以理解为是当数据还未加载进来前,页面的一个空白版本,使用骨架屏进行预先的占位,降低了用户的焦躁情绪,使得加载过程主观上变得流畅。在这里推荐使用 react-placehold (opens new window),也可以按照自己的布局进行自定义

# 首屏优化

# 分析

  • Web增量加载的特性决定了首屏性能不会完美

  • 过长的白屏影响用户体验和留存

  • 首屏(above the fold) -> 初次印象

# 主要分为

  • css,js 文件获取 阻塞
  • js 文件解析
  • dom 生成
  • cssom 生成

# 优化

# 资源体积太大?

资源压缩、传输压缩、代码拆分,Tree shaking, HTTP/2,缓存

# 首页内容太多?

路由/组件/内容 lazy-loading ,预渲染/SSR, Inline CSS

# 加载顺序不合适?

prefetch,preload