【前端定位线上问题的多种方案(不依赖 Sentry)】

news2025/2/26 17:37:24

前端定位线上问题的多种方案(不依赖 Sentry) 🛠️


一、构建时注入调试信息 🔧

1. 注入版本信息与 Git 提交哈希

Webpack 配置

// webpack.config.js
const webpack = require('webpack');
const gitRevision = require('child_process').execSync('git rev-parse --short HEAD').toString().trim();

module.exports = {
  plugins: [
    new webpack.DefinePlugin({
      __VERSION__: JSON.stringify(`v1.0.0-${gitRevision}`)
    })
  ]
};

代码中使用

console.log('当前版本:', __VERSION__);
// 输出:当前版本:v1.0.0-3a5b7d9e

优势

  • 精准定位代码版本,结合 Git 历史快速回溯问题
  • 无需第三方工具,纯前端实现

2. 生成 Source Map 并选择性部署

Webpack 生产配置

// webpack.config.js
module.exports = {
  devtool: 'hidden-source-map', // 生成 Source Map 但不暴露给浏览器
  output: {
    sourceMapFilename: '[file].map[query]'
  }
};

调试流程

  1. 构建时生成 .map 文件,但不上传至 CDN
  2. 报错时通过行号/列号(如 main.js:123:45
  3. 本地使用 source-map 库解析错误位置:
    npx source-map analyze main.js.map --line 123 --column 45
    

优势

  • 安全:不暴露源码到生产环境
  • 精准:还原压缩代码到源码位置

二、浏览器端主动捕获与上报 🌐

1. 全局错误监听

基础代码

window.addEventListener('error', (e) => {
  const errorInfo = {
    msg: e.message,
    file: e.filename,
    line: e.lineno,
    col: e.colno,
    stack: e.error?.stack,
    version: __VERSION__ // 构建时注入的版本
  };
  
  // 上报到自有API
  fetch('/api/log-error', {
    method: 'POST',
    body: JSON.stringify(errorInfo)
  });
});

增强方案(Promise 错误)

window.addEventListener('unhandledrejection', (e) => {
  console.error('Unhandled Rejection:', e.reason);
});

2. Console 日志重定向

捕获所有 console.log

const originalConsoleLog = console.log;
console.log = (...args) => {
  originalConsoleLog(...args); // 保持原功能
  sendToServer('log', args); // 自定义上报
};

三、动态调试模式开关 🔌

1. URL 参数控制调试模式

代码示例

const urlParams = new URLSearchParams(location.search);
const debugMode = urlParams.has('debug');

if (debugMode) {
  localStorage.setItem('debug', 'true'); // 持久化调试状态
  console.log('调试模式已开启');
}

// 根据调试模式加载不同资源
if (debugMode) {
  import('./src/dev-tools.ts'); // 加载调试工具
}

安全措施

  • 后端校验参数权限(如特定IP或Token)
  • 生产环境默认隐藏调试入口

2. 环境变量区分构建模式

Vite 配置

// vite.config.js
export default defineConfig(({ mode }) => ({
  define: {
    __DEBUG__: mode === 'development' // 开发模式下启用调试
  }
}));

代码中使用

if (__DEBUG__) {
  console.log('当前为调试模式,敏感操作已禁用');
}

四、本地 Source Map 调试方案 🔍

1. 浏览器直接关联本地源码

步骤

  1. 构建时生成 source-map
  2. 在 Chrome DevTools 中配置:
    • 打开 Sources 面板 → Overrides
    • 映射网络资源到本地文件系统

效果


2. VS Code 调试生产代码

配置 .vscode/launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "Debug Production",
      "url": "http://localhost:3000?debug",
      "webRoot": "${workspaceFolder}/src",
      "sourceMaps": true,
      "sourceMapPathOverrides": {
        "webpack:///./*": "${webRoot}/*"
      }
    }
  ]
}

