【前端定位线上问题的多种方案(不依赖 Sentry)】
前端定位线上问题的多种方案(不依赖 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]'}
};
调试流程:
- 构建时生成
.map
文件,但不上传至 CDN - 报错时通过行号/列号(如
main.js:123:45
) - 本地使用
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__ // 构建时注入的版本};// 上报到自有APIfetch('/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. 浏览器直接关联本地源码
步骤:
- 构建时生成
source-map
- 在 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,通过前端工程化手段打造自闭环的线上问题定位体系,让每一次报错都“有迹可循、有版可查”。 🔍🚀
相关文章:
【前端定位线上问题的多种方案(不依赖 Sentry)】
前端定位线上问题的多种方案(不依赖 Sentry) 🛠️ 一、构建时注入调试信息 🔧 1. 注入版本信息与 Git 提交哈希 Webpack 配置: // webpack.config.js const webpack require(webpack); const gitRevision require(…...

怎么修改node_modules里的文件,怎么使用patch-package修改node_modules的文件,怎么修改第三方库原文件。
在开发中会遇到需要node_modules里第三方库有bug,然后需要修改node_modules文件的情况 使用patch-package包可以修改node_modules里的文件 patch-package npm 官网:patch-package - npm 安装 npm i patch-package 修改文件后 npx patch-package s…...

muduo网络库2
Muduo网络库:底层实质上为Linux的epoll pthread线程池,且依赖boost库。 muduo的网络设计核心为一个线程一个事件循环,有一个main Reactor负载accept连接,然后把连接分发到某个sub Reactor(采用轮询的方式来选择sub Reactor)&…...
什么是DrawCall?DrawCall为什么会影响游戏运行效率?如何减少DrawCall?
目录 1 什么是DrawCall? 2 DrawCall为什么会影响游戏运行效率? 3 如何减少 DrawCall?(结合性能分析工具) 1 什么是DrawCall? DrawCall(绘制调用) 是 GPU 的一个指令,…...

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

【十二】Golang 映射
💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 映射映射的定义映射初始化make 函数使用字面量 源…...

PHP商协会管理系统小程序源码
📊 商协会管理系统 💻 这是一款基于ThinkPHPUniapp框架,经过深度定制与匠心打造的商协会系统,被誉为商协会领域数字化运营管理的新锐之星。它以“智慧化会员体系、智敏化内容运营、智能化活动构建”为三大核心动力源,…...
React进阶之React核心源码解析(三)
React核心源码解析 diff多节点比较diff两轮遍历比较第一轮比较第二轮比较Update 状态更新Concurrent Modediff 多节点比较diff isArray方法比较 节点更新// 更新前 <ul><li key="0" className="before">0<li><li key=...

【无标题】网络安全公钥密码体制
第一节 网络安全 概述 一、基本概念 网络安全通信所需要的基本属性“ 机密性;消息完整性;可访问性与可用性;身份认证。 二、网络安全威胁 窃听;插入;假冒;劫持;拒绝服务Dos和分布式拒绝服务…...
mysql中的计算日期函数 理解、用法
三种计算日期的函数 函数用途示例DATEDIFF()计算两个日期的天数差DATEDIFF(2023-10-05, 2023-10-01) → 4TIMESTAMPDIFF()按指定单位(年、月、小时等)计算差TIMESTAMPDIFF(MONTH, 2023-01-01, 2023-03-01) → 2DATE_ADD()日期加法DATE_ADD(2023-10-01, …...

从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(一)
项目包含5个模块 1.首页 (聊天主页) 2.注册 3.登录 4.个人资料 5.设置主题 一、配置开发环境 建立项目文件夹 mkdir chat-project cd chat-project mkdir server && mkdir webcd server npm init cd web npm create vitelatest 创建前端项目时我们选择javascrip…...
wifi5和wifi6,WiFi 2.4G、5G,五类网线和六类网线,4G和5G的区别
wifi5和wifi6的区别 是Wi-Fi 5和Wi-Fi 6的选择与路由器密切相关。路由器是创建和管理无线网络的设备,它决定了网络的类型和性能。具体来说: 路由器的标准支持:路由器可以支持不同的Wi-Fi标准,如Wi-Fi 5(802.11ac)和Wi-Fi 6(802.11ax)。支持Wi-Fi 6的路由器能够提供更高…...

Docker基础-常见命令
docker images -查看所有的本地镜像。 docker pull -把远端镜像拉取到本地。 docker rmi -删除镜像。 docker push -推到镜像仓库。 docker run -创建并运行容器(自动化,如果发现镜像不存在会先去拉取, 拉取完了以后再去自动创建容器&am…...

从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(三) 实现注册 登录接口
1.划分文件夹 在src目录下创建controllers middleware models routes controllers 放具体的方法 signup login middleware 里面是中间件 请求的验证 models 放对象实体 routes 处理访问路径像/signup /login 等等 2. 接口开发 系统的主要 有用户认证 和 消息 2种类型…...
Android NFC功能开发指南
在 Android 平台上开发 NFC(近场通信)功能,主要涉及以下几个步骤: 1. 权限声明 首先,在 AndroidManifest.xml 文件中声明 NFC 权限: <uses-permission android:name"android.permission.NFC&quo…...
基于Matlab实现汽车远近光灯识别的详细步骤及代码示例
以下是一个基于Matlab实现汽车远近光灯识别的详细步骤及代码示例,主要通过图像处理技术来区分远光灯和近光灯。 整体思路 图像预处理:包括读取图像、灰度化、去噪等操作,以提高后续处理的准确性。边缘检测:找出图像中的边缘信息…...

nginx反向代理以及负载均衡(常见案例)
一、nginx反向代理 1、什么是代理服务器? 代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据…...
Spring 三级缓存机制(解决循环依赖)
文章目录 🔄 现实生活类比:开餐厅的过程💡 结合到 Spring 三级缓存🛠️ Spring 解决循环依赖的步骤1️⃣ Spring 开始创建 A2️⃣ Spring 开始创建 B3️⃣ B 创建完成后,回过头来继续创建 A 📌 三级缓存的作…...

第4章 4.4 EF Core数据库迁移 Add-Migration UpDate-Database
4.4.1 数据库迁移原理 总结一下就是: 1. 数据库迁移命令的执行,其实就是生成在数据库执行的脚本代码(两个文件:数字_迁移名.cs 数字_迁移名.Designer.cs),用于对数据库进行定义和修饰。 2. 数据库迁移…...
web安全——web应用程序技术
文章目录 一、HTTP1.1 HTTP方法1.2 HTTP消息头1.3 cookie1.4 状态码 二、web功能2.1 服务器端功能2.2 客户端功能——同源策略 三、编码方案3.1 URL编码3.2 Unicode编码3.3 HTML编码3.4 Base64编码 一、HTTP HTTP(超文本传输协议)是web应用程序使用的通…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...