【面试题】 你知道怎么调试线上代码吗?

news2024/11/23 7:24:47

前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

这篇文章来分享下如何调试线上的代码

什么时候需要调试线上的代码呢,当线上代码出现 bug 的时候,需要定位问题,就需要一步一步调试代码来确认问题,但是线上代码都是构建之后的代码,很难看懂,有什么好的解决办法么?

实际例子

在本地创建一个 demo 项目

mkdir debugger-demo
cd debugger-demo
npm init -y
npm i webpack webpack-cli

这个项目用 webpack 构建打包

这是 webpack 配置文件 webpack.config.js :

const path = require("path");

/**@type {import('webpack').Configuration} */
module.exports = {
	mode: "production",
	entry: "./src/index.js",
	output: {
		filename: "index.js",
		path: path.resolve(__dirname, "dist"),
	}
};

tips:在编写js配置文件的时候,如果没有好的编译器提示,可以借用 JsDoc

入口文件时"./src/index.js",输出文件是"./dist/index.js"。很简单的配置文件

下面准备入口文件 index.js:

const data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

const _generate = (data, index) => {
	if (!data[index]) return null;
	const root = { value: data[index], left: null, right: null };
	root.left = _generate(data, index * 2);
	root.right = _generate(data, index * 2 + 1);
	return root;
};

// 构建二叉树
const generate = (data) => {
	return _generate(data, 1);
};

const tree = generate(data);

// 二叉树前序遍历,非递归
const printInOrder = (tree) => {
	const stack = [];
	let node = tree;
	while (node || stack.length !== 0) {
		while (node) {
			stack.push(node);
			node = node.left;
		}
		const popNode = stack.pop();
		console.log(popNode.value);
		node = popNode.right;
	}
};

printInOrder(tree);

这是一段二叉树生成,以及遍历的代码,代码稍稍有些复杂,为了调试做点铺垫

执行npx webapck,将代码打包

打包完成后,在 dist 文件夹下面生成了 index.js:
 

image.png


下面手动创建一个 index.html, 然后将 index.js 文件引入进去:

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>Document</title>
	</head>
	<body>
		<script src="./index.js"></script>
	</body>
</html>

在浏览器中打开:
 

image.png


代码正确执行

现在往代码里添加一个 throw,让其报错:

// 二叉树前序遍历,非递归
const printInOrder = (tree) => {
	const stack = [];
	let node = tree;
	while (node || stack.length !== 0) {
		while (node) {
			stack.push(node);
			node = node.left;
		}
		const popNode = stack.pop();
		console.log(popNode.value);
		node = popNode.right;
		throw ""; // 抛出错误
	}
};

然后在浏览器中勾选这一项,浏览器就会自动停在报错的地方了:
 

image.png


刷新浏览器:
 

image.png


发现代码确实停在了报错的地方,但是代码经过构建,变量名都变了。要是代码再复杂一点,就更不忍直视了。

我们在调试线上代码的时候估计也是这个样子。这个时候,就可以请出我们的法宝:sourcemap

使用 sourcemap

soucemap 是一个描述文件,调试工具可以通过这个文件,将构建代码映射成构建之前的文件。

修改 webpack 配置文件:

const path = require("path");

/**@type {import('webpack').Configuration} */
module.exports = {
	mode: "production",
	entry: "./src/index.js",
	output: {
		filename: "index.js",
		path: path.resolve(__dirname, "dist"),
	},
	devtool: "source-map",
};

添加生成 source-map 的配置,就会生成 sourcemap 了:

image.png

并且构建后的文件末尾就会出现:
 

image.png


浏览器会通过 souceMappingURL 获取 sourcemap,获取完成之后就会自动完成映射。

image.png

完成映射就会自动地显示构建之前的代码

但这是生产环境,是不可以让其他人看见源码的。那该怎么办呢?

可以换个 devtool 配置:

const path = require("path");

/**@type {import('webpack').Configuration} */
module.exports = {
	mode: "production",
	entry: "./src/index.js",
	output: {
		filename: "index.js",
		path: path.resolve(__dirname, "dist"),
	},
	devtool: "hidden-source-map",
};

