Jak debugować Angular za pomocą VSCode?

127

Jak mogę skonfigurować Angular i VSCode, aby moje punkty przerwania działały?

Asesjix
źródło
co masz na myśli? Jak one nie działają?
TylerH
2
@TylerH, powinien to być przewodnik, jak to działa. nie działa bez zmodyfikowanego pliku launch.json.
Asesjix

Odpowiedzi:

178

Testowane z Angular 5 / CLI 1.5.5

  1. Zainstaluj rozszerzenie Chrome Debugger
  2. Utwórz launch.json(wewnątrz folderu .vscode)
  3. Użyj mojego launch.json(patrz poniżej)
  4. Utwórz tasks.json(wewnątrz folderu .vscode)
  5. Użyj mojego tasks.json(patrz poniżej)
  6. Naciśnij CTRL+ SHIFT+B
  7. naciśnij F5

launch.json for angular/cli >= 1.3

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Launch Chrome",
      "type": "chrome",
      "request": "launch",
      "url": "http://localhost:4200/#",
      "webRoot": "${workspaceFolder}"
    },
    {
      "name": "Attach Chrome",
      "type": "chrome",
      "request": "attach",
      "url": "http://localhost:4200/#",
      "webRoot": "${workspaceFolder}"
    },
    {
      "name": "Launch Chrome (Test)",
      "type": "chrome",
      "request": "launch",
      "url": "http://localhost:9876/debug.html",
      "webRoot": "${workspaceFolder}"
    },
    {
      "name": "Launch Chrome (E2E)",
      "type": "node",
      "request": "launch",
      "program": "${workspaceFolder}/node_modules/protractor/bin/protractor",
      "protocol": "inspector",
      "args": ["${workspaceFolder}/protractor.conf.js"]
    }
  ]
}

tasks.json for angular/cli >= 1.3

{
    "version": "2.0.0",
    "tasks": [
      {
        "identifier": "ng serve",
        "type": "npm",
        "script": "start",
        "problemMatcher": [],
        "group": {
          "kind": "build",
          "isDefault": true
        }
      },
      {
        "identifier": "ng test",
        "type": "npm",
        "script": "test",
        "problemMatcher": [],
        "group": {
          "kind": "test",
          "isDefault": true
        }
      }
    ]
  }

Testowane z Angular 2.4.8

  1. Zainstaluj rozszerzenie Chrome Debugger
  2. Utwórz plik launch.json
  3. Użyj mojego launch.json(patrz poniżej)
  4. Uruchom NG Live Development Server ( ng serve)
  5. naciśnij F5

launch.json for angular/cli >= 1.0.0-beta.32

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "Launch Chrome",
      "url": "http://localhost:4200",
      "webRoot": "${workspaceFolder}",
      "sourceMaps": true,
      "userDataDir": "${workspaceFolder}/.vscode/chrome",
      "runtimeArgs": [
        "--disable-session-crashed-bubble"
      ]
    },
    {
      "name": "Attach Chrome",
      "type": "chrome",
      "request": "attach",
      "url": "http://localhost:4200",
      "port": 9222,
      "webRoot": "${workspaceFolder}",
      "sourceMaps": true
    }
  ]
}

launch.json for angular/cli < 1.0.0-beta.32

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Lunch Chrome",
      "type": "chrome",
      "request": "launch",
      "url": "http://localhost:4200",
      "webRoot": "${workspaceFolder}/src/app",
      "sourceMaps": true,
      "sourceMapPathOverrides": {
        "webpack:///./~/*": "${workspaceFolder}/node_modules/*",
        "webpack:///./src/*": "${workspaceFolder}/src/*"
      },
      "userDataDir": "${workspaceFolder}/.vscode/chrome",
      "runtimeArgs": [
        "--disable-session-crashed-bubble"
      ]
    },
    {
      "name": "Attach Chrome",
      "type": "chrome",
      "request": "attach",
      "url": "http://localhost:4200",
      "port": 9222,
      "webRoot": "${workspaceFolder}/src/app",
      "sourceMaps": true,
      "sourceMapPathOverrides": {
        "webpack:///./~/*": "${workspaceFolder}/node_modules/*",
        "webpack:///./src/*": "${workspaceFolder}/src/*"
      }
    }
  ]
}
Asesjix
źródło
7
czy wiesz, jak rozpocząć, NG Live Development Servera następnie uruchomić Chromejednym F5kliknięciem?
Merdan Gochmuradov
2
przepraszam, że nie jest to możliwe, ponieważ zadanie „ng serv” musiało zostać uruchomione w preLaunchTask. „ng serv” musi działać na stałe, a zatem „preLaunchTask” nie jest zakończone, co oznacza, że ​​kod vs nie rozpoczyna procesu debugowania. ale dodałem nową konfigurację, która powinna trochę przyspieszyć pracę ;-)
Asesjix
1
Jasna i krótka odpowiedź. Byłoby dobrze, gdybyś mógł krótko wyjaśnić launch.jsoni tasks.jsonzrobić tutaj. Jak zrozumiałem, launch.jsonpolega na uruchomieniu serwera węzła i nasłuchiwaniu portu 8080 oraz tasks.jsonpoinstruowaniu o użyciu npmi wykonaniu polecenia w ng servecelu uruchomienia aplikacji.
shaijut
@Zachscs Której wersji kątowej używasz?
Asesjix
1
Miałem ten sam problem, punkty przerwania nie zostały ustawione, aż w końcu zdałem sobie sprawę, że mój webroot jest zły. Miałem domyślną wartość dla webRoot („webRoot”: „$ {workspaceFolder}”) zamiast $ {workspaceFolder} / my-app-folder
Joseph Simpson
48

