J'aimerais pouvoir déboguer une application Angular2 avec Visual Studio Code.
Voici mon environnement:
Créer un nouveau projet avec angular-cli:
ng new test-VSC-debug
cd test-VSC-debug
Ensuite, j'ouvre VSC et charge le projet: File/open folder
Je clique sur le logo debug
et je configure launch.json
en sélectionnant chrome
. Il génère le fichier suivant:
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Chrome against localhost, with sourcemaps",
"type": "chrome",
"request": "launch",
"url": "http://localhost:8080",
"sourceMaps": true,
"webRoot": "${workspaceRoot}"
},
{
"name": "Attach to Chrome, with sourcemaps",
"type": "chrome",
"request": "attach",
"port": 9222,
"sourceMaps": true,
"webRoot": "${workspaceRoot}"
}
]
}
Ensuite, je commence juste le projet angular2 en lançant:
ng serve
Une fois que cela a commencé, dans VSC, je sélectionne: "Lancer Chrome contre localhost, avec sourcemaps".
Ensuite, j'obtiens l'erreur suivante:
"Impossible de trouver chrome: installez-le ou définissez le champ runtimeExecutable dans la configuration de lancement."
Alors j'ai mis:
"runtimeExecutable": "navigateur chrome"
(comme j’ai pas ont du chrome mais du chrome sur mon Ubuntu).
Le port par défaut de Angular-cli pour lancer l'application est 4200 . Modifiez l'URL de: " http: // localhost: 8080 " en " http: // localhost: 4200 ".
Le navigateur ouvre maintenant l'application, mais VSC présente l'erreur suivante: "Impossible de se connecter au processus d'exécution, délai dépassé après 10000 ms - (raison: impossible de se connecter à la cible: connect ECONREFUSED 127.0.0.1:9222".
Parmi d'autres réponses trouvées sur des problèmes de stackoverflow/github, j'ai lu que je devrais peut-être tuer toutes les instances de chrome avant d'essayer de le faire. Je ferme donc simplement chrome et lance killall chromium-browser
.
J'essaye de relancer le débogage: Même erreur qu'avant (impossible de se connecter).
J'ai également vu que les arguments suivants pourraient aider:
"runtimeArgs": [
"--remote-debugging-port=9222",
"--user-data-dir"
]
Mais cela ne change rien.
J'ai décidé d'utiliser VSC pour mes développeurs TypeScript (principalement angular2) et cette méthode de débogage semble très puissante. J'ai l'impression qu'il serait trop dommage de ne pas l'utiliser :).
Merci pour toute aide !
PS: Quelques questions de stackoverflow liées et problèmes de github:
- Déboguer et exécuter Angular2 TypeScript avec du code Visual Studio?
- https://github.com/angular/angular-cli/issues/2453
- https://github.com/angular/angular-cli/issues/1936
- https://github.com/angular/angular-cli/issues/1281
EDIT 1: !!! Amélioration partielle !!! J'ai trouvé un moyen d'avoir des informations de débogage dans la console Visual Studio Code! Ce n'est donc pas encore parfait, car les points d'arrêt ne fonctionnent pas, mais voici la chose . Jusqu'à présent, si j'ouvrais http : // localhost: 9222 Je n'ai rien pu voir. ("localhost n'autorise pas la connexion").
MAIS, si je lance le chrome comme ça:
chromium-browser --remote-debugging-port=9222 --user-data-dir=remote-profile
L'important est de noter cet argument: --user-data-dir=remote-profile
. Si vous ne faites que passer --user-data-dir, une nouvelle fenêtre s’ouvrira alors que personne ne sera connecté. Mais ça ne suffit pas. Vous devez transmettre remote-profile en tant que valeur.
Jusqu’à présent, j’espère que cela pourra aider certaines personnes . Mais le problème est que les points d’arrêt ne fonctionnent pas .
Je continue à creuser et je ferai un autre montage si je trouvais pourquoi.
J'ai pu résoudre ce problème sous OSX. La raison pour laquelle c'est si pénible est qu'il y a plusieurs choses qui causent le problème.
--user-data-dir=remote-profile
: vous devez utiliser une variable userDataDir
différente pour que Chrome lance une instance indépendante."userDataDir": "${workspaceRoot}/.vscode/chrome",
à votre configuration launch.json (voir ci-dessous). Cela doit être un chemin. Si 'remote-profile' est utilisé, il tente de trouver un répertoire relatif nommé 'remote-profile'.sourceMapPathOverrides
dans votre config launch.json, dont la valeur dépend de votre système d'exploitation:"sourceMapPathOverrides": { "webpack:///./*": "${webRoot}/*" }
"sourceMapPathOverrides": { "webpack:///C:*":"C:/*" }
"sourceMapPathOverrides": { "webpack:///*": "/*" }
Voici mon launch.json
sous OSX:
{
// 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 Chrome against localhost, with sourcemaps",
"type": "chrome",
"request": "launch",
"url": "http://localhost:4200",
// This forces chrome to run a brand new instance, allowing existing
// chrome windows to stay open.
"userDataDir": "${workspaceRoot}/.vscode/chrome",
"sourceMaps": true,
"webRoot": "${workspaceRoot}",
//"diagnosticLogging": true,
"sourceMapPathOverrides": { "webpack:///./*": "${webRoot}/*" }
},
{
"name": "Attach to Chrome, with sourcemaps",
"type": "chrome",
"request": "attach",
"url": "http://localhost:4200",
"port": 9222,
"sourceMaps": true,
"webRoot": "${workspaceRoot}",
"diagnosticLogging": true,
"sourceMapPathOverrides": { "webpack:///./*": "${webRoot}/*" }
}
]
}
Pour que cela fonctionne, exécutez ng serve
dans un terminal, puis appuyez sur F5 dans Visual Studio Code.
Voici les versions avec lesquelles je travaille:
J'ai enfin le faire fonctionner pleinement !!!
Pour ceux intéressés:
(en utilisant chrome-navigateur sur Linux, mais vous pouvez facilement remplacer par "chrome").
Premièrement, voici la config launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to Chrome, with sourcemaps",
"type": "chrome",
"request": "attach",
"port": 9222,
"sourceMaps": true,
"webRoot": "${workspaceRoot}/src",
"url": "http://localhost:4200/",
"sourceMapPathOverrides": {
"webpack:///*": "/*"
}
}
]
}
J'ai décidé de supprimer la partie avec "request": "launch" car j'ai besoin de lancer une nouvelle fenêtre de navigateur.
Ensuite, lancez le navigateur comme ça:chromium-browser --remote-debugging-port=9222 --user-data-dir=remote-profile
Dans la nouvelle fenêtre, accédez à http: // localhost: 4200 .
Ensuite, à partir de VSC, exécutez le débogage.
Tout devrait fonctionner correctement et vous devriez pouvoir utiliser les points d'arrêt :)
GIF disponible ici pour le voir en action: http://hpics.li/0156b80
Identique à Aaron F. ans J'utilise le paramètre suivant pour Angular 2+ develop dans un environnement Windows
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Chrome against localhost, with sourcemaps",
"type": "chrome",
"request": "launch",
"url": "http://localhost:4200",
"sourceMaps": true,
"webRoot": "${workspaceRoot}",
"trace": true,
"smartStep": true,
"runtimeArgs": [
"--disable-session-crashed-bubble",
"--disable-infobars"
],
"userDataDir": "${workspaceRoot}/.vscode/chrome",
"sourceMapPathOverrides": {
"webpack:///./*": "${webRoot}/*"
}
}
]
}
J'utilise Angular CLI 1.7.3 et Angular: 5.2.9 sur Mac OSX. Voici la configuration qui fonctionne pour moi:
{ "version": "0.2.0", "configurations": [ { "type": "chrome", "demande": "lancer", "name": "Launch Client in Chrome", "sourceMaps": true, "url": "http: // localhost: 4200", "webRoot": "$ {workspaceRoot}", "userDataDir": "$ {workspaceRoot} /. vscode/chrome", "sourceMapPathOverrides": { "webpack: /./*": "$ {webRoot}/*", "webpack:/src/*": "$ {webRoot}/src /*", "webpack:/*": "*", "webpack: /./ ~/*": "$ {webRoot}/node_modules /*", } } ] }
La configuration suivante fonctionne bien pour macOS avec VSCode v1.23, Angular 6 et Chrome 66.
{
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome",
"url": "http://localhost:4200",
"smartStep": true,
"sourceMaps": true,
"webRoot": "${workspaceFolder}",
"sourceMapPathOverrides": {
"webpack:///./*": "${webRoot}/*",
"webpack:///src/*": "${webRoot}/src/*",
"webpack:///*": "*",
"webpack:///./~/*": "${webRoot}/node_modules/*"
}
}
]
}
J'ai un problème étrange avec launch.json fourni par Aaron F.
".scripts" dans la ligne de commande du débogueur donne les URL comme ceci:
webpack-internal:///./src/app/app.component.ts (/home/user/my-dream-app/src/app/app.component.ts)
- webpack:/src/app/app.component.ts (/home/user/my-dream-app/src/app/webpack:/src/app/app.component.ts)
so Code essayant d’utiliser le fichier "/home/user/my-dream-app/src/app/webpack:/src/app/app.component.ts" (avis webpack: au centre)
Les cartes sources ne fonctionnent pas, car mon adresse Chrome donne l'URL sous la forme "webpack: /" avec UNE barre oblique.
En le faisant fonctionner avec ce launch.json:
{
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome with ng serve",
"url": "http://localhost:4200/",
"webRoot": "${workspaceRoot}",
"sourceMapPathOverrides": { "webpack:/*": "${webRoot}/*" }
}
]
}
et obtenu une cartographie correcte
webpack-internal:///./src/app/app.component.ts (/home/user/my-dream-app/src/app/app.component.ts)
- webpack:/src/app/app.component.ts (/home/user/my-dream-app/src/app/app.component.ts)