前端性能优化-传输过程

548 阅读4分钟

1.启用Gzip

用nginx对除了图片的资源开启传输层的压缩

2.启用keep-alive

http的keep-alive 我们对tcp连接进行复用 比如我们连接一个服务器 我们就可以复用tcp连接 如果连接量大的话 很好用 有益无害 http1.1之后默认开启

瀑布流的intial connect 默认情况下keep-alive会开启 一般对同一台服务器的请求 只有第一个请求有intial connect 其他都复用

image-20210601204811289

可以在requestheaders里面看到connection:keep-alive

image-20210601205211187

也可以在ngix里面配置开启不开启keep-alive

维护tcp连接也有开销 所以keep-alive不是越长时间越多越好

3.http缓存 减少网络开销

image-20210601205642536

强制缓存/协商缓存

ngnix做配置

html文件:不做缓存 因为单页应用html很重要 所以每次都是最新的

cache-control:no-cache表示没有缓存 expires:0即没有过期时间

image-20210601205904217

css/js文件:强制设置时间为7天,但是我们webpack本来就有contenthash作为文件标识 当内容变化啦 我们文件旧变化啦 之前的名的文件的过期时间就没用啦 相当于一个新的文件设置7天的过期时间

image-20210601210125532

图片文件:一般可以设置长点

image-20210601210351708

天猫官网的设置:

image-20210601210919305

max-age=0:表示立即失效 不要缓存

s-maxage=109:是给中间代理服务器的缓存

知乎的:

image-20210601211122080

public:表示中间代理服务器可以缓存 private表示不需要中间代理服务器缓存 我们不可以获取代理服务器上的文件缓存

no-store:完全强制让缓存失效 我不关心文件有没有发生变化 我一致要去服务器上拿数据 之前的no-cache文件不变的话还是可以有304的文件不变读取缓存 这个全是200 所以就没有etag这种判断文件有没有变化过期这种头部啦 之前如果tag一样的话是返回304用缓存的

must-revalidate:表示我们需要重新和服务器确认资源有没有过期

谷歌的:

image-20210601211638120

浏览器这一端建立一个serviceworker缓存

虽然设置了no-cache,revalidate表示要和服务器去确认资源是不是最新,但是没真正到服务器 而是到servive-worker,直接告诉你命中缓存啦 因为默认是public 是可以中间层缓存的

image-20210601211917201

强缓存:设置这两个头部

Expires:过期时间,如果设置了时间,则浏览器会在设置的时间内直接读取缓存,不再请求

Cache-Control:当值设为max-age=300时,则代表在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。 max-age:用来设置资源(representations)可以被缓存多长时间,单位为秒;

4.serviceWorker

1.加速重复访问

2.离线支持:我们可以离线情况下也能让用户进行访问,资源可以从缓存里面拿

react工程里面自动就有service-worker,对应的webpack也有相关的配置

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

serviceworker会缓存所有需要的资源 这一层在客户端 当没服务端的时候会直接从这一层获取

image-20210601213101229

缺点:

1.延迟首屏加载时间 但是整体时间会缩小

2.兼容性问题

3.只能在localhost和https下使用

5.http2的提升

适合请求多的项目

使用https才能使用http2

https需要开启ssl 即安全证书 ssl-certificate(安全证书)ssl-certificate-key是私钥

image-20210601214338758

1.多路复用:

image-20210601214933447

http1.1:虽然我们可以用keep-alive减少建立连接的时间 但是我们的资源还是串行的一个一个请求的

image-20210601215122472

http2:实现啦真正的并行请求和多路复用,不同资源可以并行发起请求然后一起返回回来 ,且图片请求多个可以减少为一个请求

2.服务器推送

image-20210601215325378

服务器可以提前把这些资源推送到浏览器端,浏览器把他们放到缓存里 当他们要使用的时候就读取缓存里的

image-20210601215459980

优势总结1.二进制传输(http1传输的是文本 http2传输的二进制 更快和安全) 2.多路复用 3.server push 4.头部进行压缩 保证更快

6.ssr渲染

1.加速首屏渲染

2.更好的seo

image-20210601215950782

客户端渲染:我们需要先请求页面 然后再去加载相关的js解析 然后再去看到内容

服务端渲染 我们拿到的页面已经是现成的页面啦 直接看到内容 不要加载js啦 且更好seo 因为内容已经有了 总之 你的项目是需要去加载很多东西的用服务端渲染会加快很多 因为已经加载好了,比如你要去加载动画 读取数据库之类的

seo也可以前面采用静态的页面 后面采用react 这样提高seo