前端监控:别等用户告诉你应用崩了

前端监控:别等用户告诉你应用崩了

毒舌时刻

这代码写得跟网红滤镜似的——仅供参考。

各位前端同行,咱们今天聊聊前端监控。别告诉我你还在等用户截图告诉你应用崩了,那感觉就像等邻居来告诉你你家着火了——能知道,但已经晚了。

为什么你需要前端监控

最近看到一个项目,生产环境崩溃了 3 小时,开发团队却一无所知。我就想问:你是在做应用还是在做猜谜游戏?

反面教材

// 反面教材:没有监控 // components/Checkout.jsx export default function Checkout() { const [loading, setLoading] = useState(false); const handleSubmit = async () => { setLoading(true); try { await api.checkout(); // 成功处理 } catch (error) { // 只在控制台打印错误 console.error('Checkout failed:', error); // 显示错误信息 setError('支付失败'); } finally { setLoading(false); } }; return ( <button onClick={handleSubmit} disabled={loading}> {loading ? '支付中...' : '支付'} </button> ); } // 错误只在控制台,开发团队看不到 // 用户遇到问题只能截图反馈 

毒舌点评:这代码,错误只在控制台,你是在写应用还是在玩捉迷藏?

前端监控的正确姿势

1. 错误监控

// 正确姿势:Sentry 错误监控 // src/utils/errorMonitoring.js import * as Sentry from '@sentry/react'; export function initSentry() { Sentry.init({ dsn: 'YOUR_SENTRY_DSN', integrations: [ new Sentry.BrowserTracing(), new Sentry.Replay() ], tracesSampleRate: 1.0, replaysSessionSampleRate: 0.1 }); } export function captureError(error) { Sentry.captureException(error); } export function captureMessage(message) { Sentry.captureMessage(message); } // 使用 // components/Checkout.jsx import { captureError } from '../utils/errorMonitoring'; const handleSubmit = async () => { try { await api.checkout(); } catch (error) { captureError(error); setError('支付失败'); } }; 

2. 性能监控

// 正确姿势:性能监控 // src/utils/performanceMonitoring.js import { getCLS, getFID, getFCP, getLCP, getTTFB } from 'web-vitals'; export function initPerformanceMonitoring() { getCLS(console.log); getFID(console.log); getFCP(console.log); getLCP(console.log); getTTFB(console.log); } // 集成到 Sentry import * as Sentry from '@sentry/react'; export function sendToSentry({ name, delta, id }) { Sentry.metrics.distribution(name, delta, { tags: { id } }); } getCLS(sendToSentry); getFID(sendToSentry); getLCP(sendToSentry); 

3. 用户行为监控

// 正确姿势:用户行为监控 // src/utils/userMonitoring.js import * as Sentry from '@sentry/react'; export function trackEvent(eventName, data) { Sentry.captureEvent({ message: eventName, extra: data }); } export function trackClick(element, eventName) { element.addEventListener('click', () => { trackEvent(eventName, { timestamp: new Date().toISOString() }); }); } // 使用 // components/Button.jsx import { trackClick } from '../utils/userMonitoring'; export default function Button({ onClick, children }) { const buttonRef = useRef(null); useEffect(() => { if (buttonRef.current) { trackClick(buttonRef.current, 'button_clicked'); } }, []); return ( <button ref={buttonRef} onClick={onClick}> {children} </button> ); } 

毒舌点评:这才叫现代前端,实时监控,问题早发现早解决。

Read more

Android WebView 版本升级方案详解

Android WebView 版本升级方案详解 目录 1. 问题背景 2. WebViewUpgrade 项目介绍 3. 升级方法详解 4. 替代方案对比 5. 接入与使用步骤 6. 注意事项与限制 7. 总结与建议 问题背景 WebView 版本差异带来的问题 Android 5.0 以后,WebView 升级需要去 Google Play 安装 APK,但即使安装了也不一定能正常工作。像华为、Amazon 等特殊机型的 WebView 的 Chromium 版本一般比较低,只能使用它自己的 WebView,无法使用 Google 的 WebView。 典型问题场景 H.265 视频播放问题:

前端部署:别让你的应用在上线后掉链子

前端部署:别让你的应用在上线后掉链子 毒舌时刻 这部署流程写得跟绕口令似的,谁能记得住? 各位前端同行,咱们今天聊聊前端部署。别告诉我你还在手动上传文件到服务器,那感觉就像在石器时代用石头砸坚果——能用,但效率低得可怜。 为什么你需要自动化部署 最近看到一个项目,部署时需要手动复制文件到服务器,每次部署都要花上几个小时。我就想问:你是在做部署还是在做体力活? 反面教材 # 反面教材:手动部署 # 1. 构建项目 npm run build # 2. 压缩文件 zip -r build.zip build # 3. 上传到服务器 scp build.zip user@server:/var/www/html # 4. 登录服务器 ssh user@server # 5. 解压文件 unzip

【Actix Web】Rust Web开发实战:Actix Web框架全面指南

【Actix Web】Rust Web开发实战:Actix Web框架全面指南

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,ZEEKLOG全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Rust开发,Python全栈,Golang开发,云原生开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。 所属的专栏:Rust语言通关之路 景天的主页:景天科技苑 文章目录 * Rust Web开发 * 一、Actix Web框架概述 * 1.1 Actix Web的特点 * 1.2 Actix Web与其他Rust框架比较

前端老鸟血泪史:搞定那些让人头秃的报错,让线上稳如老狗

前端老鸟血泪史:搞定那些让人头秃的报错,让线上稳如老狗

前端老鸟血泪史:搞定那些让人头秃的报错,让线上稳如老狗 * 前端老鸟血泪史:搞定那些让人头秃的报错,让线上稳如老狗 * 别在那硬扛了,聊聊咱们天天跟JS错误斗智斗勇那点破事 * 扒一扒浏览器到底是怎么"发疯"报错的 * window.onerror这个老六,到底靠不靠谱 * console.error就是个摆设,别指望它 * Promise.reject这个定时炸弹 * 资源加载失败,浏览器的提示有多敷衍 * 给代码穿上防弹衣,这些监控手段必须安排上 * 网络错误这块,很多人其实没监控到位 * SourceMap这玩意儿,真的是救命稻草 * 还原报错现场,得像侦探小说一样精彩 * 埋点策略得有讲究,别把用户浏览器卡死 * 这招好用是好用,但副作用你也得心里有数 * 监控代码太猛,主线程直接堵死 * 海量报错数据,服务器账单比你工资涨得还快 * 误报率太高,狼来了的故事听多了 * 真到了生产环境,这套组合拳该怎么打 * 分级处理才是王道