zhentonglee / blog

记录成长过程,构建系统的知识体系。
0 stars 0 forks source link

性能优化 #25

Open zhentonglee opened 4 years ago

zhentonglee commented 4 years ago

提升页面性能的方法 1、资源压缩合并,减少HTTP请求 2、非核心代码异步加载 -> 异步加载的方式 -> 异步加载的区别 3、利用浏览器缓存 -> 缓存的分类 -> 缓存的原理 4、使用CDN 5、预解析DNS

异步加载 1、异步加载的方式 动态脚本加载(利用script标签动态创建加载) defer:是在HTML解析完之后才会执行,如果是多个,按照加载的顺序依次执行。 async:是在加载完之后立即执行,如果是多个,执行顺序和加载顺序无关。

浏览器缓存 缓存的分类 1、强缓存(直接用本地缓存,不问服务器) Expires: 服务器绝对时间(弊端:浏览器和服务器时间可能不一致) Cache-Control: max-age=3600 相对时间 以上两个字段同时存在,以后者为准。

2、协商缓存(使用前询问服务器是否过期了) Last-Modified(服务器给的) If-Modified-Since(浏览器带给服务器)两个值相同 (弊端:修改时间变了,但是内容可能没变) Etag(服务器给的) If-None-Match(浏览器带给服务器)两个值相同

image

from memory cache 和 from disk cache,前者指缓存来自内存,后者指缓存来自硬盘

在浏览器接收到服务器响应后,会检测响应头部(Header),如果有Etag字段,那么浏览器就会将本次缓存写入硬盘中。

拉取缓存会出现200、304两种不同的状态码,取决于浏览器是否有向服务器发起验证请求。 只有向服务器发起验证请求并确认缓存未被更新,才会返回304状态码。

配置缓存时一定要切记,浏览器在处理用户请求时,如果命中强缓存,浏览器会直接拉取本地缓存,不会与服务器发生任何通信,也就是说,如果我们在服务器端更新了文件,并不会被浏览器得知,就无法替换失效的缓存。所以我们在构建阶段,需要为我们的静态资源添加md5 hash后缀,避免资源更新而引起的前后端文件无法同步的问题。

----------------------更新---------------------

纯异步渲染

当前主流的 SPA 的应用的默认渲染方式 image

优化:

image

其他优化方法:

直出同构

服务端渲染 image

直出渲染的耗时的大头还是在 CGI 接口的拉取上

接口的动静分离 直出 Redis 缓存

image

参考链接:https://juejin.im/post/5c3ff18b6fb9a04a0a5f76aa

------------------------更新------------------------

参考链接:https://juejin.im/post/5b6fa8c86fb9a0099910ac91

zhentonglee commented 3 years ago

性能指标

FP(首次绘制) FCP(首次内容绘制 First contentful paint) LCP(最大内容绘制时间 Largest contentful paint) FPS(每秒传输帧数) TTI(页面可交互时间 Time to Interactive) HTTP 请求响应时间 DNS 解析时间 TCP 连接时间

性能数据采集需要使用 window.performance API , JS库 web-vitals:import {getLCP} from 'web-vitals';

性能优化常用手段:文件体积、缓存技术、预加载技术、网络传输、渲染方案。

文件体积:tree shaking、路由懒加载、element-ui按需加载、不变的第三方插件抽离成公共文件缓存、gzip压缩、压缩混淆代码

网络传输:CDN部署静态资源

缓存 :主要有 cdn、浏览器缓存、本地缓存以及应用离线包

预加载 :资源预拉取(prefetch)则是另一种性能优化的技术。通过预拉取可以告诉浏览器用户在未来可能用到哪些资源。 prefetch支持预拉取图片、脚本或者任何可以被浏览器缓存的资源。 在head里 添加 preload prefetch

渲染方案: 静态渲染(SR) 前端渲染(CSR) 服务端渲染(SSR) 客户端渲染(NSR):NSR 数据请求,首屏数据请求和数据线上与 webview 的一个初始化和框架 JS 初始化并行了起来,大大缩短了首屏时间。

其他: 使用骨架屏 使用 lazyload 和 placeholder 提升加载体验。

zhentonglee commented 3 years ago

写给中高级前端关于性能优化的9大策略和6大指标 | 网易四年实践 https://juejin.cn/post/6981673766178783262

还在看那些老掉牙的性能优化文章么?这些最新性能指标了解下 https://juejin.cn/post/6850037270729359367

zhentonglee commented 2 years ago

查询缓存 -> 发送请求 -> 等待响应 -> 页面解析 -> 下载并处理各类静态资源 -> 运行时 -> 预加载(等待后续的请求)

https://alienzhou.com/projects/fe-performance-journey/

zhentonglee commented 2 years ago

例如 Polyfill.io 就会根据请求头中的客户端特性与所需的 API 特性来按实际情况返回必须的 polyfill 集合。

https://polyfill.io/v3/polyfill.min.js?features=Promise%2CReflect