前端监控:别让你的应用在黑暗中运行

前端监控:别让你的应用在黑暗中运行

毒舌时刻

这应用运行得跟幽灵似的,出了问题都不知道。

各位前端同行,咱们今天聊聊前端监控。别告诉我你还在等用户反馈问题,那感觉就像在没有监控的仓库里放贵重物品——能放,但丢了都不知道。

为什么你需要前端监控

最近看到一个项目,用户反映页面经常崩溃,但开发团队根本不知道问题出在哪里。我就想问:你是在做应用还是在做猜谜游戏?

反面教材

// 反面教材:没有监控 function App() { const [data, setData] = React.useState([]); useEffect(() => { async function fetchData() { try { const response = await fetch('/api/data'); const result = await response.json(); setData(result); } catch (error) { console.error('Error fetching data:', error); } } fetchData(); }, []); return ( <div> {data.map(item => ( <div key={item.id}>{item.name}</div> ))} </div> ); } export default App; 

毒舌点评:这代码,就像在黑暗中开车,出了事故都不知道怎么回事。

正确姿势

1. Sentry 监控

// 正确姿势:Sentry 监控 // 1. 安装依赖 // npm install @sentry/react @sentry/tracing // 2. 初始化 // src/index.js import React from 'react'; import ReactDOM from 'react-dom'; import App from './App'; import * as Sentry from '@sentry/react'; import { BrowserTracing } from '@sentry/tracing'; Sentry.init({ dsn: 'YOUR_SENTRY_DSN', integrations: [new BrowserTracing()], tracesSampleRate: 1.0, }); ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode>, document.getElementById('root') ); // 3. 错误边界 // src/ErrorBoundary.jsx import React from 'react'; import * as Sentry from '@sentry/react'; class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error) { return { hasError: true }; } componentDidCatch(error, errorInfo) { Sentry.captureException(error, { extra: errorInfo }); } render() { if (this.state.hasError) { return <h1>Something went wrong.</h1>; } return this.props.children; } } export default ErrorBoundary; // 4. 使用错误边界 // src/App.jsx import React from 'react'; import ErrorBoundary from './ErrorBoundary'; function App() { return ( <ErrorBoundary> <div> {/* 应用内容 */} </div> </ErrorBoundary> ); } export default App; 

2. 性能监控

// 正确姿势:性能监控 // 1. 使用 Lighthouse // npm install -g lighthouse // lighthouse https://example.com // 2. 使用 Web Vitals import { getCLS, getFID, getFCP, getLCP, getTTFB } from 'web-vitals'; function sendToAnalytics({ name, delta, id }) { console.log(name, delta, id); // 发送到分析服务 // navigator.sendBeacon('/analytics', JSON.stringify({ name, delta, id })); } getCLS(sendToAnalytics); getFID(sendToAnalytics); getFCP(sendToAnalytics); getLCP(sendToAnalytics); getTTFB(sendToAnalytics); 

3. 用户行为监控

// 正确姿势:用户行为监控 // 1. 使用 Google Analytics // index.html <script async src="https://www.googletagmanager.com/gtag/js?id=GA_MEASUREMENT_ID"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'GA_MEASUREMENT_ID'); </script> // 2. 自定义事件 function trackEvent(eventName, eventParams) { gtag('event', eventName, eventParams); } // 使用 <button onClick={() => trackEvent('button_click', { button_name: 'submit' })}> 提交 </button> 

4. 日志监控

// 正确姿势:日志监控 // 1. 配置日志级别 const LOG_LEVELS = { ERROR: 0, WARN: 1, INFO: 2, DEBUG: 3 }; let currentLevel = LOG_LEVELS.INFO; function log(level, message, data) { if (level <= currentLevel) { const timestamp = new Date().toISOString(); const logMessage = `[${timestamp}] [${Object.keys(LOG_LEVELS)[level]}] ${message}`; switch (level) { case LOG_LEVELS.ERROR: console.error(logMessage, data); // 发送到监控服务 break; case LOG_LEVELS.WARN: console.warn(logMessage, data); break; case LOG_LEVELS.INFO: console.info(logMessage, data); break; case LOG_LEVELS.DEBUG: console.debug(logMessage, data); break; } } } // 使用 log(LOG_LEVELS.ERROR, 'Failed to fetch data', { error: 'Network error' }); log(LOG_LEVELS.INFO, 'User logged in', { userId: 123 }); 

毒舌点评:这才叫前端监控,让你的应用在阳光下运行,任何问题都逃不过你的眼睛。

Read more

OpenClaw Web Search 完全指南(2026年3月最新)

OpenClaw Web Search 完全指南(2026年3月最新) 本文详细介绍 OpenClaw 内置 web_search 工具的 5 个官方搜索渠道,以及 Tavily 技能的使用方法。帮助你选择最适合的免费/付费方案。 目录 * OpenClaw 搜索功能概述 * 5 个官方搜索渠道详解 * 1. Brave Search API * 2. Google Gemini * 3. Grok (xAI) * 4. Kimi (Moonshot) * 5. Perplexity * 免费额度对比表 * 推荐配置方案 * Tavily Web Search 技能 * 配置步骤详解 * 常见问题 OpenClaw 搜索功能概述 OpenClaw 提供两种搜索能力:

Java外功基础(1)——Spring Web MVC

Java外功基础(1)——Spring Web MVC

1.前置知识 1.1 Tomcat 定义:Tomcat是一个开源的轻量级Web(Http)服务器和Servlet容器。它实现了Java Servlet等Java EE规范的核心功能,常用于部署和运行Java Web应用程序 。换言之,Tomcat就是一个严格遵循Servlet规范开发出来的、可以独立安装和运行的Java Web服务器/Servlet容器核心功能:Servlet容器:支持Servlet的执行,处理HTTP请求和响应Web服务器:提供静态资源(如HTML)的访问能力,支持基本的HTTP服务安装与版本对应: tomcat官网:Apache Tomcat®目录结构:bin:存放可执行文件,如startup.batconf:存放配置文件lib:存放Tomcat运行所需的jar文件logs:存储日志文件temp:存放临时文件,如上传的文件或缓存数据webapps:默认web应用部署目录work:服务器的工作目录,存放运行时生成的临时文件(编译文件) 1.2 Servlet 1.2.1 定义

OpenWebUI联网搜索实战:如何用SearXNG让本地大模型获取实时信息(附百度/360配置)

OpenWebUI联网搜索实战:如何用SearXNG让本地大模型获取实时信息(附百度/360配置) 如果你在本地运行大模型,比如用Ollama部署了Qwen、Llama或者DeepSeek,可能会发现一个尴尬的问题:模型的知识截止日期是固定的,它不知道今天股市涨跌,不清楚最新的科技新闻,甚至不知道明天是什么节日。这种“信息孤岛”的感觉,让本地大模型的实用性大打折扣。 我最初搭建OpenWebUI环境时,也遇到了这个痛点。看着模型一本正经地分析过时的数据,那种无力感让我开始寻找解决方案。市面上有不少联网搜索方案,但要么配置复杂,要么对国内网络环境不友好。经过几周的折腾和测试,我发现SearXNG这个开源元搜索引擎,配合OpenWebUI的联网搜索功能,是目前最稳定、最灵活的方案之一。 更重要的是,通过合理配置SearXNG,我们可以让本地大模型直接调用百度、360等国内搜索引擎,获取符合中文用户习惯的实时信息。这不仅仅是技术上的连接,更是让本地AI真正“接地气”的关键一步。下面我就把自己踩过的坑、验证过的配置,以及实际效果对比,毫无保留地分享给你。 1. 为什么需要SearXN