开发者社区

一个专业的开发者分享社区

JavaScript调试

我认为每个人在生活中都遇到过错误 -不是自然的,而是真正的错误-代码。实际上,即使是最有经验的程序员也需要提防错误。这些都是易于执行且令人讨厌的事情,如果您的代码库中从未有过这些,那么您可以认为自己很幸运。话虽如此,高级程序员与初学者相比,其bug较少是很自然的。你知道为什么?因为他们知道阻止他们发生的正确技术

调试过程是程序设计的本质。特别是在JavaScript等动态类型化语言中。这就是为什么在这篇文章中,我没有说服您连续5分钟使用TypeScript,而是让我们看一些可能的调试技术。只是要记住,可悲的是,它们首先不会帮助您减少错误,而不仅仅是改善调试/修复已经存在的错误的过程。所以,让我们开始吧!

Console.log()

这涉及到每一个JS开发者的心,当他听到这个词的第一件事“调试”是-最有可能的- console.log()。试想一下-发生错误时,您只需console.log()在代码中放入一系列代码,然后分析输出多少次?好吧,我认为这是JS调试中最流行的技术,也许是许多程序员唯一了解和使用的技术。你猜怎么着?-真的很好。鉴于它console.log()易于使用和理解,可以放置在代码中的任何位置,并且-考虑到您是在启用HMR的环境中开发项目的,因此您可以在旅途中顺利调试问题。造成这种情况的另一件事是,console.log()除几乎其他方法外,它只是一种方法,可以共同构成各种控制台API,满足许多程序员的可能需求(我在上一篇文章中已经写过所有这些方法)。

console.log("bug!");
console.table(["bug!", "bug!", "bug!"]);
console.assert("bug!");
console.trace("bug!");
// ...

但是,对代码库的持续干扰,重新编译的可能需求,最坏的情况下都没有HMR支持以及一些较小的问题,使我们努力寻找一种更好的方式来调试我们的代码。那么,如何调试却没有console.log()

开发工具

事实证明,在DevTools的帮助下,确实存在更好的解决方案。您肯定会经常使用它们,但很可能仅是检查日志或使HTML或CSS有点混乱。您可能知道这套工具可以做的更多,不是吗?但是,我想谈的功能是所谓的“断点” -另一种流行的调试技术。

就本文而言,我将使用Google Chrome,因为您也有80%的机会会使用它。但是,该过程在其他浏览器中看起来至少应该相似。因此,现在让F12进入我们的DevTools。在那里,转到“源”面板。在这里,如果您尚未更改默认布局,则应该看到文件导航器,代码编辑器,底部的控制台以及调试面板(这是我们的主要关注点)。

《JavaScript调试》

现在,如果术语“断点”对您没有任何意义,那么这里有一个简单的解释。这是代码中的一点,您想要停止执行(“破坏它”)并进行分析和调试。简单,但功能强大!我们来看一下…

首先,我们需要选择断点。我们可以从代码编辑器窗格中执行此操作,方法是选择要停止执行过程的行编号。您还可以使用调试窗格本身在选定的事件侦听器处放置断点,并将其打开和关闭。这是一个非常简单且轻松的过程。

《JavaScript调试》

要开始使用断点,您必须重新执行代码,很可能只是刷新页面。完成此操作后,所有断点将保留在原处并被激活。当到达给定的代码行(LOC)时,执行过程将停止

从那里您可以做各种各样的事情。您可以检查当前的调用堆栈(到达当前LOC所需执行的所有函数和东西),运行自定义表达式,检查当前范围内的所有可用值(无论是本地,全局还是其他),并全部执行对于任何线程(使用Web Workers时)。您必须同意-这肯定超出了console.log()处理能力。

控制和遍历断点也很容易。您需要的只是调试窗格顶部的控件栏,其中带有一些按钮。在这里,您可以遍历断点,开始和暂停代码执行,甚至可以逐表达式遍历代码。每个按钮都有一个内容丰富的图标和工具提示,因此您将始终知道使用什么。

