前端vite+vue3——可视化页面性能耗时指标(fmp、fp)

这篇具有很好参考价值的文章主要介绍了前端vite+vue3——可视化页面性能耗时指标(fmp、fp)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


vue3 flushjobs耗时几秒,web站点,前端,javascript,vue,性能优化

⭐前言

大家好,我是yma16,本文分享关于 前端vite+vue3——可视化页面性能耗时(fmp、fp)。

fmp的定义

FMP(First Meaningful Paint)是一种衡量网页加载性能的指标。它表示在加载过程中,浏览器首次渲染出有意义的内容所花费的时间。有意义的内容指的是用户可以看到和交互的元素,如文本、图片、按钮等。

首次渲染的定义可以根据具体的要求和场景而有所不同。通常情况下,首次渲染是指在页面加载过程中,浏览器首次绘制出用户能够理解和识别的内容,而不是空白页面或加载指示符。

FMP的计算方法可以根据不同的标准和工具而有所差异,但通常会考虑页面上可见的内容和用户可交互的元素。在计算FMP时,一般会排除一些延迟加载的元素,如懒加载的图片或动态加载的内容,以确保测量的是真正有意义的渲染时间。

fp的定义

FP(First Paint)是指浏览器首次将像素渲染到屏幕上的时间点

传统性能指标 Performance
Performance 接口可以获取到当前页面中与性能相关的信息
vue3 flushjobs耗时几秒,web站点,前端,javascript,vue,性能优化

performance 参数解析
domLoading: 浏览器即将开始解析第一批收到的 HTML 文档字节,Document.readyState 变为 loading。

domInteractive: 当前网页 DOM结构结束解析、开始加载内嵌资源的时间点。Document.readyState 变为 interactive。

domContentLoadedEventStart: 当解析器发送 DomContentLoaded 事件,所有需要被执行的脚本已经被解析。

domContentLoadedEventEnd: 所有需要立即执行的脚本已经被执行。

domComplete: 当前文档解析完成, Document.readyState 变为 complete。

loadEventStart: 作为每个网页加载的最后一步,浏览器会触发 load 事件,以便触发额外的应用逻辑。如果这个事件还未被发送,它的值将会是 0。

loadEventEnd:load 事件执行完成。如果这个事件还未被发送,或者尚未完成,它的值将会是 0。

vue3 flushjobs耗时几秒,web站点,前端,javascript,vue,性能优化

💖vue3系列文章

vue3 + fastapi 实现选择目录所有文件自定义上传到服务器
前端vue2、vue3去掉url路由“ # ”号——nginx配置
csdn新星计划vue3+ts+antd赛道——利用inscode搭建vue3(ts)+antd前端模板
认识vite_vue3 初始化项目到打包
python_selenuim获取csdn新星赛道选手所在城市用echarts地图显示
让大模型分析csdn文章质量 —— 提取csdn博客评论在文心一言分析评论区内容
前端vue3——html2canvas给网站截图生成宣传海报
vue3+echarts可视化——记录我的2023编程之旅
前端vite+vue3——自动化配置路由布局

⭐可视化fmp、fp指标

由于vue是SPA(single-page application)单页面项目,会导致首次加载时间长:SPA需要加载整个应用的代码和资源,首次加载时间可能会比传统的多页面应用长。

以下是我个人计算fmp的逻辑

  • fmp:监听 vue挂载的节点(dom的id为root)首次变化时间
  • fp: 监听 beforeMounted的时间为白屏结束时间

计算的单位使用performance.now

performance.now()是一个JavaScript方法,用于获取当前时间戳,精确到毫秒级。它返回一个DOMHighResTimeStamp对象,表示从性能测量器启动到调用performance.now()的时间间隔。这个方法通常用于性能测量和性能优化,可以用于计算代码执行时间、动画帧率、网络请求延迟等。

💖 MutationObserver 计算 dom的变化

MutationObserver 接口提供了监视对 DOM 树所做更改的能力

使用示例:

// 选择需要观察变动的节点
const targetNode = document.getElementById("some-id");

// 观察器的配置(需要观察什么变动)
const config = { attributes: true, childList: true, subtree: true };

