<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>前端性能监控 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E7%9B%91%E6%8E%A7/</link><description>Recent content in 前端性能监控 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 23 Oct 2025 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E7%9B%91%E6%8E%A7/index.xml" rel="self" type="application/rss+xml"/><item><title>前端性能监控</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/engineering/engineering-011/</link><pubDate>Thu, 07 Aug 2025 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/engineering/engineering-011/</guid><description>&lt;h2 id="大纲"&gt;大纲&lt;/h2&gt;
&lt;p&gt;我们会从以下三个方向来讲解埋点与监控的知识：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;什么是埋点？什么是监控？&lt;/li&gt;
&lt;li&gt;JS 中实现监控的核心方案&lt;/li&gt;
&lt;li&gt;写一个“相对”完整的监控实例&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="一什么是埋点什么是监控"&gt;一、什么是埋点？什么是监控？&lt;/h2&gt;
&lt;p&gt;在日常沟通中，我们经常会把【埋点】和【监控】放到一起说，但是它们在本质上是有一定的区别的：&lt;/p&gt;
&lt;h3 id="1-埋点"&gt;1. 埋点&lt;/h3&gt;
&lt;p&gt;埋点主要用于&lt;strong&gt;收集用户行为数据&lt;/strong&gt;。在日常开发中，我们会通过 &lt;strong&gt;在前端代码中插入代码或脚本的方式&lt;/strong&gt; 来实现埋点功能。&lt;/p&gt;
&lt;p&gt;埋点的主要作用就是：&lt;strong&gt;捕获特定用户行为（如点击、浏览、提交表单、页面跳转等）以及关键业务数据（如下单金额、商品类别等）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在日常开发中，埋点的实现方案大致可以分为以下三大类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;手动埋点&lt;/strong&gt;：在代码中手动加入记录代码来捕获特定事件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动埋点&lt;/strong&gt;：利用 DOM 事件代理等技术来捕获页面上所有事件，从而减少手动配置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可视化埋点&lt;/strong&gt;：通过工具界面标记需要采集的元素和事件，可以不用手写代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-监控"&gt;2. 监控&lt;/h3&gt;
&lt;p&gt;而监控则主要关注 &lt;strong&gt;系统的性能和稳定性&lt;/strong&gt;。在日常开发中，我们会通过 &lt;strong&gt;采集页面加载时间、资源请求、错误日志等数据&lt;/strong&gt; 的方式来实现前端监控。&lt;/p&gt;
&lt;p&gt;监控的主要作用就是：&lt;strong&gt;及时发现并定位页面性能瓶颈或代码异常，目的是为了保障系统不出 bug&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在日常开发中，监控一般需要完成以下三大部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;性能监控&lt;/strong&gt;：如：首屏加载时间、页面交互耗时、资源加载耗时等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误监控&lt;/strong&gt;：捕获 JavaScript 错误、网络请求失败、资源加载异常等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户体验监控&lt;/strong&gt;：收集白屏、卡顿等影响用户体验的问题等。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="区别总结"&gt;区别总结&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;前端埋点&lt;/th&gt;
&lt;th&gt;前端监控&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;目标&lt;/td&gt;
&lt;td&gt;捕获用户行为数据&lt;/td&gt;
&lt;td&gt;监控系统性能、错误、稳定性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据类型&lt;/td&gt;
&lt;td&gt;用户点击、表单提交、页面跳转等&lt;/td&gt;
&lt;td&gt;页面加载时间、错误日志、卡顿情况等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;实现方式&lt;/td&gt;
&lt;td&gt;手动埋点、自动埋点、可视化埋点&lt;/td&gt;
&lt;td&gt;错误捕获、性能指标采集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;核心关注点&lt;/td&gt;
&lt;td&gt;用户行为、业务数据&lt;/td&gt;
&lt;td&gt;系统Bug、性能优化&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="二js-中实现监控的核心方案"&gt;二、JS 中实现监控的核心方案&lt;/h2&gt;
&lt;p&gt;根据上面所说，我们知道埋点和监控的目的存在不同，但是它们的思路确是有很多一致性的，其核心都是：&lt;strong&gt;获取关键的数据，发送（上报）给服务端&lt;/strong&gt;，依据数据来解决其不同的目的。&lt;/p&gt;
&lt;p&gt;所以，无论是埋点也好，还是监控也罢，我们都需要 &lt;strong&gt;获取关键位置数据&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="1-跟踪用户事件点击滚动等"&gt;1. 跟踪用户事件（点击、滚动等）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;定义通用跟踪函数（后续事件会通过该函数完成上报）&lt;/strong&gt;：&lt;code&gt;trackEvent&lt;/code&gt; 函数接收事件类型和事件详情，并上报到服务端。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 用于记录或发送跟踪数据到服务器的函数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;trackEvent&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;eventType&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;details&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`Event: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;eventType&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;details&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 在控制台打印事件类型和详情
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 上报到服务端。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;/测试接口地址&amp;#39;&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;method&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;eventType&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;details&lt;/span&gt; }) });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;捕获按钮点击事件&lt;/strong&gt;：获取 &lt;code&gt;id&lt;/code&gt; 为 &lt;code&gt;myButton&lt;/code&gt; 的按钮，并在其 &lt;code&gt;click&lt;/code&gt; 事件上添加监听器。在按钮被点击时调用 &lt;code&gt;trackEvent&lt;/code&gt; 函数，记录点击事件的类型（&lt;code&gt;button_click&lt;/code&gt;）、按钮 ID 和时间戳。&lt;/p&gt;</description></item></channel></rss>