hidden-source-map的意思是生成 sourcemap,但是不会关联 sourcemap,也就是不会自动地在构建之后的文件末尾添加 sourceMappingRUL,这样浏览器就看到不到。

虽然浏览器看不见了,但开发人员不也看不见了?不用担心,开发人员可以手动添加 sourcemap

在浏览器中打开构建之后代码文件,然后右键,就可以看到 add sourcemap的选项
 

image.png


然后填上 soucemap 的路径就可以了。soucemap 的路径和 index.html 相同

image.png


点击 Add 后,就可以看见源代码了:

image.png

总结:

这篇文章分享了如何调试线上代码,主要的点是 webpack 的配置和 浏览器自动添加 add sourcemap 的功能,当然,这两点都归结于 sourcemap 的映射能力。

前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

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

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

相关文章

可视化监管云平台EasyCVR宠物粮食食品厂智能视频监控方案

由于我国养宠物群体的不断膨胀&#xff0c;宠物市场也占据了经济的很大一部分&#xff0c;宠物做为人类的好朋友&#xff0c;可以给人们带来极高的精神抚慰&#xff0c;作为“毛孩子”家长&#xff0c;爱宠人士自然不会亏待自家宠物&#xff0c;都会选择最好的口粮以供宠物食用…

Mysql主从集群搭建——基于docker-compose一键部署

搭建初衷 本身自己就是开发这类应用的工作者&#xff0c;一个私有库还是很有必要的。无论是公司项目还是私人项目都可以用到&#xff0c;不用担心忘记同步导致的数据丢失统一管理所有docker应用的数据&#xff08;如果容器可以连接mysql的话&#xff09;也方便随时修改数据结构…

FTP协议(PORT和PASV模式)

目录 FTP协议基本概念 PORT主动模式工作流程 PORT工作过程 PORT工作报文 PASV被动模式工作流程 PASV工作过程 PASV工作报文 FTP协议基本概念 FTP文件传输协议&#xff0c;用于在互联网上进行文件传输&#xff0c;基于C/S架构 FTP的连接模式 FTP采用双TCP连接方式 控制连…

vue3项目中前端导出word文档和导出excel文档

一、导出word文档 参考文章https://blog.csdn.net/qq_53722480/article/details/130017092 1、使用到的包如下&#xff1a; "docxtemplater": "^3.42.4", "file-saver": "^2.0.5", "jszip-utils": "^0.1.0", &q…

分布式锁常见实现方案

分布式锁常见实现方案 基于 Redis 实现分布式锁 如何基于 Redis 实现一个最简易的分布式锁&#xff1f; 不论是本地锁还是分布式锁&#xff0c;核心都在于“互斥”。 在 Redis 中&#xff0c; SETNX 命令是可以帮助我们实现互斥。SETNX 即 SET if Not eXists (对应 Java 中…

前端Object的基础使用

Object.assign() 通过复制一个或多个对象来创建一个新的对象。旧对象旧对象…新对象 console.log(学习让人进步, Object.assign({name:zhangsan},{age:18})) Object.create() 使用指定的原型对象和属性创建一个新对象。旧对象新属性新对象 这个是把属性挂到原型上&#xff0c;…

软件产品研发过程 - 二、概要设计

软件产品研发过程 - 概要设计 相关系列文章 软件产品研发管理经验总结-管理细分 软件研发管理经验总结 - 事务管理 软件研发管理经验总结 - 技术管理 软件产品研发过程 - 二、概要设计 目录 软件产品研发过程 - 概要设计一、概要设计概述二、概要设计过程1、模块概述2、应用场景…

设计字体必备工具推荐:5款好用的字体设计软件

字体设计作为设计中的一个重要模块&#xff0c;如果字体软件选择正确&#xff0c;将给字体设计工作带来极大的便利&#xff0c;易于使用的字体设计软件&#xff0c;可以创造出优秀的排版设计。在日常工作中&#xff0c;设计师可能会在字体网站上下载字体&#xff0c;然后安装字…

记录 | linux静态库和动态库的理解

hello.cpp&#xff1a; #include <cstdio>void hello() {printf("Hello, world!\n"); }main.cpp&#xff1a; #include <cstdio>void hello();int main() {hello();return 0; }静态库编译配置&#xff1a; cmake_minimum_required(VERSION 3.12) proj…