五、方案对比与选型建议 📊
方案适用场景优点缺点
构建注入版本所有项目无第三方依赖,快速定位版本需自行实现错误收集
Source Map 解析需要精准定位生产错误安全可靠,还原源码位置需手动管理 .map 文件
全局错误捕获自有错误监控系统完全可控,数据私有需后端支持,开发成本较高
动态调试模式紧急问题排查灵活开关,不影响普通用户存在安全风险,需严格权限控制
浏览器 Overrides前端开发者本地调试直接修改生产代码,实时生效仅限本地使用,无法团队协作

六、终极总结 🎯

「构建时埋点 + 浏览器捕获 + 动态调试」三位一体

  • 通过构建工具注入版本和 Source Map,建立代码与报错的精确映射
  • 利用全局错误监听实现自主上报,摆脱对 Sentry 的依赖
  • 结合 URL 参数动态开启调试模式,安全高效排查问题

一句话价值
无需依赖 Sentry,通过前端工程化手段打造自闭环的线上问题定位体系,让每一次报错都“有迹可循、有版可查”。 🔍🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2306490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【虚拟仪器技术】labview操作指南和虚拟仪器技术习题答案(一)

今天是2025年2月24日,画的是fate/Grand Order里面的阿尔托莉雅.卡斯特,武内老师的画。 目录 第1章 第2章 第3章 第4章 第5章 关注作者了解更多 我的其他CSDN专栏 毕业设计 求职面试 大学英语 过程控制系统 工程测试技术 虚拟仪器技术 可编程…

LabVIEW电能质量分析软件

随着电力系统的复杂性增加,电能质量问题日益突出,传统的电能质量检测装置多采用DSP技术,不仅开发周期长、功能单一,而且在多功能集成方面存在局限性。基于LabVIEW虚拟仪器开发平台的电能质量分析软件利用FFT、STFT、WT、HHT等多种…

视频裂变加群推广分享引流源码

源码介绍 视频裂变加群推广分享引流源码 最近网上很火,很多人都在用,适合引流裂变推广 测试环境:PHP7.4(PHP版本不限制) 第一次访问送五次观看次数,用户达到观看次数后需要分享给好友或者群,好友必须点击推广链接后才会增加观看次…

项目一 - 任务3:搭建Java集成开发环境IntelliJ IDEA

通过本次实战,我们成功搭建了Java集成开发环境IntelliJ IDEA,并完成了多个任务。首先,安装了IntelliJ IDEA并进行了个性化设置,如选择主题、调整字体和编码等。接着,创建了Java项目、包和类,编写并运行了简…

RoCBert:具有多模态对比预训练的健壮中文BERT

摘要 大规模预训练语言模型在自然语言处理(NLP)任务上取得了最新的最优结果(SOTA)。然而,这些模型容易受到对抗攻击的影响,尤其是对于表意文字语言(如中文)。 在本研究中&#xff0…

DeepSeek开源周Day2:DeepEP - 专为 MoE 模型设计的超高效 GPU 通信库

项目地址:https://github.com/deepseek-ai/DeepEP 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天 (2/5)! ​ ​ 引言 在大模型训练中,混合专家模型(Mixture-of-Experts, MoE)因其动…

六十天前端强化训练之第二天CSS选择器与盒模型深度解析

欢迎来到编程星辰海的博客讲解 目录 一、CSS 核心概念 1. 三种引入方式 2. CSS 注释 3. 常见单位系统 二、CSS选择器核心知识 1. 基础选择器类型 2. 组合选择器 3. 伪类选择器(部分示例) 4. 优先级计算规则 三、盒模型深度解析 1. 标准盒模型图…

分享httprunner 结合django实现平台接口自动化方案

说明,可以直接在某个视图集定义自定义接口来验证。 调试1:前端界面直接编写yaml文件. 新增要实现存数据到mysql,同时存文件到testcase下, 如test.yaml 更新yaml数据,同时做到更新 testcase下的文件,如test.yaml acti…

本地大模型编程实战(22)用langchain实现基于SQL数据构建问答系统(1)

