我的编程空间,编程开发者的网络收藏夹
学习永远不晚

FMP节点监控相对准确的计算方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

FMP节点监控相对准确的计算方法是什么

本文小编为大家详细介绍“FMP节点监控相对准确的计算方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“FMP节点监控相对准确的计算方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    如何监控节点

    监控变化

    MutationObserver

    一句话解释

    「MutationObserver 给予我们获取 DOM 渲染「切面」的能力」。

    「MDN 解释」MutationObserver 接口提供了监视对 DOM 树所做更改的能力。它被设计为旧的 Mutation Events 功能的替代品,该功能是 DOM3 Events 规范的一部分。

    节点标记

    有了以上能力,既可以对节点进行监听和 「标记」

    像这样

    // 伪代码new MutationObserver(() => {    let timestamp = performance.now() || (Date.now() - START_TIME),    doTag(document.body, global.paintTag++);    global.ptCollector.push(timestamp);});

    名词解释: - paintTag:对应 dom 的打点标记「_pi」,标记着第几次配渲染的产物。

    FMP节点监控相对准确的计算方法是什么

    • ptCollector:paintTag 对应的时间节点集合。可以用 paintTag 检索到某次渲染时刻的时间节点。

    什么时间计算?

    window.load 开始计算

    为什么?

    我们认为,通常情况下,在 window 触发 load 事件的时刻,意味着主要业务的 90% 的资源和 dom 都已经准备就绪。此时算出的高权重得分的 dom 就是我们想要找的 FMP 关键节点。

    我不关心你是怎么渲染的,异步也好直出也好,殊途同归,我只关心结果

    怎么筛选元素?

    计算权重得分

    基础节点

    一个基础节点(无子节点)的权重得分计算方法:

    // 伪代码const TAG_WEIGHT_MAP = {    SVG: 2,    IMG: 2,    CANVAS: 2,    VIDEO: 4};node => {    let weight = TAG_WEIGHT_MAP[node.tagName],        areaPercent = global.calculateShowPercent(node);    let score = width * height * weight * areaPercent;    return score;}
    父节点

    这是一个算法我把它叫做「代父竞选」

    父节点自身的权重得分计算方法同基础节点相同,不同的是,如果其子节点的得分和大于或等于了自身的得分,将由子节点组代替父节点参与更高级的竞选,同时,子节点的权重得分和作为父节点的得分,另外,如果子节点是有孙子节点代表的,孙子节点将会同步升级。

    怎么理解呢?

    如下两种情况:

    FMP节点监控相对准确的计算方法是什么

    父元素得分 = 400 * 100 = 40000子元素得分和 = 300 * 60 + 60 * 60 = 21600父元素得分 > 子元素得分和

    此情况下,该组元素以 40000 的得分进入下一级竞选。参选的元素列表为父元素本身。

    数据结构如下:

    {    deeplink: [{…}],    elements: [{        node: parent#id_search,        ...    }],    node: parent#id_search,    paintIndex: 1,    score: 40000}

    FMP节点监控相对准确的计算方法是什么

    父元素得分 = 400 * 300 = 120000子元素得分和 = 400 * 300 + 60 * 100 = 126000父元素得分 < 子元素得分和

    此情况下,该组元素应以 126000 的得分进入下一级竞选。参选的元素列表为子元素组,「代父竞选」。

    数据结构如下:

    {    deeplink: [{…}],    elements: [        {node: child#id_slides_pics, ...},        {node: child#id_slides_index, ...}    ],    node: parent#id_slides,    paintIndex: 2,    score: 126000}

    由以上两种情况可推

    FMP节点监控相对准确的计算方法是什么

    父元素得分 = 400 * 400 = 160000子元素得分和 = 40000 + 126000 = 166000父元素得分 < 子元素得分和其中一个子节点由孙子节点们代表

     ==>

    {    deeplink: [{…}],    elements: [        {node: child#id_search, ...},        {node: child#id_slides_pics, ...},        {node: child#id_slides_index, ...}    ],    node: parent#id_body,    paintIndex: 1,    score: 166000}

    所以,以下组合与拆分就不难理解了。

    排除干扰项

    在我们对 document 深度遍历计算的过程中,总会遇到一些干扰因素使我们的脚本计算出错,以下两种就是最常见的

    不可见元素

    FMP节点监控相对准确的计算方法是什么

    这种元素虽然用户无感知,但会严重影响最后的竞选结果。

    处理方案

    const isIgnoreDom = node => {    return getStyle(node, 'opacity') < 0.1 ||        getStyle(node, 'visibility') === 'hidden' ||        getStyle(node, 'display') === 'none' ||        node.children.length === 0 &&        getStyle(node, 'background-image') === 'none' &&        getStyle(node, 'background-color') === 'rgba(0, 0, 0, 0)';}

    首先我们认为opacity < 0.1 visibility === 'hidden' 和 display === 'none' 的元素为不可见元素,应忽略,另外,无子节点,且无背景无颜色的元素也归属于不可见元素,忽略。

    滚动偏移

    由于我们的脚本在 window load 后才执行,绝大情况下此时浏览器的滚动条已经发生了偏移。精选结果会发生误差。如下图:

    FMP节点监控相对准确的计算方法是什么

    此时精选结果为

    <div class="channel" _pi="30">...</div>

    _pi 走到了 30,「第 30 次渲染」,无论有多快,这个值始终会远大于实际的 FMP。

    导致「滚动偏移」的情况有两种

    • 在 load 触发前用户主动翻阅 这种情况再常见不过,用户不可能每次都等到 load 后才进行操作。而且如果存在 pending 的资源,load 的时间会非常迟。

    • load 浏览器触发前执行了「scrollRestore (英文描述,并不存在此事件)」

    对于第二种情况,还是很好解的,因为并不是所有的浏览器都有 History.scrollRestoration 的特效,所以,我们只要关掉即可,但情况一我们是无论如何不能控制的。

    所以,只能另辟蹊径「划定计算区域」,且此区域应避开滚动条位置的影响。

    处理方案

    当然,我们也是有方法的,其实也挺简单。

    这得益于「document 对象的宽高是固定的,且偏移量同步于滚动条」

    const getDomBounding = dom => {    const { x, y } = document.body.getBoundingClientRect();    const { left, right, top, bottom, width, height } = dom.getBoundingClientRect();    return {        left: left - x,        right: right - x,        top: top - y,        bottom: bottom - y,        height, width    }}

    不同元素 FMP 算法不同

    普通元素

    像 <DIV/><SPAN/><P/><INPUT/> 这些普通元素,标注的 _pi 值索引到的渲染时刻的时间节点 ptCollector 还记得吗?该时间即可作为 FMP 值。

    有特殊情况,如果普通元素带有背景图片,则会升级为 <IMG/> 类资源元素

    资源元素

    如 <IMG/><VIDEO/>,该元素的 resource 的 responseEnd 的时间节点将作为 FMP 值

    不过,我们可以针对不同的项目对全局权重配置 TAG_WEIGHT_MAP 做「合理化」调整。当然也可以忽略「图片」和「视频」等资源元素资源加载时间,一切以实际项目而定

    读到这里,这篇“FMP节点监控相对准确的计算方法是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    FMP节点监控相对准确的计算方法是什么

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    FMP节点监控相对准确的计算方法是什么

    本文小编为大家详细介绍“FMP节点监控相对准确的计算方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“FMP节点监控相对准确的计算方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。如何监控节点监控变
    2023-07-05

    详解节点监控相对准确的计算FMP

    这篇文章主要为大家介绍了节点监控相对准确的计算FMP详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-10

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录