如何在VSCode中使用npm运行脚本进行调试?

131

以前我使用gulp来启动我的应用程序和侦听器,通过Visual Studio Code调试器运行gulp,但最近需要改为通过npm运行脚本。不幸的是,在VSCode中我无法通过调试器运行npm脚本,所以我不得不直接运行node来启动我的服务器,这样就没有自动重新加载代码的监听任务。

这似乎是一件简单的事情,但到目前为止,我还没有什么好运气。以下是我尝试使用的launch.json文件的片段,但找不到npm

{
    ...
        "program": "npm",
        "args": [
            "run",
            "debug"
        ],
    ...
}

这给我带来了以下错误。

错误请求“launch”:程序“c:\ myproject \ npm”不存在

相关资源:

13个回答

115

自从2016年10月的发布以来,VS Code似乎将支持npm脚本和其他启动场景。

以下是一个示例,它最初在GitHub上提出,但已经调整为使用--inspect-brk而不是最初提出的--debug-brk选项。

packages.json

  "scripts": {
    "debug": "node --nolazy --inspect-brk=5858 myProgram.js"
  },

vscode启动配置

{
    "name": "Launch via NPM",
    "type": "node",
    "request": "launch",
    "cwd": "${workspaceRoot}",
    "runtimeExecutable": "npm",
    "runtimeArgs": [
        "run-script", "debug"
    ],
    "port": 5858
}

截至2022年夏季,Visual Studio Code的最新更新显示有多种方法可以设置与Node.js的调试支持。这些方法包括自动连接到从VSCode集成终端JavaScript调试终端启动的进程,或使用现在广泛记录的传统启动配置文件


7
在VSCode 1.7.2上,我遇到了“无法启动调试目标(spawn npm ENOENT)”的错误提示。 - andreister
12
在Windows操作系统上,我使用"npm.cmd"而不是简单地使用"npm"来使其运行! - electrotype
1
@jpierson "runtimeExecutable" 的默认值是 "node"(根据 vsode 中的悬停信息,因此在所有平台上都是相应的 node 可执行文件)。如果您想启动 anything.js,请将其放在 program 中,而不是 runtimeExecutable: "program": "${workspaceRoot}/your-path/here/anything.js"(这里的路径也可以是已安装包的 node_modules/.bin/whatever 二进制文件)。 - Frank N
2
只要我按照答案使用--inspect-brk=5858而不是--debug-brk=5858,它就能正常工作。在更改之前,它只是无声地挂起,没有任何弃用错误消息。 - James
2
我尝试了使用节点标志--inspect-brk,它非常好用! - sidd
显示剩余3条评论

76
当你在package.json文件中悬停脚本名称时,VS Code现在会给你一个“调试脚本”按钮。

enter image description here


如果有人在设置“outFiles”时遇到错误,可以在“settings.json”文件中进行配置,方法是添加以下代码:"debug.javascript.terminalOptions": {"outFiles": []}。更多信息请参考此处:https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_additional-configuration - JohnnyFun
21
如何在 launch.json 中进行配置? - Jose Manuel Sánchez
我刚刚得到了一个悬停提示,上面写着“通过'npm test'命令运行”。 - ruffin
@ruffin 你需要将鼠标悬停在脚本名称(键)上,而不是命令字符串(值)上。 - 1j01
https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_auto-attach - Smart Coder

46

我认为你要找的是以下配置。

将以下对象添加到.vscode/launch.json文件中的configurations数组中。

{
    "command": "npm run dev",
    "name": "Run npm dev",
    "request": "launch",
    "type": "node-terminal"
}

现在尝试使用新的配置进行调试。VSCode将负责调试程序的附加。

不要忘记用您想要的命令替换npm run dev


