Отладка в Visual Studio Code с помощью babel-узла

Я использую:

  • VS Code v1.3.1
  • узел v6.3.1
  • Вавилонский узел v6.11.4
  • Windows 10

Я не могу остановиться на точке останова с помощью следующего файла запуска. Отладчик запускается и подключается к порту, но когда я запускаю приложения с точкой останова, он не останавливается на точке останова и проходит прямо через него. Любой, кто получил это на работу, пожалуйста, сообщите.

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "node",
            "request": "launch",
            "program": "${workspaceRoot}/src/app.js",
            "stopOnEntry": false,
            "args": [],
            "cwd": "${workspaceRoot}",
            "preLaunchTask": null,
            "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/babel-node.cmd",
            "runtimeArgs": [
                "--nolazy"
            ],
            "env": {
                "NODE_ENV": "development"
            },
            "externalConsole": false,
            "sourceMaps": false,
            "outDir": null
        },
        {
            "name": "Attach",
            "type": "node",
            "request": "attach",
            "port": 5858,
            "address": "localhost",
            "restart": false,
            "sourceMaps": false,
            "outDir": null,
            "localRoot": "${workspaceRoot}",
            "remoteRoot": null
        },
        {
            "name": "Attach to Process",
            "type": "node",
            "request": "attach",
            "processId": "${command.PickProcess}",
            "port": 5858,
            "sourceMaps": false,
            "outDir": null
        }
    ]
}

3 ответа

Решение

Я смог заставить его работать, выполнив следующие действия:

Package.json

Убедитесь, что у вас есть скрипт сборки с генерацией исходных карт.

"scripts": {
    "build": "babel src -d dist --source-maps"
}

tasks.json

Убедитесь, что у вас есть задача, позволяющая создавать VS Code с npm скрипт.

{
    "version": "0.1.0",
    "command": "npm",
    "isShellCommand": true,
    "showOutput": "always",
    "suppressTaskName": true,
    "tasks": [
        {
            "taskName": "build",
            "args": [ "run", "build" ],
            "isBuildCommand": true
        }
    ]
}

launch.json

Сконфигурируйте скрипт для сборки перед запуском с preLaunchTask, начать program с точки входа источника, но с outDir указывая на папку dist и sourceMaps включен.

{
    "name": "Launch",
    "type": "node",
    "request": "launch",
    "program": "${workspaceRoot}/src/server.js",
    "stopOnEntry": false,
    "args": [],
    "cwd": "${workspaceRoot}",
    "preLaunchTask": "build",
    "runtimeExecutable": null,
    "runtimeArgs": [ "--nolazy" ],
    "env": {
        "NODE_ENV": "development"
    },
    "externalConsole": false,
    "sourceMaps": true,
    "outDir": "${workspaceRoot}/dist"
}

Теперь, каждый раз, когда вы нажимаете F5, babel транспиляция выполняется до запуска процесса Node, но со всеми синхронизированными исходными картами. С его помощью я смог использовать точки останова и все другие вещи отладчика.

Нет необходимости переносить с вавилонским узлом

Когда используешь babel-node Вы не ДОЛЖНЫ сначала передавать свой код.

Базовая настройка (исходные карты - всегда)

Обратите внимание sourceMaps а также retainLines варианты в .babelrc:

{
  "presets": [
    "env"
  ],
  "sourceMaps": "inline",
  "retainLines": true
}

А потом в launch.json:

{
  "type": "node",
  "request": "launch",
  "name": "Debug",
  "program": "${workspaceFolder}/index.js",
  "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/babel-node",
  "runtimeArgs": ["--nolazy"]
}

Предварительная настройка (исходные карты - только отладка)

Вы можете настроить вышеперечисленное так, чтобы генерировать исходные карты /retainLines только в режиме отладки:

{
  "presets": ["env"],
  "env": {
    "debug": {
      "sourceMaps": "inline",
      "retainLines": true
    }
  }
}

А также:

{
  "type": "node",
  "request": "launch",
  "name": "Debug",
  "program": "${workspaceFolder}/index.js",
  "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/babel-node",
  "runtimeArgs": ["--nolazy"],
  "env": {
    "BABEL_ENV": "debug"
  },
}

Начиная с версии 1.9, VS Code автоматически пытается использовать исходные карты по умолчанию, но вы должны указать outFiles если переданные файлы не находятся в той же папке, что и исходные файлы.

В качестве примера здесь приведены соответствующие файлы. В этом случае, babel уходит от src папка в lib папка.

Примечание: записи в package.json а также .vscode/tasks.json требуются, только если вы хотите, чтобы VS Code передавал файлы перед отладкой.


.vscode / launch.json

Ctrl+Shift+P, >Debug: Open launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Launch Program",
            "program": "${workspaceRoot}/lib/index.js",
            "cwd": "${workspaceRoot}",
            "preLaunchTask": "build",
            "outFiles": [
                "${workspaceRoot}/lib/**.js"
            ]
        }
    ]
}

Примечание: только указать preLaunchTask если вы также настроили build задачи в package.json а также .vscode/tasks.json,


package.json

Ctrl+P, package.json

