首页/文章/前端

你知道怎么调试线上代码吗

2024-01-01
11704 分钟
...

这篇文章是学习了神说要有光的调试小册的学习笔记:前端调试通关秘籍 - zxg_神说要有光 - 掘金小册

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

什么时候需要调试线上的代码呢,当线上代码出现 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");


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:

下面手动创建一个 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>

在浏览器中打开:

代码正确执行

现在往代码里添加一个 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 ""; 
	}
};

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

刷新浏览器:

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

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

使用 sourcemap

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

修改 webpack 配置文件:

const path = require("path");


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

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

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

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

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

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

可以换个 devtool 配置:

const path = require("path");


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的选项

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

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

总结:

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

在此再次致敬zxg_神说要有光,在他这里学到了很多

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
前端2026-07-17
HTML Form 可以把 POST 响应加载进 iframe
在接入支付验证、身份认证或第三方授权页面时,我们经常会遇到这样的流程: 1. 后端返回一个第三方接口地址。 2. 这个地址必须通过 请求访问。 3. 接口返回 HTML,或者重定向到真正的验证页面。 4. 验证页面需要嵌入当前网站,而不是打开新标签页。 5. 验证完成后,当前页面继续执行后续业务。 第一次遇到这个需求,很容易想到: 但涉及第三方支付时,这种方式通常会遇到 CORS、Cookie、重定向和跨域页面读取限制。 实际上,HTM...
学习
前端2026-05-29
前端判断一个网页是否允许被 iframe 内嵌
前端 不能 100% 准确提前判断 一个网页是否允许被 iframe 内嵌,因为决定权主要在目标网站返回的 HTTP 响应头 里,而普通前端 JS 通常读不到跨域页面的响应头。 核心判断看这两个东西: 1. 老一点但仍常见。 表示完全不允许被 iframe 嵌入。 表示只允许同源页面 iframe 嵌入。 以前有这个,但现代浏览器支持很差,基本不建议依赖。 2. 现在更推荐看这个。 表示不允许任何页面嵌入。 表示只允许同源嵌入。 表示只...
学习
前端2026-03-20
网页唤起 Android App 调试笔记(App Links)
&nbsp; 在最近的项目中,我遇到了 网页访问特定 URL 应该唤起 Android App,但实际只打开网页 的问题。通过调试和排查,整理出以下经验和步骤。 1\. 项目与环境信息(脱敏处理) 网站域名: 唤起页面: Android App 包名: intent filter 配置示例: assetlinks.json 已上线,包含 App 的 SHA256 签名指纹 2\. 问题现象 用户访问 页面时, 网页打开了,但 App 没...
学习
前端2026-03-02
深入理解 Cookie:安全属性、访问边界与渲染场景实践
本文系统梳理 Cookie 核心机制,聚焦 HttpOnly/SameSite 等安全属性 、 访问权限边界 、 CSR/SSR 差异 ,附关键代码示例与安全清单。适合开发查阅与知识沉淀。 一、Cookie 是什么?为什么需要它? HTTP 是无状态协议。Cookie 是服务端通过 响应头下发、浏览器自动存储并在后续 同源请求中携带 的小型文本数据(通常 ≤4KB),用于: 会话维持(Session ID) 用户偏好(语言/主题) 跨请...
学习
前端2026-03-02
退出登录时 Cookie 清除指南
核心结论 :登出 ≠ 单方面操作。HttpOnly 与非 HttpOnly Cookie 需 前后端协同清除 ,缺一不可。残留 Cookie = 安全隐患 + 用户体验漏洞。 🔒 为什么不能“一键清空”? 浏览器出于安全设计: 后端 :只能通过 响应头清除 自己设置过 的 Cookie(需属性完全匹配) 前端 JS :可读写非 HttpOnly Cookie,但 无法触碰 HttpOnly Cookie 无“清除全部”API :任何服...
学习
前端2025-12-15
懒加载图片在同一个 Item 中逐个出现的原因与解决方案
懒加载图片在同一个 Item 中逐个出现的原因与解决方案 适用场景 :使用原生 实现图片懒加载的动态列表,每个列表项(item)包含多张图片。 📌 问题描述 在开发一个动态渲染的列表时,每个 item 中包含三张图片,并使用 HTML 原生的懒加载属性: 观察到的现象: 开启懒加载时 :三张图片 不是同时出现 ,而是 从左到右(或从上到下)依次加载显示 ,有明显的时间差。 关闭懒加载(移除 )后 :三张图片 看起来是一起出现的 ,视觉...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录