【AI数字人-论文】DINet论文解读

DINet 方法形变修补损失函数perception lossGAN lossLip-sync loss 实现细节参考 如下图所示&#xff0c;人脸视觉配音&#xff08;Face visually dubbing&#xff09;旨在根据输入的驱动音频同步源视频中的嘴型&#xff0c;同时保持身份和头部姿势与源视频帧一致。然而在少样本…

DTCC2023大会-基于eBPF观测数据库-附所有PPT下载链接

DTCC2023大会-基于eBPF观测数据库-附所有PPT下载链接 8月16日—18日,第14届中国数据库技术大会(DTCC-2023)在北京国际会议中心举行。聚好看在大会上首次发布基于eBPF观测数据库性能的产品DBdoctor&#xff0c;受到了业界广泛的关注。近期几位业内同仁过来要大会的PPT&#xff…

Shopify二次开发之五:元字段(Metafields)

解释 Shopify Metafields 是一种用于存储和管理自定义数据的功能。它们允许商户在商城中的产品、订单、客户、Page等对象上添加自定义字段&#xff0c;以满足特定业务需求。 操作 1、添加Custom data 可以为Products、Pages添加自定义数据&#xff0c;比如选择了Pages&#…

使用pandas制作图表

数据可视化对于数据分析的重要性不言而喻&#xff0c;一个优秀的图表有足以一眼就看出关键所在。pandas利用matplotlib实现绘图。能够提供各种各样的图表功能&#xff0c;包括: 单折线图多折线图柱状图叠加柱状图水平叠加柱状图直方图拆分直方图箱型图区域块图形散点图饼图多子…

网络和Linux网络_11(数据链路层)以太网(MAC帧)协议+局域网转发+ARP协议

目录 1. 以太网协议 1.1 MAC地址 1.2 以太网帧格式 2. 局域网转发原理 2.1 数据碰撞和交换机 2.2 最大传输单元MTU 3. ARP协议 3.1 ARP协议格式 3.2 模拟APR协议工作过程 3.3 ARP缓存表 4. 重看TCP/IP四层模型 本篇完。 1. 以太网(MAC帧)协议 网络层的IP协议并不是…

怎么下载抖音视频无水印?教你三个无水印下载抖音视频方法

怎么下载抖音视频无水印&#xff1f;抖音已经成为了我们日常生活与工作的无法割舍的一部分&#xff0c;每天数以亿计的用户在进行创作分享。在这个平台上&#xff0c;用户可以通过自己的所见所想进行创作和分享记录美好瞬间。然而&#xff0c;有些用户希望能够将自己喜欢的抖音…

PHP:解决一个字符串中的斜杠 / 进行 JSON 编码时,斜杠被转义为 \/

一、修改前 问题代码 直接通过JSON编码&#xff0c;就会出现问题 代码 $url SO/.$fileName; echo json_encode($url); 效果 二、解决后 代码 使用 json_encode 函数的第二个参数 JSON_UNESCAPED_SLASHES 来禁止对斜杠进行转义 $url SO/.$fileName; echo json_encode…

电力仪表在工厂车间设备电能管理系统的设计-安科瑞黄安南

摘 要&#xff1a;基于车间用电设备的电能管理系统架构思路及实施方法&#xff0c;从硬件和软件方面对此方法进行了阐述。对车间旧设备改造以及新的电能管理系统提供一种思路和便捷的方法。 关键词&#xff1a;电能管理系统&#xff1b;多功能电力仪表&#xff1b;PLC&#x…

【后端】JVM 远程调试

前言 再好的代码,也还是有瑕疵的,不是代码不给力,是线上问题太牛逼太玄幻。这不刚部署就出现了问题,幸好还是测试的时候,早点发现早点解决,不给任何人带来不必要的损失,是我做人的原则,只要钱到位,任何问题都不是问题。 JVM 远程调试 不得不说 IDEA 和 宝塔配合是真…

【FastApi】—— uvicorn启动程序出现端口冲突

文章目录 &#x1f356; 前言&#x1f3b6;一、问题描述✨二、更改方案&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 【FastApi】—— uvicorn启动程序出现端口冲突 &#x1f3b6;一、问题描述 描述&#xff1a; INFO: Will watch for changes …