前端性能优化
减少http请求
使用http2.0
使用ssr服务端渲染
SSR
可以让首屏加载更快,带来更好的SEO
前端基本上现在都是
SPA
单页应用,单页应用的缺陷就是首屏加载很慢。使用SSR
服务端渲染可以带来更好的SEO
,SEO
就是搜索引擎优化,搜索引擎就是爬虫,可以更好的爬数据- vue官网ssr
- Nuxt.js
合理使用cdn
将css放在文件头部,将js放在文件底部
使用精灵图/ 雪碧图, 减少请求次数
善用http缓存:强缓存&协商缓存
二者都是后端控制的东西,强缓存是响应头添加
'Cache-Control': 'max-age=xxx'
字段,max-age
是过期时间,强缓存后无法缓存输入url
后的get
请求,想要缓存这个请求需要靠协商缓存来实现,协商缓存的实现是在强缓存的基础上添加一个'Last-Modified': stats.mtimeMs
或者etag
字段,若检查到前端返回的If-Modified-Since
时间一致,后端就返回304
状态码给前端,浏览器就从缓存中读取静态资源其他
- 首屏速度优化(SPA)——静态资源体积(tree-shaking、gzip)、异步引入、延迟加载
- 大量数据 渲染优化——一次渲染一部分;分页处理
- 用户体验优化——骨架屏、loading、页面状态缓存;搭配首屏加载
- 组件可扩展性和易用性能优化
- 错误处理 - 优化接口的出错处理,并发处理。让页面响应更快,体验更加
压缩文件
懒加载
懒加载的实现需要获取到可视区范围的高度,以及每张图片的高度,监听用户滚动的过程中图片是否进入范围内,进入时才赋值 src
, src
只要有值就一定会发送 http
请求,此前存放 src
的属性可以任意取名,当然一般我们取名为 data-
前缀,比如下面这样
尽量使用css,字体来代表图片
使用webp格式的图片
webp
格式的图片是谷歌推出的,这种格式的图像压缩算法能力要优于传统的 jpg
, png
等格式,在相同图片质量的情况下,空间大小会优化 30% 左右的样子
关于图片的性能优化就是小图用雪碧图,大图用 webp
格式
- webpack:tree-shaking | 打包文件名 + hash
tree-shaking
的作用就是帮我们把项目中无用的代码给找出来,比如我们调试用的 console.log
,其实 console.log
对浏览器的开销还是蛮大的
- 尽量减少回流重绘
输入url到页面渲染后半段:回流,重绘,优化
回流(重排)就是计算布局,重绘就是给页面上色
- 尽量不用 js 去直接修改 css
1 | // 案例一 |
- 合理使用事件委托
事件委托的机制是借助冒泡机制,把原本需要批量操作子组件的操作代理到一个父组件上
- if-else & switch
if-else
有个判断顺序的,一定是从上往下走逐个走到目标,每次都判断一下,浪费性能。而 switch
不然, switch
是直接命中目标,只有一次判断
if-else
会更加灵活,但是性能又没有 switch
来得好
动画效果: requestAnimationFrame避免页面卡顿
Web Worker 开启多线程
js默认情况下是单线程,但是v8引擎执行js的时候是可以多开辟线程,像页面上的图片有水印一般都是页面加载的时候实现,而非图片就有水印,像这种操作就是交给另一个线程来实现的(postMessge和
onmessge )
- css选择器复杂性要低
浏览器读取css是从右往左读,尽量给每个标签打上类名,不要通过多层父容器
- 尽量使用弹性布局
flexbox性能会比较好
首屏加载速度
首屏速度
- 白屏时间
- 资源加载时间(占比最大)
- 首屏js执行
- 渲染页面 (SSR 项目发生在服务器端,可以提升页面加载速度和用户体验,同时也有利于SEO)
- 首屏数据请求
- Dom渲染
解决:最大效果就是 减少首屏资源体积(打包工具压缩,异步加载,懒加载)
打包 工具压缩:tree-shaking,按需引入,按需打包,减少打包体积
- 白屏时间
操作速度以及渲染速度
造成操作卡顿渲染慢 原因:
- 一次性操作大量的dom (例如页面操作大量数据表格tr)
解决:长列表渲染和异步渲染
进行了复杂度很高的运算 (常见于循环)
vue或react项目中,渲染太多不必要的元素
解决:Vue中有依赖手机,配合vue3的静态节点标记,已经基本避免了因为数据改变引起的无意义渲染
- 频繁切换使用v-show ,否则使用v-if
- 循环,动态切换内容可以加key值
- keep-alive缓存
- 区分请求颗粒度,减少请求范围
- 不变数据,定期失效可以缓存在cookies或者localstorage中,比如token,用户名
- 可以考虑做一个缓存队列,存于内存中(全局对象,vuex)。这样能保证刷新就更新数据,也能一定程度上缓存数据