埋点SDK,我是如何让甲方的页面卡顿10s+

87dc3e50f56598c5542452bd35d3ebc9.png

前端Q

我是winty,专注分享前端知识和各类前端资源,乐于分享各种有趣的事,关注我,一起做个有趣的人~

公众号

点击上方 前端Q,关注公众号

回复加群,加入前端Q技术交流群

4388b2c7f41a8b922ec261cdd111fb99.png

背景音:

Sir,收到線報啦,今日喺生產環境用戶訪問網頁嘅時候,竟然感受到咁卡卡地!完全冇得爽啊!已經導致唔少用戶投訴。根據推斷,昨日更新咗埋點SDK...

昨日,一位前端程序员在优化公司的埋点SDK使用方式后,出了一些小插曲。不知道是什么原因,更新之后就开始有用户反馈说网页卡卡地,走得比蜗牛还慢。 六点二十分,第一个用户提交了投诉工单,但这只是个开始。

今天早上九点十分,公司的运维团队已经接到了一大堆反馈工单,许多用户都遭受到了同样的问题。这是一个巨大的问题,一旦得不到解决,可能导致数万的用户受到影响。运维人员立即开始了排查工作,想要找出问题所在。

经过一个小时的紧急排查,他们终于想到了昨日的这名前端程序员,一经沟通发现是SDK版本更新引起的问题。在新的版本中,有一些不稳定的代码导致了性能问题。

然而,这不仅仅是个技术问题,因为接下来,他们要开始着手写事故报告,准备给上层领导交代。

接下来,进入正题:

一、问题排查定位

根据更新的版本体量,可以缩小和快速定位问题源于新引入埋点SDK。

  • 打开 开发者工具-性能分析,开始记录

  • 刷新页面,重现问题

  • 停止记录,排查分析性能问题

5198d4d1811de6ff59fff63162f69ecb.png

如上图,按照耗时排序,可以快速定位找到对应的代码问题。

首先把编译压缩后的代码整理一下,接下来,深入代码一探究竟。

383f9d2dc97f29b558ec05709e421a6d.png

⏸️暂停一下,不妨猜猜看这里是为了干嘛?

🍵喝口茶,让我们沿着事件路径,反向继续摸清它的意图吧。

e1896fd287d55882a186433d7791e1fb.png

这里列举了231个字体名称,调用上文的 detect() 来分析。 ⏸️暂停一下,那么这个操作为什么会耗时且阻塞页面渲染呢? ... 休息一下,让我们去看看这段代码的来龙去脉。 上面我们大概猜到代码是用于获取用户浏览器字体,那就简单检索一下 js get browser font。

1019fc3c88681bce1221632f7ad29ef5.png

证据确凿,错在对岸。

二、解决问题

相信大家也看出来了,我不是埋点SDK,我也不是甲方爸爸,我只能是一位前端开发。

联系反馈至SDK方,需要走工单,流程,而这一切要多少时间?

我唔知啊!领导也不接受啊!

👐没办法,只能自己缝补缝补了。

那么如何解决呢?

尝试修复 getFonts detect 字体检测逻辑,避免多次回流导致性能问题。

关于回流问题的一些文章 web.dev 官网文档

d794af5bcc31fbac5ebc4bbc4d5e8154.png

缩短待检测字体目录。

人生苦短,我选方案3,直接修改返回值,跳过检测。

getFonts () { return 'custom_font' }

那么让我们继续搬砖吧。

寻根

首先找到 SDK 加载对应 JS 的加载方式,看看能不能动点手脚。 这里可以看到,是采用很常见的 通过  appendScript loadJs 的方案,那么就可以复写拦截一下 appendChild 函数。

正源

通过拦截 appendChild,将SDK加载的JS改为加载修复后的JS文件。 核心代码如下:

var tempCAppend = document.head.appendChild
document.head.appendChild = function (t) {
    if (t.tagName === 'SCRIPT' && t.src.includes('xxx.js')) {
          t.src = 'custom_fix_xxx.js'
    }
    return tempCAppend.bind(this)(t)
}
79c00ac7c1379e0ea8eaaad31b4f0143.png

三、后续

这件事情发生在21年底,今天为什么拿出来分享一下呢?

近期排查 qiankun 部分子应用路由加载异常的时候,定位到与 document.head.appendChild 被复写有关,于是去看SDK方是否修复,结果纹丝未 动....

结合近期境遇,不得不感慨,业务能不能活下去,真的和代码、技术什么的毫无关系。

其他

❄️下雪了,简单看了几眼文心一言的发布会,更凉了。

作者:夏无凉风冬有雪 

链接:https://juejin.cn/post/7211020974023868475

71ab8c2fda4458a1eee394bd33abc4d2.png

往期推荐

速来!腾讯微信团队招人,简历直推面试官!

84c32bd3bfeefdd79de9b865d10e6046.png

阿里面试—如何用 JS 实现瀑布流布局

1391206646c5265ff220a7f95387af20.png

Vue3除了keep-alive,还有哪些页面缓存的实现方案

9b292e6ab02e1439ef0a7ca64fbbf0bc.png


最后

  • 欢迎加我微信,拉你进技术群,长期交流学习...

  • 欢迎关注「前端Q」,认真学前端,做个专业的技术人...

b14450bb4f78bb6967cf0ce04730706c.png

前端Q

本公众号主要分享一些技术圈(前端圈为主)相关的技术文章、工具资源、学习资料、招聘信息及其他有趣的东西...

公众号

2cb05e01e02f9a30510faea0394cccaa.jpeg

ba35a689e2b018ac2b65823544e4046d.png

点个在看支持我吧

c179d13ecc5c1976a2e6bd07f2e284af.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值