使用 Sources 面板来调试 JavaScript。在开始调试之前,你可以先了解 Lynx 的 JavaScript 运行环境。
启用 DevTool 后,后台线程默认使用 PrimJS 引擎来进行调试。在 Android 端,你也可以切换到 V8 引擎来获得更完整的调试体验。
打开 DevTool 开关页面,将“V8 引擎”切换为“On”并重启应用,即可在后台线程使用 V8 引擎。你可以在预览窗口的左下角查看当前的引擎类型。
Sources 面板主要分为以下三个区域:
可以使用文件导航窗格或 Open file 功能来打开感兴趣的文件。
可以在这里输入文件 URL,或在下拉列表中选择文件。
代码编辑窗格的底部操作栏中会显示当前鼠标位置的行列号。
可以通过以下方式来关闭文件:
当你想快速定位当前代码编辑窗格中展示的文件在文件导航窗格中的位置时,可以按照下列步骤操作:
当你想快速查找代码段所属的文件时,可以按照下列步骤操作:
你也可以:
通过添加断点,你可以在代码执行过程中暂停,并且能够检查这个时刻的所有相关值。
目前支持的断点类型如下:
类型 | 描述 |
---|---|
代码行 | 在确切的代码区域中暂停 |
条件代码行 | 在确切的代码区域中暂停,但仅当某些条件为真时 |
日志代码行 | 将消息记录到 Console ,而不会暂停执行 |
首行 | 在首个被执行的 JavaScript 文件的首行暂停 |
异常 | 在引发异常的代码行暂停 |
请参考代码中的代码行断点 | Chrome DevTools。
右键单击断点图标,或使用 Breakpoints 窗格来管理代码行断点。
右键单击断点标记,选择 Edit breakpoint,可以进行进行修改,也可以从编辑对话框的下拉列表中更改其类型。
再次单击断点标记,可以删除该断点。
在 Breakpoints 窗格中,点击断点条目旁边的复选框以启用或停用该断点。停用断点后,行号旁的标记会变为透明。
右键单击断点标记,可以查看功能选项菜单:
右键单击 Breakpoints 窗格中的断点条目,可以查看功能选项菜单:
请参考使用“一律不在此处暂停”跳过断点 | Chrome DevTools。
开启首行断点,可以在每个被执行的 JavaScript 文件的入口处暂停。
鼠标悬停在下图位置,然后开启 First-Line Breakpoints。这是一个非持久化的全局开关,开启后在一次 APP 运行过程中对所有页面生效,关闭 APP 并重新打开后,开关状态会失效。
通过以下两种方式来调试首行断点:
当你想在引发异常的代码行上暂停时,可以使用异常断点。
目前 PrimJS 引擎不区分是否为捕获的异常,所有异常都会暂停。V8 引擎会区分是否为捕获的异常。
默认情况下,只可调试后台线程,如果需要调试主线程,请参考下文调试主线程 JavaScript 代码。
一旦你的代码暂停,可以一次一行地单步执行,并在此过程中查看控制流和属性值。
请参考运行某一行代码之前的所有代码 | Chrome DevTools。
要在暂停后停止继续执行 JavaScript,请长按 Resume 按钮,然后选择 Terminate script execution 按钮。
例如,本例中,选择 Terminate script execution,则程序停止执行,即 add
函数中的代码都不会被执行,可以看到 count
的值不会发生变化。
请参考查看和修改局部、闭包和全局属性 | Chrome DevTools。
当程序暂停在代码行上时,可以使用 Call Stack 窗格查看此刻的调用堆栈。
单击窗格中的条目可跳转到调用该函数的代码行,蓝色箭头图标指出了当前正在高亮的代码。
右键单击 Call Stack 窗格中的任意位置,然后选择 Copy stack trace,则能够将当前调用堆栈复制到剪贴板。
例如,本例中,复制的堆栈如下:
在调试时忽略某些脚本以跳过它。忽略时,脚本在 Call stack 窗格中会隐藏,当你单步执行代码时,永远不会进入被忽略的脚本的函数。
请参考从“编辑器”窗格中忽略脚本 | Chrome DevTools。
请参考在“调用堆栈”窗格中忽略脚本 | Chrome DevTools。
如果需要查看完整的调用堆栈,请在 Call Stack 窗格中点击 Show ignore-listed frames,然后被忽略的帧会被展开,但显示为灰色。
忽略脚本后,再次通过上述两种途径,选择 Remove from ignore list 即可取消忽略。
此外还可以通过代码编辑窗格上方的提示来取消忽略。
请参考监控自定义 JavaScript 表达式的值 | Chrome DevTools。
在代码编辑窗格中,可以浏览和修改代码。
单击编辑器底部操作栏的 {}
,Sources 面板会以美观的格式展示被压缩的文件,提高可读性。
只可以修改编译后的 JavaScript 文件,通过 SourceMap 反解出的原始文件不可修改,且页面刷新后修改内容不会保存。
请参考在脚本中搜索和替换文本 | Chrome DevTools。
替换完成后,需要手动保存脚本,参考上文修改脚本。
配置 SourceMap 后,你可以直接在 Sources 面板中调试你编写的原始代码。
当你打开 DevTool 时,它会尝试加载 SourceMap(如果有)。
加载成功时,在文件导航窗格中,橙色文件夹的部分即为原始源文件。
如果加载失败或 SourceMap 存在问题,Console 中会记录类似以下内容的错误。
当你打开任何编译后的文件时,DevTool 都会通知你是否找到了 SourceMap。
你可以通过以下方式来手动加载 SourceMap:
主线程的调试方式与后台线程基本相同,但需要一些步骤来启用。
调试主线程,需要使用 rspeedy 在 dev 模式下启动项目。
你可以检查以下两项内容,以保证做好了前置准备:
debug-info.json
文件。
tasm.json
文件中,templateDebugUrl
字段是一个有效的 URL,其指向步骤一中提到的 debug-info.json
文件。参考 rspeedy.dev.assetprefix。
鼠标悬停在下图位置,然后开启 Main Thread Debugging。这是一个非持久化的全局开关,开启后在一次 APP 运行过程中对所有页面生效,关闭 APP 并重新打开后,开关状态会失效。
你可以按下列步骤来启用主线程调试:
main-thread.js
文件会展示在文件导航窗格(旧称 lepus.js
)。在 Threads 窗格中,可以切换调试主线程还是后台线程,蓝色箭头图标表示当前选定的线程,当前暂停的线程后面会显示 paused。