{
  "scripts": {
    "build": "babel src -d lib -s"
  },
  "devDependencies": {
    "babel-cli": "^6.23.0",
    "babel-preset-env": "^1.1.10"
  }
}

Примечание. Вы можете использовать другую версию babel-cli и различные предустановки Babel.


.vscode / tasks.json

Ctrl+Shift+P, >Tasks: Configure Task Runner

{
    "version": "0.1.0",
    "command": "npm",
    "isShellCommand": true,
    "showOutput": "always",
    "suppressTaskName": true,
    "tasks": [
        {
            "taskName": "build",
            "args": ["run", "build"],
            "isBuildCommand": true
        }
    ]
}

Официальная документация VS Code

Исходные карты

Отладчик VS-кода Node.js поддерживает исходные карты JavaScript, которые помогают в отладке переносимых языков, например, TypeScript или минимизированного / расширенного JavaScript. С исходными картами можно сделать один шаг или установить точки останова в исходном источнике. Если исходная карта не существует для исходного источника или если исходная карта не работает и не может успешно отобразить между источником и сгенерированным JavaScript, то точки останова отображаются как непроверенные (серые пустые кружки).

Исходные карты могут быть созданы с двумя видами встраивания:

  • Встроенные исходные карты: созданный файл JavaScript содержит исходную карту в виде URI данных в конце (вместо ссылки на исходную карту через файловый URI).
  • Встроенный источник: исходная карта содержит исходный источник (вместо ссылки на источник через путь).

VS Code поддерживает как встроенные исходные карты, так и встроенный источник.

Функция карты источника контролируется sourceMaps атрибут, который по умолчанию true начиная с VS Code 1.9.0. Это означает, что отладка узла всегда пытается использовать исходные карты (если он может их найти), и, как следствие, вы даже можете указать исходный файл (например, app.ts) с помощью program приписывать.

Если вам по какой-то причине необходимо отключить исходные карты, вы можете установить sourceMaps приписывать false,

Если сгенерированные (перенесенные) файлы JavaScript находятся не рядом с их источником, а в отдельном каталоге, вы должны помочь отладчику кода VS найти их, установив outFiles приписывать. Этот атрибут принимает несколько шаблонов глобуса для включения и исключения файлов из набора сгенерированных файлов JavaScript. Всякий раз, когда вы устанавливаете точку останова в исходном источнике, VS Code пытается найти сгенерированный код JavaScript в файлах, указанных outFiles,

Поскольку исходные карты не создаются автоматически, вы должны настроить транспортер, который вы используете для их создания. Для TypeScript это можно сделать следующим образом:

tsc --sourceMap --outDir bin app.ts

Это соответствующая конфигурация запуска для программы TypeScript:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch TypeScript",
            "type": "node",
            "request": "launch",
            "program": "app.ts",
            "outFiles": [ "bin/**/*.js" ]
        }
    ]
}

Источник

Вот что сработало для меня (Ни одно из других решений не работало для меня с vscode v1.33):

./project.json

"scripts": {
  "build": "babel src -d dist --source-maps",
},

.vscode / task.json

{
  "version": "2.0.0",
  "tasks": [{
    "label": "build-babel",
    "type": "npm",
    "script": "build",
    "group": "build"
  }]
}

.vscode / launch.json

{
  "version": "0.2.0",
  "configurations": [{
    "type": "node",
    "request": "launch",
    "preLaunchTask": "build-babel",
    "name": "Debug",
    "program": "${workspaceRoot}/src/server.js",
    "outFiles": ["${workspaceRoot}/dist/**/*.js"]
  }]
}

Добавьте этот конфиг в свой launch.json,

{
"version": "0.2.0",
"configurations": [
    {   
        "cwd":"<path-to-application>",
        "type": "node",
        "request": "launch",
        "name": "babel-node debug",
        "runtimeExecutable": "<path-to-app>/node_modules/.bin/babel-node",
        "program": "<path-to-app-entry-file>/server.js",
        "runtimeArgs": ["--nolazy"]
    }
]
}

Не забудьте иметь файл.babelrc с предустановкой, определенной в корне вашего проекта. Также атрибут cwd в launch.json должен быть правильным, иначе компилятор babel не сможет найти.babelrc, и вы получите ошибки компиляции.

    {
        "presets": ["@babel/preset-env"]
    }

Запуск с этой конфигурацией автоматически запустит приложение на порту по умолчанию (обычно 5000) и подключится к сгенерированному порту отладки. Исходные карты будут работать без какой-либо дополнительной конфигурации, если вы не используете какой-то супер старый vscode

Чего не хватало в моем случае (VSCode 1.36.0), так это переопределения путей исходной карты:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Debug",
            "program": "${workspaceRoot}/src/cli/index.js",
            "sourceMaps": true,
            "sourceMapPathOverrides": {
                "*": "${workspaceRoot}/src/*"
            },
            "outFiles": [
                "${workspaceRoot}/lib/**/*.js"
            ]
        }
    ]
}

Компиляция была вызвана через конвейер gulp, а исходные карты ссылались на cli/index.js вместо того src/cli/index.js. Переназначение с sourceMapPathOverrides исправил это.

Другие вопросы по тегам