使 LLM(大语言模型) 系统能够查询结构化数据与非结构化文本数据在性质上可能不同。后者通常生成可在向量数据库中搜索的文本,而结构化数据的方法通常是让 LLM 编写和执行 DSL(例如 SQL)中的查询。 我们将演练在使用基于 langchain 链 &#x…

速通HTML

目录 HTML基础 1.快捷键 2.标签 HTML进阶 1.列表 a.无序列表 b.有序列表 c.定义列表 2.表格 a.内容 b.合并单元格 3.表单 a.input标签 b.单选框 c.上传文件 4.下拉菜单 5.文本域标签 6.label标签 7.按钮标签 8.无语义的布局标签div与span 9.字符实体 HTML…

博客系统完整开发流程

前言 通过前⾯课程的学习, 我们掌握了Spring框架和MyBatis的基本使用, 并完成了图书管理系统的常规功能开发, 接下来我们系统的从0到1完成⼀个项⽬的开发. 企业开发的流程 1. 需求评审(产品经理(PM)会和运营(想口号),UI,测试,开发等沟通) ,会涉及到背景/目标/怎么做,可能会有多…

【C语言】指针笔试题

前言:上期我们介绍了sizeof与strlen的辨析以及sizeof,strlen相关的一些笔试题,这期我们主要来讲指针运算相关的一些笔试题,以此来巩固我们之前所学的指针运算! 文章目录 一,指针笔试题1,题目一…

【Qt】桌面应用开发 ------ 绘图事件和绘图设备 文件操作

文章目录 9、绘图事件和绘图设备9.1 QPainter9.2 手动触发绘图事件9.3 绘图设备9.3.1 QPixmap9.3.2 QImage9.3.3 QImage与QPixmap的区别9.3.4 QPicture 10、文件操作10.1 文件读写10.2 二进制文件读写10.3 文本文件读写10.4 综合案例 9、绘图事件和绘图设备 什么时候画&#x…

python与C系列语言的差异总结(3)

与其他大部分编程语言不一样,Python使用空白符(whitespace)和缩进来标识代码块。也就是说,循环体、else条件从句之类的构成,都是由空白符加上冒号(:)来确定的。大部分编程语言都是使用某种大括号来标识代码块的。下面的…

OpenCV(9):视频处理

1 介绍 视频是由一系列连续的图像帧组成的,每一帧都是一幅静态图像。视频处理的核心就是对这些图像帧进行处理。常见的视频处理任务包括视频读取、视频播放、视频保存、视频帧处理等。 视频分析: 通过视频处理技术,可以分析视频中的运动、目标、事件等。…

【C++设计模式】观察者模式(1/2):从基础到优化实现

1. 引言 在 C++ 软件与设计系列课程中,观察者模式是一个重要的设计模式。本系列课程旨在深入探讨该模式的实现与优化。在之前的课程里,我们已对观察者模式有了初步认识,本次将在前两次课程的基础上,进一步深入研究,着重解决观察者生命周期问题,提升代码的安全性、灵活性…

在 CentOS 7.9上部署 Oracle 11.2.0.4.0 数据库

目录 在 CentOS 7.9上部署 Oracle 11.2.0.4.0 数据库引言安装常见问题vim粘贴问题 环境情况环境信息安装包下载 初始环境准备关闭 SELinux关闭 firewalld 安装前初始化工作配置主机名安装依赖优化内核参数限制 Oracle 用户的 Shell 权限配置 PAM 模块配置swap创建用户组与用户,…

计算机毕业设计SpringBoot+Vue.js足球青训俱乐部管理系统(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知

写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 😃,生活加油 我站在人潮中央,思考这日日重复的生活。我突然想&#xff0c…

QSplashScreen --软件启动前的交互

目录 QSplashScreen 类介绍 使用方式 项目中使用 THPrinterSplashScreen头文件 THPrinterSplashScreen实现代码 使用代码 使用效果 QSplashScreen 类介绍 QSplashScreen 是 Qt 中的一个类,用于显示启动画面。它通常在应用程序启动时显示,以向用户显…