其中在页面渲染以及网络请求响应的性能优化方面,我们分别可以做哪些优化工作?
页面渲染
在页面渲染方面的性能优化: (1)防止阻塞渲染
将 css 文件放在首部,提前加载。通常情况下 CSS 被认为是阻塞渲染的资源,在 CSSOM 构建完成之前,页面不会被渲染,放在顶部让样式表能够尽早开始加载。 将 js 文件放在底部,防止阻塞 html 的解析。 (2) 减少重绘和回流
将动画效果应用到 position 属性为 absolute 或 fixed 的元素上,避免影响其他元素的布局,这样只是一个重绘,而不是回流 CSS3 硬件加速(GPU 加速) js 尽量少访问 dom 节点和 css 属性 还有很多,可以参照谈谈什么是重绘与回流,以及怎么优化
网络请求方面的性能优化:
(1)静态资源
拼接、合并、压缩、制作雪碧图:减少 http 请求数和减少包体积
拼接、合并、压缩: 在现代的前端工程化开发流程中, 使用 webpack 或者 gulp 等打包工具对资源(js、css、图片等)进行打包、合并、去重、压缩。
雪碧图:对于图片资源,可以制作雪碧图,将页面上的小图标集成到一张图片上。有利于减少图片的请求数,降低网络延迟。
CDN 资源分发 将一些静态资源文件托管在第三方 CDN 服务中,一方面减少服务器压力;另一方面,CDN 优势在于能够实时地根据网络流量和各节点的连接、负载状况以及用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上,保证资源的加载速度和稳定性。
缓存 缓存的范围很广:DNS 解析缓存、代理服务器缓存、客户端的浏览器本地缓存、服务器端的缓存
分片:将资源分布到不同的主机。为了突破同一台主机建立 tcp 连接的数量限制,一般是 6~8 个。现代网站的资源数量有 50 ~100 个很常见,将资源分布到不同主机上,可以建立更多的 tcp 请求,降低请求耗时,从而提升网页速度。
升级协议 升级网络协议,例如使用 HTTP2.0 代替 HTTP1.1
(2)业务数据
首屏直出 首屏渲染速度对于提升用户体验很重要。所以用户进来的页面,可以使用 SSR 服务器渲染)方式来加快首屏渲染的速度。 接口合并 代理服务器实现请求合并,即后台的接口只需要保证健壮和分布式,而由 nodejs(当然也可以使用其他语言)建设一层代理中间层,流程如下图所示:
前端只需要按找约定的规则,向代理服务器发起一次请求,由代理服务器向接口服务器发起三次请求,再将目标数据返回给客户端。这样做的好处是:一方面是代理服务器代替前端做了接口合并,减少了前端的请求数量;另一方面代理服务器可以脱离 HTTP 的限制,使用更高效的通信协议与服务器通信;