文章插图
为什么要使用 debugger这篇文章将介绍如何使用断点来进行 JAVAScript 调试 。在读这篇文章之前 , 需要问一个问题:为什么要使用断点来进行调试?
我们首先需要认可使用断点的是必要的 , 否则下文介绍的所有断点调试方法都会是废话 。console.log 是前端开发最常用的调试手段 , 它简单直接解决一部分问题 。但当遇到十分复杂的问题 , console.log 就会变得不趁手 。比如:
- 一个逻辑复杂的算法
- 一个复现步骤十分繁琐的bug 。
- 一段运行流程冗长的代码
- 一段没有注释、起名随意的代码
- server 端代码
在这些情况下 , 断点调试是非常有价值的 , 将 debug 的时间复杂度从 O(n) 降到 O(1) , 让搬砖更快乐 。
这是文章的内容大纲:
- Chrome debugger 基本用法
- VS Code 调试 SPA 应用
- Chrome 调试 Nodejs
- VS Code 调试 Nodejs
Chrome debugger 基本用法最简单的断点调试 , 就是在代码中加一句 debugger , 然后到浏览器中刷新页面 , 这时候浏览器就会在 debugger 语句那停止执行 。
为了方便理解 , 引入一个简单例子 , 在一个文件夹中创建 index.html 和 index.js , 然后在 index.html 中引入 index.js 。index.js 内容如下:
// 国际惯例 , hello world 。const greet = () => {const greeting = "hello debugger";// 浏览器执行到这里将会暂停debuggerconsole.log(greeting); };greet();console.log("js evaluation done");
执行命令:npm i -g serve serve .
然后访问 http://localhost:5000并打开开发者工具 。这时候我们的 hello world 断点就打上了 , 就像这样:
文章插图
图中分为四个区域 , 蓝色区域用于文件选择 , Page 一栏是指当前页面中的 JS 文件 , Filesystem 会显示我们系统中的文件 。通常我们使用 Page 。
粉色是代码的行号和内容 。代码的行号处可以通过点击来添加新的断点 , 再次点击后取消 。
黄色区域用于控制代码的执行 , 只需要掌握前四个按钮的含义 , 就可以应付绝大多数场景 。按钮1是让代码继续执行(resume) , 如果遇到下一个断点就会再次中断执行 。按钮2可以让浏览器执行当前行(图中是第3行) , 然后在下一行中断代码 , 按钮3是进入当前函数 , 查看函数具体内容 。假设我们当前停在第7行 greet() , 点击按钮3就会进入 greet 方法中(也就是第2行) 。如果不想再看 greet 方法了 , 就点击按钮4 , 跳出这个方法 , 回到第8行 。
绿色区域可以查看变量的内容和当前的调用栈 。
debugger 是最简单粗暴的打断点方式 , 但是需要修改我们的代码 。需要注意的是 , 上线前必须删除这些语句 。也可以通过配置 webpack 来自动去除 。不过终究还是有些不方便 , 所以我们来看下如何通过 vscode 来简化打断点的方式 。
VS Code 调试 SPA 应用首先我们使用 Vite 来创建一个 Vue 应用用于演示(React步骤类似) 。
# 创建 vut-ts 应用 npm init vite cd hello-vite npm install # 调用 VS Code cli 打开项目 , # 或者手动在 VS Code 打开 。code . npm run dev
然后在 VS Code 中新建一个文件 .vscode/launch.json , 填入这些内容:{"version": "0.2.0","configurations": [{"type": "pwa-chrome","request": "launch","name": "Launch Vue project",// 这里填入项目的访问地址"url": "http://localhost:3000","webRoot": "${workspaceFolder}"},] }
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 13个JavaScript 一行程序,让你看起来像个专家
- JavaScript 数组操作必须熟练运用的 10 个方法
- Linux如何远程拷贝,限速和断点续传
- Javascript 中New 操作符 解读
- 使用虚拟串口远程调试设备
- javascript10个实用小技巧
- C语言的调试利器 - printf 大法,无坚不摧,攻无不破
- JavaScript 中的“提升”是怎么回事?
- 如何远程debug进行调试?
- JavaScript 如何检测文件的类型?