告别懵逼——前端项目调试与问题排查方法小结

2024-09-04 18:20

本文主要是介绍告别懵逼——前端项目调试与问题排查方法小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在日常工作中,我们常常会遇到以下两类典型的挑战:

场景一: 接手无文档的老项目
1、情景描述: 你接手了一个历史久远的项目,项目文档缺失,前任开发者已经离开,而你对当前的业务逻辑和代码结构都不熟悉。然而,线上系统出现了故障,需要紧急解决。

2、挑战:

  • 缺乏文档资料,难以快速了解系统架构。
  • 不熟悉业务流程,难以迅速定位问题。
  • 代码结构混乱,增加了调试难度。

场景二: 项目中出现难以复现的幽灵Bug
1、情景描述: 项目中出现了难以捉摸的Bug,相关反馈人员(如测试工程师、实施人员等)无法准确描述或复现问题,这使得问题的定位变得异常困难。

2、挑战:

  • 问题出现的概率较低,难以捕捉。
  • 相关人员提供的信息不完整,缺乏具体细节。
  • 缺乏一致的复现步骤,难以进行有效的调试。

不管是哪种场景,我们要解决问题,关键的一点就是必须找到引发问题的地方,以及真正引发问题的原因。

查找定位错误文件的方法

我们首先可用通过以下方法,来找到和定位引发问题的文件:

1、通过页面路由路径查找: 此方法得基于规范得页面结构,如果一个项目得项目文件引用像蜘蛛网一样错综复杂,此法行不通
2、通过css样式查找: 浏览器上鼠标选中对应的html,查看css,然后全局搜索
3、通过菜单查找: (页面菜单管理或者菜单数据,结合页面路由路径,找到对应的文件地址,比如component配置)。对于采用动态配置菜单得项目可用
4、全局关键字搜索: 通过页面特殊关键字全局搜索,查找文件。前提是该关键字在项目中出现次数比较少,最好5次以下。另外,全局搜索时,应将打包后的文件删除或者排除在外,避免干扰
5、从逻辑上顺藤摸瓜: 根据路由文件的逻辑,比如先找到路由文件,然后根据“查看”按钮,找到详情页文件

页面调试的一些思路整理:

1、遇到页面出不来,第一反是看浏览器控制台,观察是否报错,如果报错,根据报错指定的文件去查找错位问题,改正侯继续观察页面情况
2、控制台如果没用报错,查看netWork对应的接口请求,看是否有数据
3、如果有,检查代码逻辑,是否获取到数据(一定得检查并打印或者debug查看,而不是空想)
4、遇到棘手的,无法定位错误的问题,可以使用注释部分代码,观察页面变化的方式、找到错误文件后,根据文档等定位代码逻辑,根据代码逻辑打印调试数据,并分析数据是否正确
5、还原真实的操作逻辑和使用场景。能准确复现的问题相对很难复现的问题,会比较好解决。如果是其他人发现的问题,尽可能的摸清楚对方的操作逻辑,在相同账号、相同数据下来查找问题
6、涉及硬件、设备的,做好关键步骤和逻辑的数据打印,然后分析日志

以下案例均为笔者之前亲身经历。

案例一:某单位取款机项目,部分客户登录跳转首页,客户取钞过程中莫名跳转首页问题排查。

该问题在公司测试时并没有发现,出差到现场时,开始的第一天也未出现此问题

排查方法
  • 首先分析日志,从日志打印的顺序和时间上分析,发现钞票冠字号打印的顺序和取款批次不完全一致,有延后的情况

  • 问题复现方式:模拟现场用户取款实际步骤流程情况来测试后复现了问题

    关键方法: 还原用户真实场景测试复现

案例二: vue-press打包报错error Error rendering /
该问题的难点在于,报错信息基本无用,从报错信息上几乎找不到报错的原因和引发位置

原因查找:

  • 文档+已有知识:根据查阅官网示例文档,vue-press是服务端渲染。
  • 本地搭建测试环境:结合项目本身需求和环境排查,采用本地建测试仓库,本地建测试组件库,本地建测试文档项目
  • 统一测试流程:逐个移植原组件库的组件到测试组件库中(这里也可以采用二分法),发布到测试仓库后,更新测试文档,然后执行vue-press项目本地打包命令。