// 当观察到变动时执行的回调函数
const callback = function (mutationsList, observer) {
  // Use traditional 'for loops' for IE 11
  for (let mutation of mutationsList) {
    if (mutation.type === "childList") {
      console.log("A child node has been added or removed.");
    } else if (mutation.type === "attributes") {
      console.log("The " + mutation.attributeName + " attribute was modified.");
    }
  }
};

// 创建一个观察器实例并传入回调函数
const observer = new MutationObserver(callback);

// 以上述配置开始观察目标节点
observer.observe(targetNode, config);

// 之后,可停止观察
observer.disconnect();

在vue的入口页面app.vue编写监听rootDom变化的逻辑
mutationAction 函数如下(将节点的高度大于0作为结束监听的条件即fmp的结束时间)

// 监听 dom变化
mutationAction(listenDom, callbackAction) {
    // 观察器的配置(需要观察什么变动)
    const config = { attributes: true, childList: true, subtree: true };
    // 当观察到变动时执行的回调函数
    const callback = function (mutationsList, observer) {
        // 渲染高度
        const renderHeight = listenDom.offsetHeight
        if (parseInt(renderHeight)) {
            // 第一次监听dom 存在高度则判定已经渲染完root节点
            callbackAction()
            // 停止观察
            observer.disconnect();
        }
    };

    // 创建一个观察器实例并传入回调函数
    const observer = new MutationObserver(callback);
    // 以上述配置开始观察目标节点
    observer.observe(listenDom, config);
}

在App.vue的声明周期onBerforeMount运行

<script setup>
import { ref, onBeforeMount } from "vue";
// 查找次数,用于统计最大查找次数避免奔溃
const findAppCount = ref(0)

// 监听 dom变化
mutationAction(listenDom, callbackAction) {
    // 观察器的配置(需要观察什么变动)
    const config = { attributes: true, childList: true, subtree: true };
    // 当观察到变动时执行的回调函数
    const callback = function (mutationsList, observer) {
        // 渲染高度
        const renderHeight = listenDom.offsetHeight
        if (parseInt(renderHeight)) {
            // 第一次监听dom 存在高度则判定已经渲染完root节点
            callbackAction()
            // 停止观察
            observer.disconnect();
        }
    };

    // 创建一个观察器实例并传入回调函数
    const observer = new MutationObserver(callback);
    // 以上述配置开始观察目标节点
    observer.observe(listenDom, config);
}


const findAppDom = () => {
  const appDom = document.getElementById('app')
  findAppCount.value += 1
  if (appDom) {
    mutationAction(appDom, () => {
      const fmp=performance.now()
    })
  }
  else if (findAppCount <= 1000) {
    findAppDom()
  }
}
onBeforeMount(() => {
  // 白屏时间
  const fp = performance.now()
  findAppDom();
})
</script>

💖 使用条形图展示 fmp、fp时间

使用条形图对性能指标耗时进行可视化
vue3 flushjobs耗时几秒,web站点,前端,javascript,vue,性能优化
条形图展示数据的vue界面编写

<script lang="js" setup>
import { reactive, onMounted } from 'vue';
import * as echarts from 'echarts';

import { useStore } from "vuex";

const store = useStore();
const state = reactive({
    leftTitle: '原生的performance',
    leftDomId: 'visual-performance-id',

    rightTitle: '性能指标可视化',
    rightDomId: 'visual-performance-id-right',
    chartTitle: '性能指标',
    echartInstance: null,

})


const initLeftChart = () => {
    // 基于准备好的dom,初始化echarts实例
    const domInstance = document.getElementById(state.leftDomId)
    if (domInstance) {
        domInstance.removeAttribute('_echarts_instance_')
    }
    else {
        return
    }
    console.log(performance)
    console.log(Object.keys(performance.timing))
    const label = []
    const data = []
    for (let key in performance.timing) {
        if (key != 'toJSON') {
            label.push(key)
            data.push(performance.timing[key])
        }

    }
    const myChart = echarts.init(domInstance);
    const option = {
        title: {
            text: 'performance'
        },
        tooltip: {
            trigger: 'axis',
            axisPointer: {
                type: 'shadow'
            }
        },
        legend: {},
        grid: {
            left: '3%',
            right: '4%',
            bottom: '3%',
            containLabel: true
        },
        xAxis: {
            type: 'value',
            boundaryGap: [0, 0.01]
        },
        yAxis: {
            type: 'category',
            data: label
        },
        series: [
            {
                name: 'performance',
                type: 'bar',
                data: data
            }
        ]
    };
    console.log('option', option)
    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option, true);
    // 监听
    state.echartInstance = myChart;
    myChart.on('click', function (params) {
        console.log('params', params)
    });
    window.onresize = myChart.resize;
}

const initRightChart = () => {
    // 基于准备好的dom,初始化echarts实例
    const domInstance = document.getElementById(state.rightDomId)
    if (domInstance) {
        domInstance.removeAttribute('_echarts_instance_')
    }
    else {
        return
    }

    const performanceConfig = store.getters["common/performanceConfig"]

    console.log('performanceConfig________________', performanceConfig)

    const label = []
    const data = []

    Object.keys(performanceConfig).forEach(key => {
        data.push(performanceConfig[key])
        label.push(key)
    })
    const myChart = echarts.init(domInstance);
    const option = {
        title: {
            text: '自定义计算fmp'
        },
        tooltip: {
            trigger: 'axis',
            axisPointer: {
                type: 'shadow'
            }
        },
        legend: {},
        grid: {
            left: '3%',
            right: '4%',
            bottom: '3%',
            containLabel: true
        },
        xAxis: {
            type: 'value',
            boundaryGap: [0, 0.01]
        },
        yAxis: {
            type: 'category',
            data: label
        },
        series: [
            {
                name: 'fmp计算',
                type: 'bar',
                data: data
            }
        ]
    };
    console.log('option', option)
    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option, true);
    // 监听
    state.echartInstance = myChart;
    myChart.on('click', function (params) {
        console.log('params', params)
    });
    window.onresize = myChart.resize;
}


onMounted(() => {
    initLeftChart()
    initRightChart()
})
</script>
<template>
    <div>

        <div style="display:flex;">
            <a-card :title="state.leftTitle" style="width: 600px">
                <div :id="state.leftDomId" style="width: 500px;height:600px;">

                </div>

            </a-card>

            <a-card :title="state.rightTitle" style="width: 600px;margin-left:20px">
                <div :id="state.rightDomId" style="width: 500px;height:600px;">

                </div>
                <div>

                </div>

            </a-card>
            <a-card style="margin-left:20px" title="定义">
                <div>
                    <div>
                        fetchStart:浏览器发起资源请求时,有缓存时,则返回读取缓存的开始时间。<br>

                        domainLookupStart:查询 DNS 的开始时间。<br>

                        domainLookupEnd:查询 DNS 的结束时间。<br>

                        connectStart:浏览器开始与服务器连接时的时间。<br>

                        secureConnectionStart:如果页面使用 HTTPS,它的值是安全连接握手之前的时刻。<br>

                        connectEnd:当浏览器端完成与服务器端建立连接的时刻。<br>

                        responseStart:指客户端收到从服务器端(或缓存、本地资源)响应回的第一个字节的数据的时刻。<br>

                        responseEnd:指客户端收到从服务器端(或缓存、本地资源)响应回的最后一个字节的数据的时刻。<br>

                    </div>
                </div>
            </a-card>
        </div>

    </div>
</template>

效果:
vue3 flushjobs耗时几秒,web站点,前端,javascript,vue,性能优化

⭐项目代码

前端项目inscode如下:

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!
vue3 flushjobs耗时几秒,web站点,前端,javascript,vue,性能优化

👍 点赞,是我创作的动力!
⭐️ 收藏,是我努力的方向!
✏️ 评论,是我进步的财富!
💖 最后,感谢你的阅读!文章来源地址https://www.toymoban.com/news/detail-841446.html