《JavaScript调试》

VS代码

因此,我认为我们都可以同意DevTools和断点很酷。但是,如果我们想从最受欢迎的最受欢迎的代码编辑器VS Code进行调试,该怎么办?好吧,你猜怎么着?-也很容易!

首先,我们需要安装一个名为Debugger for Chrome的扩展。这将使我们能够在Chrome浏览器的帮助下正确调试JS应用。

《JavaScript调试》

安装扩展后,我们现在需要进入编辑器中的调试面板。在那里,我们迎来了一个非常整洁的UI,基本上提供了与DevTools相同的功能,但包装有所不同。

《JavaScript调试》

然后,我们必须创建我们的调试配置。为此,请使用齿轮图标并选择Chrome环境。新的launch.json文件将放置在.vscode目录中。在其中,我们可以指定不同调试配置的数量。正如生成文件中的注释所指示-让自动完成功能作为您的指南。话虽如此,在这里,我们将创建一个小而舒适的配置供我们使用。

假设我们已经start安装了NPM 脚本并可以使用了。我们有一个标准的,支持HMR的环境,可在上为我们的应用程序提供服务localhost。看一下相应的配置文件:

{
    "version": "0.2.0",
    "configurations": [

        {
            "type": "chrome",
            "request": "launch",
            "name": "Debug Chrome",
            "preLaunchTask": "npm: start",
            "url": "http://localhost:4000",
            "webRoot": "${workspaceFolder}"
        }
    ]
}

在这里,我们基本上要做的是npm start在运行调试器之前执行给定的脚本(注意语法),然后我们在本地主机端口4000上运行。这就是配置过程的真正简化!

为了运行调试器,您需要首先选择断点。这次可以在编辑器中完成,方法是单击行号旁边的。之后,只需选择正确的配置,点击开始按钮,就会打开新的Chrome窗口。从现在开始,您可以从打开的窗口的DevTools或VS Code本身中控制代码的执行和调试过程!请记住,要使调试在热重载后生效,您需要先重新加载调试器

《JavaScript调试》

现在,通过VS Code使用调试器,与标准DevTools相比,您可以使用一些其他选项。考虑preLaunchTask到我们之前使用的NPM脚本和属性,尤其如此通过利用这些,您可以轻松地预配置和自定义调试过程。就我而言,最有用的是TypeScript编译。如果要在VS Code调试器中使用TypeScript,请不要忘记在tsconfig.json中将该sourceMap属性设置为。它将大大改善您的调试体验true

Node.js

至此,我们几乎涵盖了所有可能在Web应用程序的日常调试中有用的内容。但是流行的Node.js运行时以及使用它的代码又如何呢?如何调试这种事情?

调试Node.js应用程序可能比您想象的要简单。例如,您不必在这里处理整个浏览器!但是,让我们暂时假设您真的不想立即进行调试,而不是拥有标准DevTools提供的这种美观,可扩展且交互式的控制台日志。信不信由你,如果您正在使用console.log()具有类似复杂,大型结构的对象(例如对象)的东西,则在终端中进行操作时,情况可能会很快变得很糟。

好消息是,从现在的许多Node.js版本开始,您实际上可以传递该--inspect标志,并且您已经准备好将DevTools用作控制台输出。

node --inspect main.js

只需在浏览器中转到about:inspect,您应该看到可用于调试的远程目标

《JavaScript调试》

除非您的应用在执行所有代码后没有立即关闭。如果是这种情况,请在代码中放入该LOC,以确保程序在执行结束时不会立即退出

process.stdin.resume();

当然,此技术仅允许您使日志感觉更好,但不一定以任何形式或方式调试它们。为此,我们需要回到VS代码,看看我们能做什么!

