Firefox 开发者工具中更快速、更智能的 JavaScript 调试

脚本调试是 Web 开发者工具箱中最强大和复杂的生产力功能之一。如果做得好,它可以帮助开发者快速有效地修复错误。因此,对于我们 Firefox 开发者工具团队来说,问题是 Firefox 开发者工具是否做对了?

我们一直在倾听来自社区的反馈。最重要的是,我们听到了对更高的 **可靠性** 和 **性能** 的需求;尤其是在现代 Web 应用中。此外,脚本调试是一项难以学习的技能,它应该在不同的浏览器中以类似的方式工作,但由于功能和 UI 的差异,它并不一致。

考虑到这些痛点,开发者工具调试团队 - 在我们勤劳的 开发者社区 的帮助下 - 进行了无数次更新,以设计更有效的调试体验。这项工作仍在进行中,但 Firefox 67 标志着一个重要的里程碑,我们想重点介绍一些出色的改进和功能。我们邀请您 打开 Firefox Quantum:开发者版,在下面的示例和您的项目中尝试调试器,并告诉我们您是否注意到差异。

坚如磐石的调试体验

快速可靠的调试是许多较小交互的结果。从初始加载和源映射到断点、控制台记录和变量预览,一切都需要让用户 感觉 稳固而响应迅速。调试器应该是一致、可预测的,并且能够理解常见的工具,如 webpackBabelTypeScript

我们自豪地说,所有 这些领域在过去几个月都得到了改进。

  1. 更快的加载时间。我们消除了使调试器打开速度变慢的最糟糕的性能下降。这导致我们的 性能测试套件 速度提高了 30%。我们将在以后的文章中分享更多关于我们性能探索的内容。
  2. 出色的源映射支持。一个经过改造且 更快的 源映射后端完美地营造了您正在调试 您的 代码,而不是来自 BabelWebpackTypeScriptvue.js 等的编译输出的错觉。
    生成正确的源映射可能具有挑战性,因此我们还为构建工具(例如 babelvue.jsregenerator)贡献了补丁 - 使整个生态系统受益。
  3. 当调试器未处于焦点时降低开销。无需再担心保持开发者工具打开!我们在调试器处于后台时找到了并删除了许多在调试器中运行的昂贵计算。
  4. 可预测的断点、暂停和单步执行。我们修复了许多调试器架构中长期存在的错误,解决了与丢失断点、在错误的脚本中暂停或单步执行美化后的代码相关的最常见和最令人沮丧的一些问题。
  5. 更快的变量预览。由于我们更快的源映射支持(以及大量额外工作),当您在执行暂停时将鼠标悬停在变量上时,预览现在显示得更快。

这些只是几个亮点。我们还解决了无数的 错误完善 问题。

展望未来

最重要的是,我们必须保持高质量的标准,我们将在我们的计划中明确地留出时间来完善。在用户反馈的指导下,我们打算利用这段时间来改进新功能和现有功能。

其次,对我们的 性能正确性 测试的持续投入确保了不断变化的 JavaScript 生态系统,包括各种框架和编译语言,都得到了我们工具的良好支持。

使用新功能调试所有内容

找到并暂停在正确的位置对于理解错误至关重要。这应该感觉毫不费力,因此我们仔细检查了自己的工具 - 并研究了其他工具 - 以为您提供最佳的体验。

用于精细暂停和单步执行的内联断点

Inline handlers are the perfect match for the extra granularity.

为什么断点应该在行上操作,而行可以包含多个语句?借助内联断点,现在比以往更容易调试压缩的脚本、箭头函数和链式方法调用。了解有关 MDN 上断点的更多信息尝试演示

日志点结合了控制台和调试器的强大功能

Adding Logpoints to monitor application state.

控制台日志记录,也称为 printf() 调试,是一种快速简便的观察程序流程的方法,但它很快就会变得乏味。日志点通过在正在运行的应用程序中动态注入 console.log() 语句来打破这种令人厌烦的编辑-构建-刷新循环。您可以停留在浏览器中并监控变量,而无需暂停或编辑任何代码。了解有关 MDN 上日志点的更多信息

为 JavaScript 工作线程提供无缝调试

The new Threads panel in the Debugger for Worker debugging

Web 工作线程 为现代 Web 提供动力,需要成为开发者工具中的头等概念。使用新的 线程 面板,您可以在不同的执行上下文中切换并独立暂停它们。这允许在同一个调试器面板内调试工作线程及其脚本,类似于其他现代浏览器。了解有关 MDN 上工作线程调试的更多信息

源映射的人性化变量名称

调试捆绑和压缩的代码并不容易。由 Firefox 启动和维护的 源映射 项目弥合了在浏览器中运行的压缩代码与其原始的人性化版本之间的差距,但翻译并不完美。通常,压缩构建输出的某些部分会显露出来并打破错觉。我们可以做得更好!

From build output back to original human-readable variables

