Vue 首页秒开实践指南

news/2024/7/10 2:51:02 标签: java, vue, javascript, web, 编程语言

前端性能优化一直是衡量一个团队和一个前端的各方面水平,呈现快速的加载,是给人最直观,成就感也最足的一个感受,而且对用户体验是第一重要的概念,所以这个相当重要,现就来结合美团的实践方案来讨论一下。

以下一段转载自:美团技术团队分享

自JavaScript诞生以来,前端技术发展非常迅速。移动端白屏优化是前端界面体验的一个重要优化方向,Web 前端诞生了 SSR 、CSR、预渲染等技术。前端服务端渲染、后端服务端渲染等。

在美团支付的前端技术体系里,通过预渲染提升网页优化,从而优化了白屏问题,提升用户体验,并形成了最佳实践。

在前端渲染领域,主要有以下几种方式可供选择:

通过对比,同构方案集合 CSR 与 SSR 的优点,可以适用于大部分业务场景。

结合到我们团队负责的支付业务场景里,在保证系统稳定性的前提下,还需要保障用户体验,所以采用了预渲染的方式。

那么究竟什么是预渲染呢?我们先从最常见的 CSR 开始说起。

以 Vue 举例,常见的 CSR 形式如下:

一切看似很美好。然而,作为以用户体验为首要目标的我们发现了一个体验问题:首屏白屏(SPA都会遇到的问题)

为什么会首屏白屏

浏览器渲染包含 HTML 解析、DOM 树构建、CSSOM 构建、JavaScript 解析、布局、绘制等等,大致如下图所示:

要搞清楚为什么会有白屏,就需要利用这个理论基础来对实际项目进行具体分析。通过 DevTools 进行分析:

  • 等待 HTML 文档返回,此时处于白屏状态。

  • 对 HTML 文档解析完成后进行首屏渲染,因为项目中对加了灰色的背景色,因此呈现出

    灰屏。

  • 进行文件加载、JS 解析等过程,导致界面长时间出于灰屏中。

  • 当 Vue 实例触发了 mounted 后,界面显示出大体框架。

由此得出,因为要等待文件加载、CSSOM 构建、JS 解析等过程,而这些过程比较耗时,导致用户会长时间出于不可交互的首屏灰白屏状态,从而给用户一种网页很“慢”的感觉。


优化思路

在User-centric Performance Metrics一文中,共提到了4个页面渲染的关键指标:

基于这个理论基础,再回过头来看看之前项目的实际表现:

可见在 FP 的灰白屏界面停留了很长时间,用户不清楚网站是否有在正常加载,用户体验很差。

通过对比 FP、FCP、FMP 这三个时期 DOM 的差异,发现区别在于:

  • FP:仅有一个 div 根节点。

  • FCP:包含页面的基本框架,但没有数据内容。

  • FMP:包含页面所有元素及数据。

仍然以 Vue 为例, 在其生命周期中,mounted 对应的是 FCP,updated 对应的是 FMP。那么具体应该使用哪个生命周期的 HTML 结构呢?

通过以上的对比,最终选择在 mounted 时触发构建时预渲染。

构建时预渲染方案

构建时预渲染流程:

配置读取

由于 SPA 可以由多个路由构成,需要根据业务场景决定哪些路由需要用到预渲染。因此这里的配置文件主要是用于告知编译器需要进行预渲染的路由。

在我们的系统架构里,脚手架是基于 Webpack 自研的,在此基础上可以自定义自动化构建任务和配置。

触发构建

项目中主要是使用 TypeScript,利用 TS 的装饰器,我们封装了统一的预渲染构建的钩子方法,从而只用一行代码即可完成构建时预渲染的触发。

TS的装饰器:

使用:

为了提高构建效率,并行对配置的多个页面或路由进行预渲染构建,保证在 5S 内即可完成构建,流程图如下:

我们梳理一下简化后的项目上线过程:

开发 -> 编译 -> 上线

构建时预渲染研发流程及效果

最终,构建时预渲染研发流程如下:

开发阶段:

  • 通过 TypeScript 的装饰器单行引入预渲染构建触发的方法。

  • 发布前修改编译构建的配置文件。

发布阶段:

  • 先进行常规的项目构建。

  • 若有预渲染相关配置,则触发预渲染构建。

  • 通过预渲染得到最终的文件,并完成发布上线动作。

完整的用户请求路径如下:

通过构建时预渲染在项目中的使用,FCP 的时间相比之前减少了 75%。

从此我们再也不受第一屏很慢的困扰了。并且可行性很好,也可以让其他有需求的一起实践。


http://www.niftyadmin.cn/n/1251796.html

相关文章

webstorm打开网页_webstorm打开的html页面与本地打开的同一个html样式显示不一样

同样的一个页面,使用webstorm自带的服务器打开,和在本地打开后显示的样式不一样不知道是什么原因,请大神指点。原代码:Document* {padding: 0;margin: 0;}.father {width: 1000px;height: 560px;margin: 0 auto;background: url(i…

java 序列化 内部类,序列化内部类实例

Is it possible to serialize a non Static Inner class?If yes can you provide a good example.I googled through few blogs and sites non of answer convinced me.EDIT:How about the inner class having final staic variable.解决方案Inner class contains an implicit…

漫画 | 人到中年,一地鸡毛

点击上方“蓝色字体”,选择“设为星标”做积极向上的前端人!今天这篇漫画,纯属虚构,虚构中又还有一点点真实,真实的反映大部分人(不仅仅程序员)中年的生活与无奈.事故主人公:大刘/某…

ios去掉字符串中的某个字符_IOS开发入门iOS 去除字符串中的H5标签 iOS去掉字符串中特殊字符...

本文将带你了解IOS开发入门iOS 去除字符串中的H5标签 iOS去掉字符串中特殊字符,希望本文对大家学IOS有所帮助。iOS去除字符串中的H5标签。当我们从后台获取一个带有H5标签的字符串的时候,我们将其正常显示了,但是如果字符串过长我们要求进行根…

基于 Vue 的前端架构,我做了这 15 点

作者:codexuhttps://juejin.cn/post/69014669944789401681.分解需求技术栈考虑到后续招人和现有人员的技术栈,选择 Vue 作为框架。公司主要业务是 GIS 和 BIM,通常开发一些中大型的系统,所以 vue-router 和 vuex 都是必不可少的。…

自学js第十五天:event坐标偏移量位置和window对象

一.Event对象集合中的鼠标按下或者点击时的相对位置:!元素的自身位置 1.鼠标event对象给我们展示了 client / offset / page / screen系列的X Y坐标 可以用于在不同需求下获取用户鼠标的相对位置.(相对于各种参考物体的位置) 2.首先先了解鼠标event其实是一个事件对象集合来的,…

来一起用 Vue3.0 做个飞机大战游戏

现在但凡出去面试,面试官几乎必问 Vue3.0 。不仅会问一些核心特性,还会问原理层面的问题。比如:▶框架层面问题:Vue3.0 新特性 Composition API 与 React.js 中 Hooks 的异同点?▶源码、原理层面问题: Vue3…

android 编译 java文件_Android 编译时代码生成技术探究 二 JavaPoet生成 .java源文件的Java API...

https://github.com/979451341/TestAPT这篇说如何生成Java文件,所使用的就是JavaPoet这个API提供的代码,让我们来学习如何去使用它。1.添加定死的代码比如我想要生成如下代码的java文件package com.example;public final class TestClass {void main() {…