事实证明,VS Code 预先安装了Node.js调试器,这就是我们要使用的。只需将另一个配置对象添加到我们的configurations数组中,我们就应该完成…

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Debug Node.js",
            "program": "${workspaceFolder}/main.js"
        },
    ]
}

因此,您可以清楚地看到,type我们的配置等于"node",并且有一个program指向我们main.js文件的新属性。从那里,您可以运行调试器并执行您在上一个示例中可以做的所有事情。仅这次,没有打开外部浏览器窗口,您必须处理VS Code所提供的功能…除非将其与该--inspect技术结合使用。

最佳调试方式?

我们探索了在Web开发人员最常使用的两个环境中(通过控制台API或使用断点)来调试代码的最基本,最通用的方法-浏览器和代码编辑器。但是,您应该如何真正调试代码?

通常,这两种调试方法都已具备。附加功能只会改善它们。这就是为什么功能如断点可以根据环境的不同而有所不同。话虽如此,断点几乎总是更好的方法。它们不会直接干扰您的代码库,并且通过简单的选择即可提供更多信息。当然,控制台API仍然有用,尤其是在使用一些较小的代码段或执行一些“肮脏”的工作时

如果本文不适合您,那么我有更好的建议!怎么样…不首先创建错误?是的,有点不现实。但是,通过遵循良好的编码习惯,不断地测试您的代码并确保其通用的高质量标准,您至少可以将调试bug的机会降到最低。我们一定会在此博客的即将发布的帖子中对此进行探索…

意见?

因此,我知道本文可能会觉得很基础,甚至对初学者也很友好(如果确实存在)。但是,这是我的初学者的目标读者。那些渴望学习新事物并… 调试东西的人。而且,如果您是一位经验丰富的程序员,也许这篇文章只是让您考虑使用控制台API的频率,而不是一些替代的,可能更好的选择?

要了解我的所有最新内容,请考虑在TwitterFacebookReddit上关注我。如果您想支持我和我的工作,我也有一个YouTube频道(有关Web开发新闻的最新视频已发布!)和Patreon页面。你猜怎么着?-祝您度过“完美无瑕的一天”!

点赞
  1. Ernesthaill说道:
    您的评论现正待审。这是一份预览,您的评论将在被批准后显示。

    "You should take part in a contest for one of the highest quality websites online. I will recommend this site!"
    https://israelnightclub.com/apartments/%D7%93%D7%99%D7%A8%D7%95%D7%AA-%D7%93%D7%99%D7%A1%D7%A7%D7%A8%D7%98%D7%99%D7%95%D7%AA-%D7%91%D7%99%D7%A8%D7%95%D7%A9%D7%9C%D7%99%D7%9D/

  2. Ernesthaill说道:
    您的评论现正待审。这是一份预览,您的评论将在被批准后显示。

    "Everything is very open with a very clear explanation of the challenges. It was definitely informative. Your site is extremely helpful. Thanks for sharing!"
    דירות דיסקרטיות בחיפה

  3. Ernesthaill说道:
    您的评论现正待审。这是一份预览,您的评论将在被批准后显示。

    "Hello! I just want to give you a huge thumbs up for the excellent information you have here on this post. I am coming back to your site for more soon."
    דירות דיסקרטיות בירושלים

  4. Ernesthaill说道:
    您的评论现正待审。这是一份预览,您的评论将在被批准后显示。

    "A motivating discussion is worth comment. I believe that you ought to write more about this subject, it may not be a taboo matter but generally people don't talk about these topics. To the next! Cheers!!"
    https://israelnightclub.com/apartments/%D7%93%D7%99%D7%A8%D7%95%D7%AA-%D7%93%D7%99%D7%A1%D7%A7%D7%A8%D7%98%D7%99%D7%95%D7%AA-%D7%91%D7%A7%D7%A8%D7%99%D7%95%D7%AA/

发表评论

电子邮件地址不会被公开。 必填项已用*标注