通过将源映射与 Babel 解析器 结合起来,Firefox 的调试器现在可以预览您关心的原始变量,并隐藏来自编译器和捆绑器的无关紧要的内容。这甚至可以在控制台中工作,自动将人性化的标识符解析为它们背后的实际压缩名称。由于它的性能开销,您必须 单独启用此功能,方法是在调试器的 作用域 面板中单击“映射”复选框。阅读 MDN 文档,了解有关 使用映射作用域功能 的信息。

接下来是什么

开发人员经常需要在浏览器之间切换以确保 Web 对每个人都适用,我们希望我们的开发者工具成为一种直观、无缝的体验。尽管浏览器在工具的相同广泛组织方面已达成一致,但我们知道功能和 UI 方面仍然存在差距。为了帮助我们解决这些差距,请 告诉我们您在日常工作中在浏览器之间切换时遇到的哪些问题。

您的意见非常重要

像往常一样,我们很乐意听到您对我们如何改进开发者工具和浏览器的反馈。

虽然所有这些更新将在下周发布的 Firefox 67 中准备好供您试用,但我们在 Firefox 68 中对其进行了完善,并添加了一些新功能。下载 Firefox 开发者版 (68) 立即试用最新的开发者工具和平台更新。

关于 Harald Kirschner (digitarald)

Harald "digitarald" Kirschner 是 Firefox 开发者体验和工具的产品经理——致力于赋能创作者,让他们能够编写、设计和维护一个对所有人开放且可访问的网络。在 Mozilla 工作的 8 年间,他在性能、Web API、移动、可安装 Web 应用、数据可视化和开发者推广项目中不断提升自己的技能。

Harald Kirschner (digitarald) 的更多文章……


