Chrome 代码调试技巧

Chrome 开发者工具提供了强大的代码调试功能,掌握这些技巧可以显著提高你的开发效率。以下是一些实用的调试技巧:


## 1. 断点调试基础


### 源代码面板断点

在 Sources 面板中,你可以通过点击代码行号来设置断点。当代码执行到断点位置时,执行会暂停,你可以检查当前的变量状态。


### 条件断点

右键点击行号,选择"Add conditional breakpoint",输入一个表达式。只有当表达式计算结果为 true 时,断点才会被触发。这对于只想在特定条件下调试代码非常有用。


```javascript

// 例如,只有当 i 的值为 5 时才触发断点

// 在条件断点中输入: i === 5

for (let i = 0; i < 10; i++) {

console.log(i);

}

```


### DOM 变化断点

在 Elements 面板中,右键点击 DOM 元素,选择"Break on"菜单项,可以设置在元素属性变化、节点移除或子树修改时触发断点。


## 2. 高级断点技巧


### 事件监听器断点

在 Sources 面板的右侧面板中找到"Event Listener Breakpoints"部分,你可以选择在特定的事件触发时暂停执行,比如点击事件、键盘事件等。


### XHR/Fetch 断点

在 Sources 面板中找到"XHR/fetch Breakpoints",可以在网络请求时暂停执行。你可以按 URL 过滤,只在特定 URL 的请求时触发断点。


### 异常断点

在调试器面板中点击"Pause on exceptions"按钮(蓝色暂停图标),可以在代码抛出异常时自动暂停执行,这对于捕获难以发现的错误特别有用。


## 3. 控制台调试技巧


### console 方法

除了常见的 `console.log()`,还有很多实用的控制台方法:


```javascript

// 以表格形式展示对象数组

console.table([{name: 'John', age: 25}, {name: 'Jane', age: 30}]);


// 创建分组

console.group('用户信息');

console.log('姓名: John');

console.log('年龄: 25');

console.groupEnd();


// 计时操作

console.time('操作耗时');

// 某些耗时操作...

console.timeEnd('操作耗时');


// 条件输出,只在条件为 false 时输出警告

console.assert(1 === 2, '这个断言会输出警告');

```


### $0, $1, $2...

Chrome 开发者工具会记住你最近在 Elements 面板中检查的元素,你可以在控制台中使用 $0 引用最近检查的元素,$1 引用上一个检查的元素,以此类推。


## 4. 调试时的实用快捷键


- **F8**: 继续执行(当代码在断点处暂停时)

- **F10**: 单步执行(不进入函数内部)

- **F11**: 单步进入(进入函数内部)

- **Shift + F11**: 单步跳出(从当前函数返回)

- **Ctrl + Shift + P**: 打开命令菜单,可以快速访问各种功能


## 5. 性能调试


### 性能分析器

在 Performance 面板中,你可以录制页面执行并分析性能瓶颈。


### 内存分析

使用 Memory 面板可以拍摄内存快照,分析内存泄漏问题。


```javascript

// 在代码中手动触发垃圾回收前后获取内存快照比较

// 在控制台执行

// 注意:需要启用开发者工具的高级设置中的"显示垃圾回收按钮"

```


## 6. 黑盒脚本


将第三方库添加到"黑盒"中,这样调试时就不会步入这些库的内部代码。在 Sources 面板中,右键点击脚本,选择"Add script to ignore list"。


## 7. 调试复杂应用的技巧


### 本地覆盖

使用 Sources 面板中的 Overrides 功能,可以在本地编辑网站的文件,并在刷新后保留更改,这对于调试生产环境的代码非常有用。


### Workspace

将本地项目文件夹添加到工作区,可以直接在 Chrome 开发者工具中编辑源文件,并立即看到更改效果。


### 保存和恢复应用状态

可以使用 `console.save()` 和 `console.restore()` 自定义函数来保存和恢复复杂的应用状态:


```javascript

// 保存状态到控制台

console.save = function(data, filename) {

const blob = new Blob([JSON.stringify(data, null, 2)], {type: 'application/json'});

const a = document.createElement('a');

a.download = filename || 'console-data.json';

a.href = URL.createObjectURL(blob);

a.click();

};


// 使用: console.save(complexAppState, 'app-state.json');

```


掌握这些调试技巧需要时间和实践,但它们将极大地提高你的开发效率和代码质量。通过有针对性地使用这些工具,你可以更快地定位和解决问题,而不是依赖猜测和大量的 console.log 语句。