6
提示信息为“不允许使用 Property 命令”。 - suchcodemuchwow
可能还需要在其中添加 "skipFiles": ["<node_internals>/**"] - Andreas Bergström
适用于TypeScript项目的2023年版本:)){ "version": "0.2.0", "configurations": [ { "skipFiles": [ "/**" ], "preLaunchTask": "tsc: build - tsconfig.json", "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], "command": "npm run cli:prod x-x:foo:x", "name": "运行 npm dev", "request": "launch", "type": "node-terminal" } ] } - AmiNadimi
这个可行!而且奇怪的是,我在 VS Code 文档中找不到 type = node-terminal 的任何提及。 - Niels Bom
这可以通过VSCode自动生成:ctrl+shift+p > 调试: 添加配置(或在调试面板中找到此选项)> 在调试终端中运行npm start - undefined

29
我刚刚注意到“JavaScript Debug Terminal”在“New Terminal”下拉菜单中。VSCode会自动附加到您在该终端窗口中运行的任何内容。
没有更复杂的调试配置了! enter image description here

8
这应该被标记为被采纳的答案。它不会强制在代码层面上做出任何更改,这对于大型机构项目非常关键。 - Alexis
@Alexis,从F5或任务启动器运行怎么样?它会自动附加到这些内容而无需任何自定义吗?如果是这样,我认为这是完全可接受的答案,否则,我认为描述两种方法可能是最好的。 - jpierson
这对我没有起作用,它不会在我设置的断点处停止代码执行。 - undefined

24
  1. 在您的 .vscode/launch.json 中配置一个新的调试目标:

{
    "name": "Attach To npm",
    "type": "node",
    "request": "attach",
    "port": 5858,
    "address": "localhost",
    "restart": false,
    "sourceMaps": false,
    "outDir": null,
    "localRoot": "${workspaceRoot}",
    "remoteRoot": null
}
  • 将npm配置为使用--debug-brk选项运行节点:

  • "scripts": {
      "start": "node app.js",
      "debug": "node --debug-brk app.js"
      ...
    
  • 从命令行启动您的应用程序:

     $npm run debug
    
  • 默认情况下,该程序将在端口5858上等待附加调试器

  • 因此,请在Visual Studio Code中运行调试器("Attach To npm")。

  • 享受您的调试器 :)


  • 7
    现今,节点标记是 --inspect-brk,并且默认端口为9229(至少在我的机器上是这样)。 - kaba

    23

    使用npm是可行的,而不必更改package.json中的scripts部分。

    这里的技巧是向node传递--inspect-brk=9229参数。

    命令看起来像这样:npm run start -- --inspect-brk=9229

    这是.vscode/launch.json文件:

    {  
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Launch via NPM",
            "runtimeExecutable": "${env:NVM_BIN}/npm", //change this to your npm path
            "runtimeArgs": [
                "run-script",
                "start",
                "--",
                "--inspect-brk=9229"
            ],
             "port": 9229
        },
    
      ]
    }
    

    这个很好用,但是它调用prestart的npm生命周期不起作用,有什么解决办法吗? - CyberMew

    9
    这是我的“launch.json”文件长这样,并且它可以正常工作:
    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Launch via NPM",
                "request": "launch",
                "runtimeArgs": [
                    "run-script",
                    "dev"
                ],
                "runtimeExecutable": "npm",
                "skipFiles": [
                    "<node_internals>/**"
                ],
                "type": "pwa-node"
            }
        ]
    }
    

    1
    谢谢!在VSCode v1.56中对我有用。(另外,您不需要使用“run-script”,您可以直接使用“run”) - takanuva15
    只是补充一下,我也有 stopOnEntry,这样我就可以使用断点。 - Matt Scheurich

    4
    我尝试了GutiMac和Jpierson提供的解决方案,但由于某些原因,我无法使调试器与它们中的任何一个配合使用。
    对我来说,另一个替代方案(Ubuntu 16、node 8.9.1、VS 1.8.1)效果很好,就是使用这个简单的应用程序启动器(将其添加到VS launch.json配置数组中)。
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Node App",
      "program": "${workspaceFolder}/my-app/my-npm-start-script-dir/index.js"
    }
    

    4

    对我来说,最简单和直接的解决方案。它将编译 .ts 文件为 .js 文件,然后以调试模式运行 Node 应用程序。

    .vscode/launch.json

    
    {
       "version": "0.2.0",
       "configurations": [
           {
               "name": "Launch via NPM",
               "request": "launch",
               "runtimeArgs": [
                   "run",
                   "debug_my_app"
               ],
               "runtimeExecutable": "npm",
               "skipFiles": [
                   "<node_internals>/**"
               ],
               "type": "pwa-node"
           }
       ]
    }
    

    package.json

    {
      "dependencies": {
        "axios": "^0.24.0"
      },
      "scripts": {
        "debug_my_app": "tsc && node index.js"
      }
    }
    

    启动调试器

    输入图像描述


    4

    我还没有找到如何在运行外部npm run脚本时将--inspect-brk=9229传递给node的解决方案。因此,这里提供了一个启动配置的解决方案。

    如果你想带参数或者链接多个脚本来调试外部npm脚本,你可以直接从node中运行它们。例如像angular-cli运行脚本:

    "scripts": {
        "ng": "ng",
        "start": "ng serve",
        "build": "ng build",
    },
    

    大多数外部脚本都存储在 node_modules/bin 文件夹中。您只需要找到您的脚本并弄清楚它运行的 js 文件即可。对于ng,它是 node_modules/@angular/cli/bin/ng。因此,这是最终的启动配置:

    {
        "type": "node",
        "request": "launch",
        "name": "Launch ng build",
        "runtimeExecutable": "node",
        "runtimeArgs": [
            "--inspect-brk=9229",
            "node_modules/@angular/cli/bin/ng"
        ],
        "args": ["build"],
        "port": 9229
    }
    

    当您开始进行调试时,您将启动下一个命令:
    node --inspect-brk=9229 node_modules/@angular/cli/bin/ng build
    

    现在您可以在外部脚本中设置断点。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接