31 条评论

  1. Billal BEGUERADJ

    出色的源映射支持。

    嗯……与 Google Chrome 相比,我不确定。

    Billal BEGUERADJ

    2019 年 5 月 17 日 凌晨 3:00

    1. Harald Kirschner (digitarald)

      什么类型的项目不适合您?生成的源映射有许多不同的风格和怪癖,因此我们正在扩展以涵盖更多边缘情况。

      2019 年 5 月 17 日 上午 9:59

  2. Saru

    抱歉,但 Chrome 的开发者工具要好得多。

    2019 年 5 月 17 日 上午 4:57

    1. Harald Kirschner (digitarald)

      Saru 说得有道理,确实有一些领域 DevTools 投入了更多精力并取得了领先;因此,根据您的情况以及您的经验/培训,某些工具可能比其他工具感觉更好。我希望您能有机会尝试我们的改进,并也许对您体验到的差距提出具体反馈。

      2019 年 5 月 17 日 上午 9:58

  3. Vincent

    很高兴看到内联调试支持。做得很好!

    2019 年 5 月 17 日 下午 12:28

  4. artalar

    感谢您的辛勤工作!
    现在是尝试使用 Firefox 作为我的开发环境的时候了。

    2019 年 5 月 17 日 下午 10:14

  5. Olga

    我喜欢 Logpoints 的想法。断点很棒,但有时它们还不够(例如拖放调试)。我已经切换到 Firefox 来用于我的个人事物。我需要抽出时间学习如何将其用于我的工作。

    2019 年 5 月 17 日 下午 11:05

  6. Yoh Adams

    很酷,很酷,但你们什么时候会添加查看 WebSockets 帧内部的功能?

    2019 年 5 月 17 日 下午 11:42

    1. Harald Kirschner (digitarald)

      工作已经开始,预计将在 70 版本或 69 版本中准备好。

      2019 年 5 月 20 日 上午 8:46

  7. Edmund

    很棒的功能!我今天会试试。

    2019 年 5 月 18 日 上午 3:16

  8. Mark

    看起来很棒,迫不及待想试试,很高兴能有一个替代 Google 巧克力工厂,它可能会把你的调试算法卖给出价最高的广告商……感谢你所有的辛勤工作。

    2019 年 5 月 19 日 下午 11:59

  9. Ivan Enderlin

    做得很好,恭喜!感谢你付出了这么多努力!

    2019 年 5 月 21 日 上午 0:17

  10. Rafael Ramalho

    大家好。你们可以尝试专注于改进网络选项卡体验吗?在复杂的 JSON 结构中导航并搜索响应中的特定键/值对非常困难。

    如果不是因为这个,我不会切换回 Chrome。

    2019 年 5 月 21 日 上午 2:40

    1. Harald Kirschner (digitarald)

      我已经提交了 https://bugzilla.mozilla.org/show_bug.cgi?id=1553201,但我找不到解决问题的办法。也许你可以在问题或这里发表评论。

      我们在响应的所有面板中都启用了搜索。可能是缺少匹配搜索标记的突出显示导致这种情况更难?

      2019 年 5 月 21 日 上午 8:51

  11. Da Scritch

    做得很好,但是源映射似乎仍然存在 Google(很意外?)Closure Compiler 的错误。

    示例:https://github.com/dascritch/cpu-audio/blob/master/dist/cpu-audio.jshttps://github.com/dascritch/cpu-audio/blob/master/dist/cpu-audio.js.map

    级别 = SIMPLE
    –isolation_mode=IIFE
    带有多行注释的前言(参见 make.sh)

    2019 年 5 月 21 日 上午 8:04

    1. Harald Kirschner (digitarald)

      感谢您提供详细的报告。在提交错误报告时:https://bugzilla.mozilla.org/show_bug.cgi?id=1553374,但我注意到在线演示不包含源映射。我假设为了测试,该项目需要在本地构建?也许你可以在问题中发表评论,如果还有更详细的步骤。

      2019 年 5 月 21 日 下午 9:43

    2. FnLn

      很酷。如果 FF 调试器能够赶上 Chrome,对我来说将会是一个巨大的改变。我喜欢日志。堆栈跟踪中的映射非常有用。新的网格和 Flexbox 调试器也很棒。继续努力吧!

      2019 年 5 月 27 日 下午 3:49

  12. Aslan

    用户体验怎么样?你们什么时候会改进用户体验?

    2019 年 5 月 22 日 上午 1:00

    1. Harald Kirschner (digitarald)

      是的,每个版本都会改进——有时改进更明显,有时只是完善交互。您心中是否有具体的想法?

      2019 年 5 月 22 日 上午 6:56

  13. MikeyB

    该死的 Harald。你宣布几年来的辛勤工作终于发布了,而每个人却只是抱怨其他事情。我现在就想愤怒地辞职了。

    2019 年 5 月 22 日 下午 2:53

    1. Harald Kirschner (digitarald)

      哈哈,这太棒了,感谢你的关心,Mikey!随着 Web 平台不断发展,开发人员能够将更多产品引入 Web,而工具生态系统也在不断变化;总会收到反馈。作为 PM,让我感到高兴的是,当我们能够识别出反复出现的主题并逐一解决它们时——就像我们对这里记录的工作所做的那样,以及在响应这篇文章时我在不同渠道收集到的反馈中反映的那样。

      2019 年 5 月 22 日 下午 4:31

  14. Wykks

    做得很好!快了,但对我来说还不够。
    两件“主要”事情
    WebSockets 支持。
    性能选项卡中的源映射支持。目前,使用 Angular 等 JS 框架时,它完全无法使用。(还需要能够在火焰图中单击。)

    2019 年 5 月 23 日 上午 6:59

    1. Harald Kirschner (digitarald)

      WebSockets 将会回归。

      我们正在考虑为新的性能面板添加 SM 支持。我可以看到它目前不适用于框架,因此我们会在工作中确保考虑到这种用例。

      2019 年 5 月 23 日 上午 9:41

  15. Rafael Corrêa Gomes

    我将开始更多地使用 Firefox,主要用于调试 JS 检查这些新功能。

    2019 年 5 月 23 日 上午 8:08

  16. 匿名

    Firefox 开发者工具无法通过检查传入和传出消息来调试 WebSockets 和服务器发送事件。postMessage 也是如此。

    2019 年 5 月 26 日 上午 2:37

    1. Harald Kirschner (digitarald)

      是的,这已经是一个存在很久的缺点了——对用户来说更是如此,因为我们在 Firefox Quantum 之前有很棒的 WebSocket 调试功能。它将回归!工作已经开始,将在 70 版本中发布。这项工作是在考虑服务器发送事件的情况下编写的,因此我们希望很快能跟进,支持该功能。

      2019 年 5 月 29 日 上午 9:41

  17. Thomas

    好消息,工作做得很好!
    Firefox 中的服务工作者可检查性有什么时间表?或者我是否找错了地方,它已经存在?

    2019 年 5 月 29 日 上午 4:06

    1. Harald Kirschner (digitarald)

      about:debugging 目前包含了它的主要功能。现在正在进行工作(位于首选项 devtools.application.enabled 后面),以实现类似 Chrome 的应用程序面板。我们希望在 70 版本中将此功能提供给用户。

      2019 年 5 月 29 日 上午 9:30

  18. David

    在最近的更新(Quantum 67)中,我无法再调试任何会话相关的脚本。
    现在,调试器的 js 源文件似乎加载在当前浏览器会话之外。因此,我无法调试任何依赖于用户会话的 js……

    2019 年 6 月 3 日 上午 2:07

    1. Harald Kirschner (digitarald)

      David,您可以在 DevEdition 中尝试一下,看看是否能解决这个问题——如果不行,还可以尝试 Nightly——如果 Nightly 也出现问题,请提交错误 https://bugzilla.mozilla.org/enter_bug.cgi?我们已经发现了一些由修复旧源加载错误引起的新源加载相关问题——其中一些问题已经修复——并将尝试在 DevEdition 中进行更多修复。

      2019 年 6 月 3 日 上午 6:57

      1. David

        不幸的是,开发者版和 Nightly 版都没有修复此问题。

        我已经提交了错误报告。

        但我真的很喜欢开发者版!

        2019 年 6 月 4 日 上午 7:06

本篇文章的评论已关闭。