Wygląda na to, że zespół VS Code przechowuje teraz przepisy na debugowanie.

https://github.com/Microsoft/vscode-recipes/tree/master/Angular-CLI

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Launch Chrome with ng serve",
      "type": "chrome",
      "request": "launch",
      "url": "http://localhost:4200",
      "webRoot": "${workspaceRoot}"
    },
    {
      "name": "Launch Chrome with ng test",
      "type": "chrome",
      "request": "launch",
      "url": "http://localhost:9876/debug.html",
      "webRoot": "${workspaceRoot}"
    },
    {
      "name": "Launch ng e2e",
      "type": "node",
      "request": "launch",
      "program": "${workspaceRoot}/node_modules/protractor/bin/protractor",
      "protocol": "inspector",
      "args": ["${workspaceRoot}/protractor.conf.js"]
    }      
  ]
}
Levi Fuller
źródło
10

Można to zrobić na dwa różne sposoby. Możesz uruchomić nowy proces lub dołączyć do już istniejącego.

Kluczową kwestią w obu procesach jest jednoczesne działanie serwera webpack i debuggera VSCode .

Uruchom proces

  1. W swoim launch.jsonpliku dodaj następującą konfigurację:

    {
      "version": "0.2.0",
      "configurations": [
        {
          "name": "Angular debugging session",
          "type": "chrome",
          "request": "launch",
          "url": "http://localhost:4200",
          "webRoot": "${workspaceFolder}"
        }
      ]
    }
    
  2. Uruchom serwer deweloperski Webpack z Angular CLI, wykonując npm start

  3. Przejdź do debuggera VSCode i uruchom konfigurację „Angular debugging session”. W rezultacie otworzy się nowe okno przeglądarki z Twoją aplikacją.

Dołącz do istniejącego procesu

  1. W tym celu musisz uruchomić Chrome w trybie debuggera z otwartym portem (w moim przypadku będzie 9222):

    Prochowiec:

    /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222
    

    Okna:

    chrome.exe --remote-debugging-port=9222
    
  2. launch.json plik będzie wyglądał następująco:

    {
      "version": "0.2.0",
      "configurations": [
        {
          "name": "Chrome Attach",
          "type": "chrome",
          "request": "attach",
          "port": 9222,
          "url": "http://localhost:4200/",
          "webRoot": "${workspaceFolder}"
        } 
      ]
    }
    
  3. Uruchom serwer deweloperski Webpack z Angular CLI, wykonując npm start
  4. Wybierz konfigurację „Chrome Attach” i uruchom ją.

W takim przypadku debugger jest dołączony do istniejącego procesu Chrome zamiast uruchamiania nowego okna.

Napisałem własny artykuł, w którym opisałem to podejście ilustracjami.

Prosta instrukcja konfiguracji debuggera dla Angulara w VSCode

skryvets
źródło
Dziękuję, za każdym razem, gdy uruchamiam chrome, muszę uruchamiać to polecenie.Czy chrome.exe --remote-debugging-port=9222istnieje alternatywa dla jednorazowej konfiguracji
Saurabh47g
W zależności od twoich poświadczeń możesz kliknąć prawym przyciskiem myszy na chrome w menu Start systemu Windows, nacisnąć właściwości i dodać tam flagę. To nie działa na moim komputerze roboczym, więc utworzyłem alias polecenia w git bash dla Windows.
vitale232
7

Jest to szczegółowo wyjaśnione w witrynie Visual Studio Code: https://code.visualstudio.com/docs/nodejs/angular-tutorial

Victor Ionescu
źródło
czy miałeś na myśli code.visualstudio.com/docs/nodejs/ ... ? · # _debugging-angular wskazuje bezpośrednio na interesujący punkt, jeśli chcesz edytować swoją odpowiedź ...
Pipo,
@Pipo Nie, nie miałem na myśli nodejs, nie używam nodejs po stronie serwera, więc nie wiedziałbym.
Victor Ionescu
3

