前端性能优化

172 阅读3分钟

从输入url到页面显示发生了什么?

宏观

性能优化:使这里更好更稳定的显现出来

  • DNS 网络协议 域名 -> ip 基于这个ip发一个tcp链接
  • tcp 三次握手、慢启动、超时重发、滑动窗口
  • tcp 协议之上,http/ssl,缓存相关的 Etag
  • 响应解析 SPA SSR(同构)
  • 浏览器渲染 文章:how brower works ?

vue ssr

网络协议

url -> dns获取ip -> 建立tcp -> 解析响应 -> 浏览器渲染 粘包: 等待拼接一下再发送

http ftp ssh

tcp (可靠协议,中间不会少,次序不会乱,稳定有序的传过去 操作系统内置的不用手动发起)/
udp(不可靠,发出去基本就不管了  dns)

udp 速度 > tcp
tcp: 也有一些dns
udp: 视频聊天、语音、dns包比较小不用切分,只需要简单的重发机制

ip寻址
<link rel="dns-prefetch" href="//g.tbcdn.cn">预解析技术,当你浏览网页时,浏览器会在加载网页时对网页中的域名进行解析缓存,这样在你单击当前网页中的连接时就无需进行DNS的解析,减少用户等待时间,提高用户体验

带来的反思?

  • tcp 分片,将一个分成很多个,方便重发并且可以用不同途径发送。
  • 怎么确保分片的大小? -> 慢启动
  • 网络不稳定的情况下,保证数据有序稳定的到达。处理大数据的场景下,可以借鉴tcp优化方法
  • 文件上传可以采用 慢启动 机制,让网络包的大小逐渐匹配网速

基于tcp之上的http协议,如果你只是单纯的发送一些数据,可以不走http, 可以基于tcp之上自己定制client server

http基于tcp, 定制了解析的逻辑

method 地址 http/版本
key:value
key:value

body
GET/http/1.1
host
cookie

怎么用 @next 访问百度?@next 代码实战,静态资源的缓存 前端强相关,工程化

前端到底怎么上线代码的?

小应用:开发完毕,html, css, js 丢nginx

有点数据的应用:开发完毕,模版都在server(smarty, jsp), 静态资源上cdn,否则路程电缆的距离无法优化



先上模版 html 还是先上cdn??
静态资源 contentHash 更好的利用缓存,contentHash是webpack自带的

a_hahs1.js  a_hash2.js  a_hash3.js

文件变了上静态资源 再cdn 再模版

contentHash 解决方案
a?_v=1
a?_t='12337738493'

文件冗余
定期删一次
    
浏览器缓存的逻辑:强缓存、协商缓存

响应

响应报文返回html之后
spa vue/react默认的
同构, 提高首屏渲染速度,有利于seo  vue -> nuxt, next 
   1. 需要node.js环境,应用首屏,先再node里执行渲染一下,返回浏览器
   2. 后续就是单页的逻辑
   
conponent 数据管理 router  两个入口:entry_clint entry_server 
build两个包 给首屏和后续使用

从输入url到页面渲染的时间怎么变短,每一步都有性能指标

浏览器解析html css 执行js

  • 解析html (AST) -> dom tree, html层级不要用太多无意义的层级
  • 解析css -> css tree, css选择器的优化
  • 合并成render tree
  • 浏览器调用操作系统渲染
  • 重绘回流

简单粗暴的优化策略

图片是优化空间最大的,也没有太难的操作

- 文件加载的更少更小
`缓存(主流框架 contentHash 存在)、压缩 cdn(静态资源) 图片优化(简单且收益最高、web fonts解决小图标、图片压缩、图片格式webp) 静态文件优化 浏览器优化 文件合并压缩`

- 代码执行的更少
`设置首屏并发数4 谷歌6, 无限滚动 -> 虚拟滚动`
   节流、防抖(手写)
   按需执行
   回流重绘
   框架优化 -> vue3的静态标记
过度优化是万恶之源

图片优化:图片格式webp 兼容性一般

性能指标

性能指标监控

fp fcp fmp tti(可以交互的时间 @next)

性能优化实操 (指标优化)

lighthouse