- 用户体验方面的优化
- 首屏加载优化 FCP
- 使用懒加载
- 动态加载
- 按需加载
- 使用骨架屏
- 使用缓存
- 本地缓存 web storage
- http 缓存
- cdn 缓存
- 资源压缩
- 图片压缩
- 打包后的静态资源压缩
- 使用 compress-webpack-plugin
- 开启 gzip 压缩
- http网络传输中,服务端配置Gzip 压缩来对数据进行压缩,浏览器接收到压缩的响应后会自动解压
- express 开始 Gzip 压缩的方式
- 使用SSR
- 使用懒加载
- 首屏加载优化 FCP
- 代码层面的优化
- 图片优化
- 图片压缩
- 打包过程中,使用 image-webpack-loader 压缩
- 使用 tinypng 压缩
- 合理选择图片格式
- 使用 jpeg/jpg 格式的图片
- 24 位存储单个图,可以呈现多达 1600 万种颜色
- jpeg 有损压缩
- 多用作大背景图、轮播图、banner
- 不适合做 logo 等线条感强、颜色对比强烈的图片,会模糊
- 不支持透明处理
- 使用 png
- 支持 8 位和 24 位,8 位的 PNG 最多支持 256 种颜色,而 24 位的可以呈现约 1600 万种颜色。
- 无损压缩
- 支持透明度
- 体积大
- 色彩表现力强,对线条的处理更加细腻
- 可用于小 logo、颜色简单且对比强烈的图片或背景
- 使用 gif
- 最多支持 256 种颜色的 8 位
- 无损压缩
- 文件体积很小
- 支持透明
- 支持动图
- 适合展示一些无限循环的动画,表情、图标
- 只适合简单色彩的图片
- webp
- 可以支持丰富的图片细节
- 支持有损压缩和无损压缩
- 支持透明
- 支持动图
- 集万千优点于一身
- 文件体积小
- 兼容性不太好
- 使用 jpeg/jpg 格式的图片
- 使用雪碧图
- 就是 css Sprites ,是一种 css 图片合成技术,用于展示小图片
- 把小图片合成大图片,使用 background-position 定位
- 减少多个图片的 http 请求
- 是用于页面图片多且丰富的场景
- 缺点是生成的图片体积较大,减少了请求的同时增加了图片大小,不合理拆分将不利于加载
- 使用 webpack-spritesmith / postcss-sprites 生成雪碧图
- 使用 iconfont 字体图标
- 通过字体的方式展示图标,用于渲染图标,简单图形,特殊字体
- 可以设置大小、颜色、样式,不失真
- 轻量,易修改
- 减少 http 请求次数
- 可以使用 iconfont 字体库
- 使用 svg 图标字体
- 类似 iconfont
- 以矢量形式显示图标,并可以通过 css 来控制样式和颜色
- 图标的分辨率不会受限于字体大小,因为是矢量图
- 相同的图标不同的颜色只需要一个svg图片
- 更加灵活,可以使用css/js进行更复杂的动态效果和交互操作
- 可以学习svg 原理
- 使用 base64 格式
- 将图片转成 base64 格式,以字符串的形式在 css 中使用
- 减少 https 请求
- 方便在样式中引用,写个样式放入全局的css文件中即可,因为是一个字符串
- webpack 中 url-loader 的 limit 字段,表示小于配置的文件都转成 base64
- base64 的本质是 DataURL
- 使用 cdn 缓存
- 图片懒加载
- 只请求可视区域的图片
- 暂时不设置 img 的 src 属性,注意不赋值 src 就不会发起 http 请求
- 而把图片 url 存放在data-src中
- 图片到了可视区域再给 src 赋值,才发起网络请求
- 判断是否到可视区域
- 可以监听 scroll 时间,根据 scrollTop、offsetHeight 等属性计算
- 可以使用 intersectionObserver 监听
- 图片预加载
- 提前加载图片资源
- 使用 js
- new Image 创建对象,然后赋值 src
- 可以监听 load 事件,在图片加载完之后执行对应操作
- 可以在页面window.onload 后再加载,不会影响页面的加载
- 当其他地方使用同一个图片时,会使用浏览器的缓存
- 使用 css 隐藏预加载图片
- 通过c ss 的 background 属性,将图片与加载到屏幕外的背景上
- 当其他地方使用同一个图片时,会使用浏览器的缓存
- 但是加载的图片会同页面的其他内容一起加载,增加页面的整体加载时间
- 响应式图片加载
- 根据不同分辨率的设备显示不同尺寸的图片
- 使用媒体查询,媒体查询可以根据不同的条件,选择加载合适的图片资源
- 使用 h5 的 picture 属性进行响应式处理
- picture 标签
- 内放置多个source标签,指定不同图片
- 根据 media 指定不同的现实条件
- 兼容不太好
- 渐进式图片
- 先显示一张模糊的图,然后逐步替换成清晰的图
- 模糊的图尺寸小,加载快
- 图片压缩
- js 代码优化
- 将非必要脚本script标签放到body底部
- 如果不设置 async/defer 放在 head 的 script 会阻塞 html 解析/渲染
- 脚本异步加载
- async 异步加载,加载完执行,会阻塞 html 解析,多个脚本按照加载顺序执行
- defer 异步加载,加载完等 html 解析完再执行,不会阻塞 html 解析,多个脚本按顺序执行
- 使用 web workers 执行 js 脚本
- 脚本压缩
- 使用 compression-webpack-plugin 减小文件大小
- 使用 keep-alive等缓存
- 使用v-show代替v-if(看情况)
- 使用 节流/ 防抖
- 图片懒加载
- 组件动态/按需导入
- 减少 cookie 大小
- 引入资源的域名不要包含 cookie
- 将非必要脚本script标签放到body底部
- css 优化
- 资源压缩
- 打包过程中 compression-webpack-plugin 压缩文件
- css-minimizer-webpack-plugin 压缩优化
- 打包过程中 purgecss-webpack-plugin 对css 进行 tree-shaking
- 首屏使用内联样式
- 异步加载 css
- 如果js 中有对样式的引用,那么 css 会阻塞渲染
- link 不会阻塞解析,但是会阻塞渲染
- 合理使用选择器
- 减少嵌套层级,最好不好超过3层
- 使用 id 选择器就没必要再进行嵌套
- 通配符和属性选择器效率低,少用
- 避免使用 !important
- 尽可能精简
- 使用语义话的名字,BEM规范命名
- 避免后代选择器
- 避免链式选择符
- 样式隔离
- 内联样式
- css-in js
- 模块化 css 文件
- css 作用域隔离,使用 scope
- 减少使用昂贵的属性
- box-shadow /b
order-radius
/filter等
- 页面发生重绘的时候,昂贵属性会降低性能
- box-shadow /b
- 使用 gpu 加速
- css3 动画使用 transform 和 opacity / filter/animation/transition,不适用 left ,top 等
- 前者是硬件加速,浏览器有专门的合成线程
- 不要使用 @import
- 会增加额外的延迟
- 多个 @import 会导致下载顺序紊乱
-
比如一个css文件
index.css
包含了以下内容:@import url("reset.css")
那么浏览器就必须先把
index.css
下载、解析和执行后,才下载、解析和执行第二个文件reset.css
-
减少重排和不必要的重绘
-
cssSprite 合成icon,
-
多个小图标或按钮合并成一张大图,并使用 CSS 的 background-position/background-image/background-repeat 属性将相应的图标或按钮定位到正确的位置上
-
可以减少 http 请求次数
-
-
把小的 icon 图片转成 base64 编码
- 资源压缩
- 图片优化
-
请求服务相关的优化
-
减少http请求
-
使用 http2
-
h2 相对于 http1.1 没有并发限制
-
但是浏览器可能会做一些限制
-
对操作系统资源的考虑
-
过多并发导致线程频繁切换产生性能问题
-
避免统一客户端发送大量请求超过服务器的并发阈值 【DDOS 攻击】
-
-
-
开启 http 使用缓存
-
强缓存
-
协商缓存
-
-
服务端开始 gzip 压缩
-
减少 DNS 查询
-
减少 iframe 数量
-
使用 CDN
-
- 使用 webpack 等构建工具优化性能
-
代码分割
-
代码压缩
-
图片/资源大小压缩
-
tree-shaking
-
一篇文章总结所有的前端性能优化方案/优化场景/优化指标
于 2023-02-23 10:04:16 首次发布