查找结果:

  • 初步组件定位:最终找出影响打包的组件有弹窗、文件上传、文件预览、裁剪等组件。这些组件的共同点就是都直接或间接用到了document操作dom,或者使用了window对象调用api。
  • 初步验证:锁定组件后,仅留下这些组件中的一个,然后去掉document相关调用,得到了正确的验证。
  • 进一步验证:后又通过对其他组件使用注释/开启方式不断测试,确定了问题原因包括:在create生命周期中使用window、document或bom方法事件,import引入含有或间接调用含有window、document或bom方法事件的函数

关键方法: 逐渐注释和逐渐移植(或者二分法)

假设你是一个科学家——以科学探究的精神面对挑战

在面对复杂且难以一眼洞悉的问题时,你是否曾想过,或许可以借鉴科学研究的方法来寻找和解决问题?

1、提出猜想。当遇到一个未知的、暂时无法准确定位具体问题的bug时,可以先以自己当下知识,提出可能的假设原因
2、验证猜想。猜想必须要验证。这里要注意的是,提出的只是猜想,并非就一定是这个原因,所以要避免先入为主的观念,而是要用事实来证明猜想的正确性。

如何验证?

  • 打印数据。打印数据时,注意浅拷贝问题。数组和对象的打印,建议使用JSON.parse(JSON.stringfy()),杜绝数据变化
  • 注释特定地方代码
  • 修改特定地方代码

3、问题未解决之前,不断提出猜想,反复验证

案例一: 某政府大屏项目——解决客户电脑(winserver2012政企版,蓝色chrome 83)浏览器布局出现混乱的问题。

  • 出现场景:客户电脑和windowserve2012系统上,装客户的特供版chrome浏览器,会出现该问题。
  • 原因推测:因开发电脑装了特供版chrome浏览器没复现,故只能推测原因。推测为界面使用flex布局,出现问题的时候,界面flex布局的row失效,混乱效果和直接使用block相同,可能是浏览器版本较低,加上该浏览器内核和通用chrome内核更新并不一致,最终对项目中的flex布局支持异常导致。
    解决: 加上百分比宽度布局兼容,给模块容器加上宽度100%显示,模块加上比例宽度兼容,测试后解决。

案例二: 某项目需要从第三方平台跳转,在开发者模式下模拟可以正常跳转,而在打包到客户生产环境下无法正确跳转
问题描述: 本该跳转到登录页面的地址,变成了ajax网络请求,页面显示404数据信息。

  • 猜想一:
    原因推测: 前端路由地址和后端api地址冲突
    验证: 前端修改路由路径信息验证,失败,排除了前后端路由和api冲突的可能
  • 猜想二:
    原因推测:nginx vue history模式必须的 try_files配置、即404重定向配置
    验证:加上后try_files配置问题未解决
  • 猜想三:
    原因推测:nginx整体配置问题
    验证:尝试将后端api配置注释,操作后项目可以成功的跳转到前端页面,确定了跳转失败的原因所在,后由后端伙伴提供新的配置后,问题解决

知识深度和广度的影响

知识深度和广度,可以在一定程度上快速帮你解决问题、查找原因

  • 知识深度:比如,一个vue2页面,你发现数据更新了,但是页面没有更新。从知识深度来讲,如果熟悉vue的$Set和vue对象在初始创建时没有对应的键名的坑,那看一下代码,就很快能联想到在赋值的地方需要用this.$set;又比如熟悉js基本类型和引用类型在存储上的区别,在处理数据莫名其妙发生变化的情况时,很容易就能想到是下游数据改变,影响了上游数据的原因
  • 知识广度:比如用Uniapp写一个app,发现网页端视频可以播放,app视频无法播放,对安卓熟悉的很容易就会联想到权限问题

工具的运用

百度搜索——适合英文不好的,但是专业网站上的iss等基本搜不出来
谷歌搜索——如果需要搜索国外的方案,最好有一点英文基础,能看个大概也行,可以搜索到github上的issue,还有,很多新新技术,国外的解决方案比国内多
AI工具——ChartGpt、通义千问等智能型工具

这篇关于告别懵逼——前端项目调试与问题排查方法小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136682

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施: