监控不是运维的专利:前端也能玩转产品级监控
大家好,我是阿哲,一名在一线大厂干了三年的前端工程师。平时除了写业务代码,我还在B站做技术分享,很多粉丝留言说:“监控不都是后端和运维的事吗?我们前端要学这个干啥?”
其实我当初也这么想。直到有一次,我们上线的新功能在用户手机上白屏了,但本地和测试环境一切正常。老板急得满头汗,产品问“到底多少人受影响”,设计问“是不是 UI 崩了”,而我们却答不上来——那一刻我才意识到:前端也需要自己的监控体系。
今天这篇教程,就带你从零开始,用最简单的语言和最真实的案例,搞懂前端如何搭建一套轻量但实用的产品级监控方案。无论你是刚学 HTML 的小白,还是只会写页面不会排查问题的“切图仔”,都能跟上。
为什么前端需要监控?先看一个真实案例
去年我们团队做了一个电商活动页,上线后产品经理跑来问:“为什么转化率比预期低 30%?”
我们查了日志、看了埋点,发现大量用户在点击“立即购买”按钮后没反应。最后通过前端错误监控才发现:iOS 14.5 的某个 Safari 版本不支持 replaceAll 方法,导致 JS 报错,整个页面卡死。
如果没有监控,这个问题可能要等用户投诉才被发现。而有了监控,我们 5 分钟内定位问题,10 分钟热修复上线。
所以,前端监控不是“可有可无”,而是保障产品体验、提升开发效率的关键工具。
环境准备:三分钟搭起你的第一个监控系统
别被“系统”吓到!我们不用部署服务器,也不用装复杂软件。只需要:
- 一个现代浏览器(Chrome / Edge / Firefox)
- 一个文本编辑器(VS Code 最佳)
- 一个免费的监控服务平台(推荐 Sentry)
第一步:注册 Sentry 账号
- 打开 https://sentry.io
- 点击 “Get Started for Free”
- 用 GitHub 或邮箱注册(免费版够个人和小团队用)
- 创建新项目 → 选择 “JavaScript” → “Browser”
你会得到一段初始化代码,类似这样:
<script
src="https://browser.sentry-cdn.com/7.100.0/bundle.min.js"
integrity="sha384-..."
crossorigin="anonymous"
></script>
<script>
Sentry.init({
dsn: "https://xxx@xxx.ingest.sentry.io/123456",
replaysSessionSampleRate: 0.1,
replaysOnErrorSampleRate: 1.0,
});
</script>
💡 小贴士:DSN(Data Source Name)就像你项目的“身份证”,千万别泄露到公开仓库!
第二步:创建你的第一个被监控页面
新建一个 index.html 文件,内容如下:
<!DOCTYPE html>
<html>
<head>
<title>我的第一个监控页面</title>
<!-- 引入 Sentry -->
<script src="https://browser.sentry-cdn.com/7.100.0/bundle.min.js"></script>
<script>
Sentry.init({
dsn: "你的 DSN 字符串", // 替换成你自己的
integrations: [Sentry.replayIntegration()],
tracesSampleRate: 1.0,
replaysSessionSampleRate: 0.1,
replaysOnErrorSampleRate: 1.0,
});
</script>
</head>
<body>
<h1>欢迎来到监控世界!</h1>
<button onclick="crash()">点我制造一个错误</button>
<script>
function crash() {
// 故意调用不存在的方法
const str = "hello world";
str.replaceAll(" ", "-"); // iOS 14.5 不支持!
}
</script>
</body>
</html>
双击打开这个 HTML 文件,在浏览器中点击按钮——你会看到控制台报错。但更重要的是,几秒钟后,Sentry 后台就会收到这条错误!
核心概念:前端监控到底在“监”什么?
很多新手以为监控就是“报错收集”,其实远不止如此。一个完整的前端监控体系包含三大模块:
| 模块 | 作用 | 举例 |
|---|---|---|
| 错误监控 | 捕获 JS 运行时错误 | TypeError: undefined is not a function |
| 性能监控 | 测量页面加载速度、交互响应时间 | 首屏加载 2.3s,FCP 1.1s |
| 行为回溯 | 记录用户操作路径(可选) | 用户点击了 A → B → C,然后崩溃 |
我们今天重点讲前两个,因为它们对“产品”体验影响最大。
错误监控:不只是 console.error
JS 错误分两类:
- 同步错误:直接抛出的异常(如上面的
replaceAll) - 异步错误:Promise reject、setTimeout 内部错误
Sentry 默认能捕获大部分同步错误。但异步错误需要额外处理:
// 错误示范:Promise 错误会静默失败
fetch('/api/data')
.then(res => res.json())
.then(data => {
data.items.forEach(item => item.name.toUpperCase()); // 如果 item 是 null?
});
// 正确做法:加 catch
fetch('/api/data')
.then(res => res.json())
.then(data => {
data.items.forEach(item => item.name.toUpperCase());
})
.catch(err => {
Sentry.captureException(err); // 手动上报
});
✅ 最佳实践:所有异步操作都要
.catch(),并在 catch 里调用Sentry.captureException(err)
性能监控:让用户不再喊“卡”
前端性能指标有很多,但对产品最有价值的是这三个:
- FCP(First Contentful Paint):用户第一次看到内容的时间
- LCP(Largest Contentful Paint):最大内容渲染完成时间(比如主图或标题)
- CLS(Cumulative Layout Shift):页面是否“乱跳”(比如图片加载后把文字挤下去)
Sentry 可以自动采集这些数据。你只需开启 tracesSampleRate:
Sentry.init({
dsn: "...",
tracesSampleRate: 1.0, // 开启 100% 性能采样
});
之后在 Sentry 后台就能看到每个页面的性能分布,比如:
首页 LCP 中位数:1.8s
商品详情页 LCP 中位数:3.2s ← 需要优化!
实战:给一个真实产品加上监控
假设你现在要为一个“天气查询”小应用加上监控。这是它的原始代码:
<!-- weather.html -->
<input type="text" id="city" placeholder="输入城市名">
<button onclick="search()">查询</button>
<div id="result"></div>
<script>
async function search() {
const city = document.getElementById('city').value;
const res = await fetch(`/api/weather?city=${city}`);
const data = await res.json();
document.getElementById('result').innerText = `当前温度:${data.temp}°C`;
}
</script>
第一步:引入 Sentry
在 <head> 中加入初始化脚本(略,同上)。
第二步:捕获 API 错误
网络请求失败很常见(比如用户输错城市名),我们要上报:
async function search() {
try {
const city = document.getElementById('city').value;
const res = await fetch(`/api/weather?city=${city}`);
if (!res.ok) {
throw new Error(`API 返回 ${res.status}`);
}
const data = await res.json();
document.getElementById('result').innerText = `当前温度:${data.temp}°C`;
} catch (err) {
Sentry.captureException(err);
alert('查询失败,请重试');
}
}
第三步:标记用户上下文(关键!)
如果 100 个用户都报错,你怎么知道是谁的问题?Sentry 支持绑定用户信息:
// 假设用户已登录,ID 为 user123
Sentry.setUser({
id: 'user123',
email: 'user@example.com'
});
这样,当错误发生时,你能在后台看到:“user123 在查询‘火星’时出错”。
第四步:自定义事务(用于性能分析)
你想知道“查询天气”这个操作花了多久?可以用 startTransaction:
async function search() {
const transaction = Sentry.startTransaction({ name: 'weather_search' });
Sentry.configureScope(scope => scope.setSpan(transaction));
try {
// ... 请求逻辑
} finally {
transaction.finish(); // 结束计时
}
}
现在,Sentry 会记录每次查询的耗时,并生成性能趋势图。
新手常踩的坑 & 解决方案
❌ 坑1:错误太多,被刷屏了
现象:一个用户疯狂点按钮,上报 100 条相同错误。
解法:开启错误去重 + 设置采样率。
Sentry.init({
dsn: "...",
// 相同错误 5 分钟内只报一次
beforeSend(event, hint) {
const error = hint.originalException;
if (error && error.message.includes('replaceAll')) {
// 临时忽略已知问题
return null;
}
return event;
},
// 或者全局降采样
sampleRate: 0.5, // 只上报 50% 的错误
});
❌ 坑2:本地开发时也上报错误
现象:调试时一堆错误发到生产环境后台。
解法:判断环境变量。
const isProd = window.location.hostname === 'your-product.com';
Sentry.init({
dsn: "...",
enabled: isProd, // 非生产环境不启用
});
❌ 坑3:性能数据不准
现象:LCP 显示 0.5s,但用户说“很慢”。
原因:本地测试网络太快,不代表真实用户。
解法:
- 使用 Web Vitals Chrome 插件 测量真实指标
- 在 Sentry 中查看 P75(75% 用户的体验)而非平均值
下一步怎么学?我的学习路线建议
- 先掌握基础:确保你能独立接入 Sentry 并理解错误/性能数据含义。
- 尝试自建监控(进阶):用开源方案如 OpenTelemetry + Prometheus,适合想深入底层的同学。
- 结合业务埋点:监控 + 埋点 = 完整用户行为分析。推荐学习 神策数据 或 GrowingIO 的前端 SDK。
- 关注综合体验:前端监控不是孤立的,要和后端链路追踪(如 Jaeger)打通,实现全链路排查。
📌 避坑指南:不要一上来就搞自研监控系统!先用成熟 SaaS(如 Sentry、阿里云 ARMS)验证需求,再考虑定制。
写在最后
监控不是炫技,而是对产品负责、对用户尊重的体现。我见过太多团队花 80% 时间开发新功能,却不愿花 5% 时间保障稳定性——结果线上事故频发,用户流失,得不偿失。
希望这篇教程能让你迈出第一步。记住:每一个未被捕获的错误,都是用户流失的潜在风险。
如果你觉得有帮助,欢迎去 B站 搜索“阿哲前端”,我会持续更新更多实战教程。下期我们聊聊《如何用 50 行代码实现前端性能水位告警》,敬请期待!
本文所有代码均可在本地直接运行,无需 Node.js 或构建工具。真正的零门槛入门!

评论 0