到了这里,关于前端vite+vue3——可视化页面性能耗时指标(fmp、fp)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue UI可视化页面修改为显示中文的问题

     首先可以参考这个链接,把浏览器设置成中文:vue UI可视化窗口修改为显示中文_vue ui中文-CSDN博客 如果浏览器本来就是中文的请直接阅读本篇文章:  目录 解决方法(临时解决英文问题) 解决方法二(彻底解决问题): 博主遇到的问题是:浏览器设置成中文后,打开vue

    2024年01月20日
    浏览(45)
  • Vue3实现可视化拖拽标签小程序

    实现功能:可视化标签拖拽,双击标签可修改标签内容 一个大DIV包含里面存放两个DIV一个input header为头部标签名称 内容区域绑定双击鼠标事件,触发开始修改事件(startEditing),使用v-if进行标签的显示和隐藏操作 input标签,事件绑定为修改内容,绑定获取焦点事件(@blue=“

    2024年02月09日
    浏览(48)
  • Vue3 +Echarts5 可视化大屏——屏幕适配

    项目基于Vue3 + Echarts5 开发,屏幕适配是使用 scale 方案 Echarts组件按需引入,减少打包体积 地图组件封装(全国省份地图按需加载) 效果图: 大屏适配常用的方案有 rem + vw/vh 和 scale 。 rem + vw/vh 方案 结合使用rem(相对于根元素字体大小的单位)和vw/vh(视窗宽度/高度的单位

    2024年02月15日
    浏览(48)
  • Vite+Vue+iClient for Leaflet引入并实现MapV/Eharts第三方可视化库示例

    作者:gaogy 最近很多小伙伴咨询关于基于Vue3框架搭建iClent开发环境并使用Echarts与MapV等第三方可视化库的问题。本文就以iClient for Leaflet为例,在新一代前端框架构建工具Vite与Vue3项目中,演示如何搭建iClent开发环境并使用Echarts与MapV等第三方可视化库。 本文所使用的依赖与配

    2024年02月06日
    浏览(63)
  • 一个Vue3搭建的低代码数据可视化开发平台

    Vue.js是一款基于MVVM模式的JavaScript框架,通过其简洁、高效的语法和强大的功能,帮助开发者构建出更加灵活、快速和可维护的Web应用。与其他框架相比,Vue区别于市场上的繁杂,它注重易用性和迅速上手的优势,给开发者提供了更大的自由度。无论是用于构建简单的个人项

    2024年02月14日
    浏览(46)
  • 基于VUE3开发的CAD图可视化平台代码开源了

    ​ 唯杰地图VJMAP 为 CAD 图或 自定义地图格式 WebGIS 可视化 显示开发提供的一站式解决方案,支持的格式如常用的 AutoCAD 的 DWG 格式文件、 GeoJSON 等常用 GIS 文件格式,它使用 WebGL 矢量图块 和 自定义样式 呈现交互式地图, 提供了全新的 大数据可视化 可视化功能。 ​ 唯杰地图

    2024年01月18日
    浏览(60)
  • 数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏: 数据分析系统化教学,零基础到进阶实战 景天的主页: 景天科技苑 Streamlit是一个免费的开源框架,用于快速构建和共享漂亮的数据科学Web应用程序。它是一个基于Python的库,专为机器学

    2024年03月14日
    浏览(46)
  • GoView 是一个Vue3搭建的低代码数据可视化开发平台

    开源、精美、便捷的「数据可视化」低代码开发平台 框架:基于  Vue3  框架编写,使用  hooks  写法抽离部分逻辑,使代码结构更加清晰; 类型:使用  TypeScript  进行类型约束,减少未知错误发生概率,可以大胆修改逻辑内容; 性能:多处性能优化,使用页面懒加载、组件

    2024年02月04日
    浏览(59)
  • 基于Echarts+Vue3的低代码可视化数据大屏拖拽设计器 vue拖拽设计大屏

    本产品是一款基于Vue3开发的可视化数据大屏拖拽设计器。提供一种简单易用的拖拽式数据可视化大屏设计方案,可帮助用户快速创建和定制自己的数据大屏,通过拖拽组件、调整布局和设置属性,实现数据展示的自由组合和个性化定制。 可视化编辑:通过拖拽组件、调整布

    2024年02月03日
    浏览(60)
  • vue3+echarts应用——深度遍历html的dom结构并用树图进行可视化

    大家好,我是yma16,本文分享关于 vue3+echarts应用——深度遍历 html 的 dom结构并使用树图进行可视化。 💖vue3系列文章 vue3 + fastapi 实现选择目录所有文件自定义上传到服务器 前端vue2、vue3去掉url路由“ # ”号——nginx配置 csdn新星计划vue3+ts+antd赛道——利用inscode搭建vue3(ts)+an

    2024年01月20日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包