Może używać tej konfiguracji:

{
 "version": "0.2.0",
"configurations": [
{
        "name": "ng serve",
        "type": "chrome",
        "request": "launch",
        "preLaunchTask": "npm: start",
        "url": "http://localhost:8080",
        "webRoot": "${workspaceFolder}"
      }
]
}
Ahmad Aghazadeh
źródło
2

Tutaj jest nieco lżejsze rozwiązanie, działa z Angular 2+ (używam Angular 4)

Dodano także ustawienia dla Express Server, jeśli używasz stosu MEAN.

{
  // Use IntelliSense to learn about possible Node.js debug attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Launch Angular Client",
      "type": "chrome",
      "request": "launch",
      "url": "http://localhost:4200",
      "runtimeArgs": [
        "--user-data-dir",
        "--remote-debugging-port=9222"
        ],
        "sourceMaps": true,
        "trace": true,
        "webRoot": "${workspaceRoot}/client/",
        "userDataDir": "${workspaceRoot}/.vscode/chrome"
    },
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Express Server",
      "program": "${workspaceRoot}/server/bin/www",
      "outFiles": [
        "${workspaceRoot}/out/**/*.js"
      ]
    }
  ]
}
Isak La Fleur
źródło
Czy możesz debugować / ustawić punkt przerwania kodu po stronie serwera w tym samym czasie co angular z tą konfiguracją?
Mika571
@ Mika571 nie, niestety ... próbowałem tego teraz. Chciałbym jednocześnie debugować po stronie serwera i klienta.
Leniel Maccaferri
1

Odpowiedź @Asesjix jest bardzo dokładna, ale jak niektórzy zauważyli, nadal wymaga wielu interakcji, aby rozpocząć, ng servea następnie uruchomić aplikację Angular w Chrome. Mam to działające jednym kliknięciem przy użyciu następującej konfiguracji. Główną różnicą w stosunku do odpowiedzi @ Asesjix jest to, że typ zadania jest teraz, shella wywołania poleceń są dodawane startwcześniej, ng servewięc ng servemogą istnieć w swoim własnym procesie i nie blokować uruchamiania debugera:

tasks.json:

{
    "version": "2.0.0",
    "tasks": [
      {
        "label": "ng serve",
        "type": "shell",
        "command": "\"start ng serve\""
      },
      {
        "label": "ng test",
        "type": "shell",
        "command": "\"start ng test\"",
      }
    ]
  }

launch.json:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch in Chrome",
            "type": "chrome",
            "request": "launch",
            "url": "http://localhost:4200",
            "webRoot": "${workspaceFolder}",
            "preLaunchTask": "ng serve"
        }
    ]
}
ubiquibacon
źródło
0

W moim przypadku nie użyłem oryginalnego drzewa folderów projektu Angular i wiedziałem, że coś jest nie tak z webRoot/ {workspaceFolder}bit, ale wszystkie moje eksperymenty nie przyniosły rezultatu. Mam wskazówkę od innej SO odpowiedzi, którą połączę, jeśli znajdę ją ponownie.

Pomogło mi znalezienie zawartości zmiennej {workspaceFolder}w czasie wykonywania, a następnie zmodyfikowanie jej do lokalizacji mojego folderu „src”, w którym znajduje się „app / *”. Aby go znaleźć, dodałem a preLaunchTaskdo mojego pliku launch.json i zadanie, aby wyświetlić wartość {workspaceFolder}.

launch.json , który pojawia się po zainstalowaniu debugera Chrome

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "Launch Chrome against localhost",
      "url": "http://localhost:4200",
      "webRoot": "${workspaceFolder}/src/newProjectRoot/",
      "preLaunchTask": "Echo values" //Just to see what the cryptic vs code variables actually are https://code.visualstudio.com/docs/editor/variables-reference
    }
  ]
}

Tasks.json Nie występuje domyślnie. Naciśnij Ctrl + Shift + p i myślę, że nazywa się to „utwórz zadanie dla innego polecenia” lub czymś podobnym. Wydaje się, że nie można go zobaczyć po utworzeniu tasks.json. Możesz także po prostu utworzyć plik w tej samej lokalizacji co launch.json

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Echo values",
      "command": "echo",
      "args": ["${env:USERNAME}", "workspaceFolder = ${workspaceFolder}"],
      "type": "shell"
    }
  ]
}

Kiedy poznałem wartość $ {workspaceFolder}, naprawiłem go tak, aby wskazywał na mój folder src w moim nowym drzewie projektu i wszystko działało. Debugowanie wymaga ng serveuruchomienia jako zadania przed uruchomieniem, jako część kompilacji (przykłady powyżej) lub w wierszu polecenia.

Oto link do wszystkich zmiennych, których możesz użyć:

Popiół
źródło