Fermer

juin 6, 2018

Déboguer des projets JavaScript avec le code VS et le débogueur Chrome –


Déboguer JavaScript n'est pas l'aspect le plus amusant de la programmation JavaScript, mais c'est une compétence essentielle. Cet article couvre deux outils qui vous aideront à déboguer JavaScript comme un pro.

Imaginez un instant que la fonction console.log () n'existait pas dans JavaScript. Je suis sûr que la première question que vous vous poseriez serait "Comment vais-je jamais confirmer que mon code fonctionne correctement?"

La réponse réside dans l'utilisation d'outils de débogage. Pendant longtemps, la plupart des développeurs, y compris moi-même, utilisaient console.log pour déboguer du code cassé. C'est rapide et facile à utiliser. Cependant, les choses peuvent devenir difficiles à certains moments si vous ne savez pas où et ce qui cause le bug. Souvent, vous vous retrouvez en train de poser console.log des pièges partout dans votre code pour voir lequel révélera le coupable.

Pour y remédier, nous devons changer nos habitudes et commencer à utiliser les outils de débogage. Il existe un certain nombre d'outils disponibles pour le débogage du code JavaScript, tels que les Outils de développement Chrome, Node Debugger Node Inspect et autres. En fait, chaque navigateur principal fournit ses propres outils.

Dans cet article, nous verrons comment utiliser les fonctions de débogage fournies par Visual Studio Code. Nous verrons également comment utiliser l'extension Debugger for Chrome qui permet à VS Code de s'intégrer à Chrome Dev Tools. Une fois que nous aurons terminé, vous ne voudrez plus jamais utiliser console.log () à nouveau.

Pré-requis

Pour ce tutoriel, il suffit d'avoir une base solide dans JavaScript moderne . Nous verrons aussi comment nous pouvons déboguer un test écrit en utilisant Mocha et Chai . Nous allons utiliser un projet cassé, debug-example pour apprendre à corriger divers bogues sans utiliser un seul console.log . Vous devez suivre la procédure suivante:

Commencez par cloner le projet debug-example dans votre espace de travail. Ouvrez le projet dans VS Code et installez les dépendances via le terminal intégré:

 # Installer les dépendances de package
npm installer

# Installer les dépendances globales
npm install -g mocha

Nous sommes maintenant prêts à apprendre comment déboguer un projet JavaScript dans VS Code

Déboguer JavaScript dans VS Code

Le premier fichier que je voudrais que vous regardiez est src / places. js . Vous devrez ouvrir le dossier debug-project dans VS Code ( Fichier > Ouvrir le dossier ) et sélectionner le fichier dans l'éditeur.

 lieux de const = [];

module.exports = {
  des endroits,

  addPlace: (ville, pays) => {
    const id = ++ places.length;
    laissez numType = 'impair';
    if (id% 2) {
      numType = 'even';
    }
    places.push ({
      id, ville, pays, numType,
    });
  },
}

Le code est assez simple, et si vous avez suffisamment d'expérience dans le codage, vous remarquerez qu'il a quelques bugs. Si vous les remarquez, veuillez les ignorer. Sinon, parfait. Ajoutons quelques lignes en bas pour tester manuellement le code:

 module.exports.addPlace ('Mombasa', 'Kenya');
module.exports.addPlace ('Kingston', 'Jamaica');
module.exports.addPlace ('Cape Town', 'Afrique du Sud');

Maintenant, je suis sûr que vous êtes impatient de faire un console.log pour afficher la valeur de places . Mais ne faisons pas ça. Au lieu de cela, ajoutons points d'arrêt . Il suffit de les ajouter en faisant un clic gauche sur la gouttière – c'est-à-dire l'espace vide à côté des numéros de ligne:

 Points rouges indiquant les points de rupture

Voir les points rouges sur le côté? Ce sont les points d'arrêt. Un point d'arrêt est simplement une indication visuelle indiquant à l'outil de débogage où suspendre l'exécution. Ensuite, sur la barre d'action, cliquez sur le bouton de débogage (l'icône qui dit "No Bugs Allowed").

 Le panneau de débogage

Regardez la section supérieure. Vous remarquerez qu'il y a une icône d'engrenage avec un point rouge. Il suffit de cliquer dessus. Un fichier de configuration de débogage, launch.json sera créé pour vous. Mettez à jour la configuration comme ceci afin que vous puissiez exécuter le débogueur de VS Code sur places.js :

 "configurations": [
  {
    "type": "node",
    "request": "launch",
    "name": "Launch Places",
    "program": "${workspaceFolder}\src\places.js"
  }
]

Note: Selon votre système d'exploitation, vous devrez peut-être remplacer la double barre oblique inverse ( \ ) par une seule barre oblique ( / ).

Après avoir enregistré le fichier, vous remarquerez que le panneau de débogage a une nouvelle liste déroulante, Launch Places . Pour l'exécuter, vous pouvez:

  • appuyer sur le bouton Green Play du panneau de débogage
  • appuyer sur F5
  • cliquer sur Déboguer > Démarrer le débogage

Utilisez la méthode que vous voulez et observez le processus de débogage en action:

 Debug en cours d'exécution

Un certain nombre de choses se succèdent rapidement lorsque vous cliquez sur le bouton de débogage. Tout d'abord, une barre d'outils apparaît en haut de l'éditeur. Il possède les contrôles suivants:

  • Ancrage Drag Dots : pour déplacer la barre d'outils quelque part, il ne bloque rien
  • Continuer : continuer la session de débogage
  • Pas à pas : exécuter le code ligne par ligne, sauter les fonctions
  • Entrer dans : exécuter le code ligne par ligne, entrer dans les fonctions
  • Sortir : si déjà dedans une fonction, cette commande vous sortira
  • Redémarrer : redémarre la session de débogage
  • Stop : arrête la session de débogage.

En ce moment, vous remarquerez que la session de débogage a fait une pause sur votre premier point d'arrêt. Pour continuer la session, appuyez simplement sur le bouton Continuer ce qui entraînera l'exécution jusqu'à ce qu'il atteigne le deuxième point d'arrêt et une nouvelle pause. Frapper Continuer achèvera l'exécution et la session de débogage se terminera.

Commençons à nouveau le processus de débogage en appuyant sur F5 . Assurez-vous que les deux points d'arrêt sont toujours en place. Lorsque vous placez un point d'arrêt, le code s'arrête sur la ligne spécifiée. Il n'exécute pas cette ligne à moins que vous ne frappiez Continuer ( F5 ) ou Pas à pas ( F10 ). Avant de frapper quoi que ce soit, regardons les sections qui composent le panneau de débogage:

  • Variables : affiche les variables locales et globales dans la portée actuelle (ie au point d'exécution)
  • Regarder : vous pouvez ajouter manuellement les expressions des variables que vous voulez surveiller
  • Call Stack : affiche une pile d'appel du code en surbrillance
  • Breakpoints : affiche une liste de fichiers avec des points d'arrêt, ainsi que leurs numéros de ligne.

Pour ajouter une expression à la section Watch cliquez simplement sur le signe + et ajoutez une expression JavaScript valide – comme places.length . Lorsque le débogueur s'arrête, si votre expression est dans la portée, la valeur sera imprimée. Vous pouvez également passer la souris sur les variables qui sont actuellement dans la portée. Un popup apparaîtra affichant leurs valeurs.

Actuellement le tableau places est vide. Appuyez sur n'importe quel contrôle de navigation pour voir comment le débogage fonctionne. Par exemple, Pas à pas passera à la ligne suivante, tandis que Entrez dans pour accéder à la fonction addPlace . Prenez un peu de temps pour vous familiariser avec les commandes.

Dès que vous avez fait un pas, passez la souris sur la variable place . Une fenêtre apparaîtra. Développez les valeurs à l'intérieur jusqu'à ce que vous ayez une vue similaire:

 La fenêtre contextuelle places

Vous pouvez également inspecter toutes les variables incluses dans la section Variables .  La section des variables

C'est assez impressionnant comparé à ce que nous faisons normalement avec console.log . Le débogueur nous permet d'inspecter les variables à un niveau plus profond. Vous avez peut-être également remarqué quelques problèmes avec la sortie du tableau lieux :

  1. il y a plusieurs espaces dans le tableau – emplacements [0] et emplacements [2] undefined
  2. la propriété numType affiche même pour des valeurs impaires id . Pour l'instant, il suffit de mettre fin à la session de débogage . Nous allons les corriger dans la section suivante.

    Test de débogage avec Mocha

    Ouvrez test / placesTest.js et passez en revue le code qui a été écrit pour tester le code dans places.test . Si vous n'avez jamais utilisé Mocha auparavant, vous devez d'abord l'installer globalement afin d'exécuter les tests.

     # Installer mocha globalement
    npm install -g mocha
    
    # Exécuter des tests de moka
    moka
    

    Vous pouvez également exécuter npm test pour exécuter les tests. Vous devriez obtenir le résultat suivant:

     Échec des tests de moka

    Tous les tests échouent. Pour découvrir le problème, nous allons exécuter les tests en mode débogage. Pour ce faire, nous avons besoin d'une nouvelle configuration. Accédez au panneau de débogage et cliquez sur la liste déroulante pour accéder à l'option Ajouter une configuration :

     Ajouter une configuration

    Le fichier launch.json s'ouvre pour

     Ajouter des tests de moka

    Sélectionnez simplement Tests de moka . La configuration suivante sera insérée pour vous:

     {
      "type": "noeud",
      "request": "lancement",
      "name": "Mocha Tests",
      "programme": "$ {workspaceFolder} / node_modules / mocha / bin / _mocha",
      "args": [
        "-u",
        "tdd",
        "--timeout",
        "999999",
        "--colors",
        "${workspaceFolder}/test"
      ],
      "internalConsoleOptions": "openOnSessionStart"
    },
    

    Les paramètres par défaut sont bien. Retournez à la liste déroulante et sélectionnez Mocha Tests . Vous devrez commenter les trois dernières lignes que vous avez ajoutées dans places.js ; sinon les tests ne seront pas exécutés comme prévu. Retournez à placesTest.js et ajoutez un point d'arrêt sur la ligne juste avant le premier échec du test. Cela devrait être la ligne sept, où il est dit:

     addPlace ('Nairobi', 'Kenya');
    

    Veillez à ajouter une expression places.length dans la section de surveillance. Cliquez sur le bouton Play pour démarrer la session de débogage

     Début du test moka

    Au début du test, places.length devrait être nul . Si vous cliquez sur Pas sur places.length lit 2, mais seulement une place a été ajoutée. Comment cela peut-il être?

    Redémarrez la session de débogage, et cette fois utilisez Entrez dans pour accéder à la fonction addPlace . Le débogueur vous dirigera vers places.js . La valeur de places.length est toujours zéro. Cliquer sur Passer au dessus de pour exécuter la ligne en cours

     Pas de test de moka

    Aha! La valeur de places.length vient d'être incrémentée de 1, mais nous n'avons rien ajouté au tableau. Le problème est dû à l'opérateur ++ qui est en train de muter la longueur du tableau. Pour résoudre ce problème, remplacez simplement la ligne par:

     const id = places.length + 1;
    

    De cette façon, nous pouvons obtenir la valeur de id sans changer la valeur de places.length . Alors que nous sommes toujours en mode débogage, essayons de résoudre un autre problème où la propriété numType reçoit la valeur même alors que id est 1. Le problème semble être l'expression du module à l'intérieur de l'instruction if:

     Mocha if error

    Faisons une expérience rapide en utilisant la console de débogage. Commencez à taper une expression correcte pour l'instruction if :

     Console de débogage Mocha

    La console de débogage est similaire à la console du navigateur. Il vous permet d'effectuer des expériences en utilisant des variables qui sont actuellement dans la portée. En essayant quelques idées dans la console, vous pouvez facilement trouver la solution sans jamais quitter l'éditeur. Nous allons maintenant corriger l'instruction failing:

     if (id% 2 === 0) {
      numType = 'even';
    }
    

    Redémarrez la session de débogage et appuyez sur . Continuer pour ignorer le point d'arrêt actuel. Le premier test, "peut ajouter une place", passe maintenant. Mais le deuxième test ne l'est pas. Pour résoudre ce problème, nous avons besoin d'un autre point d'arrêt. Enlevez l'actuel et placez un nouveau point d'arrêt sur la ligne 16, où il est écrit:

     addPlace ('Cape Town', 'South Africa');
    

    Démarrer une nouvelle session de débogage:

     Mocha test2 échoue

    Là! Regardez la section Variables . Même avant le début du deuxième test, nous découvrons que le tableau contient déjà des données existantes créées par le premier test. Cela a évidemment pollué notre test actuel. Pour résoudre ce problème, nous devons implémenter une sorte de setup fonction qui réinitialise le tableau pour chaque test. Pour faire cela dans Mocha, ajoutez juste le code suivant avant les tests:

     beforeEach (() => {
      places.length = 0;
    });
    

    Redémarrez le débogueur et laissez-le marquer une pause sur le point d'arrêt. Le tableau a maintenant un état propre. Cela devrait permettre à notre test de fonctionner sans être pollué. Il suffit de cliquer sur Continuer pour laisser s'exécuter le reste du code de test

     Les tests de moka ont réussi

    Tous les tests sont en cours. Vous devriez vous sentir assez impressionnant, puisque vous avez appris à déboguer du code sans écrire une seule ligne de console.log . Voyons maintenant comment déboguer le code côté client à l'aide du navigateur.

    Déboguer JavaScript avec Chrome Debugger

    Maintenant que vous connaissez les bases du débogage de JavaScript dans VS Code, nous allons voir comment déboguer un projet un peu plus complexe en utilisant l'extension Debugger for Chrome . Ouvrez simplement le panneau du marché via la barre d'action. Recherchez l'extension et installez-la

     Débogueur pour Chrome

    Après l'installation, appuyez sur recharger pour activer l'extension. Examinons rapidement le code que nous allons déboguer. L'application Web est principalement un projet JavaScript côté client qui est lancé en exécutant un serveur Express:

     const express = require ('express');
    
    const app = express ();
    port const = 3000;
    
    // Définir le dossier public en tant que root
    app.use (express.static ('public'));
    
    // Fournit l'accès au dossier node_modules
    app.use ('/ scripts', express.static (`$ {__ dirname} / node_modules /`));
    
    // Redirige tout le trafic vers index.html
    app.use ((req, res) => res.sendFile (`$ {__ dirname} / public / index.html`));
    
    app.listen (port, () => {
      console.info ('écouter sur% d', port);
    });
    

    Tout le code côté client se trouve dans le dossier public . Les dépendances du projet incluent Semantic-UI-CSS, jQuery, Vanilla Router, Axios et Handlebars. Voici à quoi ressemble le projet lorsque vous l'exécutez avec npm start . Vous devrez ouvrir l'URL localhost: 3000 dans votre navigateur pour voir l'application.

     Lieux manquant le tableau

    Essayez d'ajouter un nouveau lieu. Quand vous le faites, vous verrez que rien ne semble se passer. Il est clair que quelque chose ne va pas, alors il est temps de regarder sous le capot. Nous allons d'abord examiner le code avant de commencer notre session de débogage. Ouvrez public / index.html . Notre objectif est actuellement cette section:

    
     

Ajouter Adresse

Si vous jetez un rapide coup d'œil, le code apparaîtra correct. Donc le problème doit être dans app.js . Ouvrez le fichier et analysez le code ici. Voici les sections de code auxquelles vous devriez faire attention. Prenez votre temps pour lire les commentaires afin de comprendre le code.

 // Charger les racines DOM
const el = $ ('# app');
const placesTable = $ ('# places-table');

// Initialiser un tableau de lieux vides
lieux de const = [];

// Compiler les modèles
const placesFormTemplate = Handlebars.compile ($ ('# places-form-template') .html ());
const placesTableTemplate = Handlebars.compile ($ ('# places-table-template') .html ());

const addPlace = (ville, pays) => {
  const id = places.length + 1;
  const numType = (id% 2 === 0)? 'même bizarre';
  places.push ({
    id, ville, pays, numType,
  });
}

// Remplit le tableau des lieux
addPlace ('Nairobi', 'Kenya');

...

// Vue des lieux - '/'
router.add ('/', () => {
  // Afficher le formulaire de lieux
  const html = placesFormTemplate ();
  el.html (html);
  // Règles de validation de formulaire
  $ ('.ui.form') .formulaire ({
    des champs: {
      ville: 'vide',
      pays: 'vide',
    },
  });
  // Afficher la table des lieux
  const tableHtml = placesTableTemplate ({lieux});
  placesTable.html (tableHtml);
  $ ('. submit'). on ('clic', () => {
    const city = $ ('# ville'). val ();
    const country = $ ('# pays'). val ();
    addPlace (ville, pays);
    placesTable.html (placesTableTemplate ({lieux}));
    $ ('form'). form ('clair');
    return false;
  });
});

Tout semble bien. Mais quel pourrait être le problème? Plaçons un point d'arrêt sur la ligne 53 où il est dit:

 placesTable.html (tableHtml);

Ensuite, créez une configuration Chrome via le panneau de débogage. Sélectionnez l'option en surbrillance:

 Configuration du débogage Chrome

Ensuite, mettez à jour la configuration de Chrome comme suit pour l'adapter à notre environnement:

 {
  "type": "chrome",
  "request": "lancement",
  "name": "Lancer Chrome",
  "url": "http: // localhost: 3000",
  "webRoot": "$ {workspaceFolder} / public"
},

Ensuite, démarrez le serveur normalement en utilisant npm start ou node server . Puis sélectionnez Lancer Chrome et démarrez la session de débogage. Une nouvelle instance de Chrome sera lancée en mode débogage et l'exécution devrait s'arrêter là où vous avez défini le point d'arrêt. C'est le bon moment pour positionner côte à côte Visual Studio Code et l'instance Chrome afin de pouvoir travailler efficacement.

 Déboguer JavaScript avec Chrome et VS Code

Passer la souris sur la placeTable constant. Une fenêtre contextuelle apparaît, mais elle semble vide. Dans le panneau de la montre, ajoutez les expressions el et placesTable . Ou, alternativement, faites simplement défiler jusqu'à l'endroit où les constantes ont été déclarées

 Element popup

Notez que el est renseigné mais placesTable est vide . Cela signifie que jQuery n'a pas pu trouver l'élément # places-table . Revenons à public / index.html et trouvons où se trouve cette # places-table

Aha! La table div que nous voulons est située sur la ligne 55, juste à l'intérieur du place-form-template . Cela signifie que la div # places-table ne peut être trouvée qu'après le modèle, places-form-template a été chargé. Pour résoudre ce problème, revenez à app.js et déplacez le code sur la ligne 52, juste après le commentaire "Display Places Table":

 const placesTable = $ ('# places-table') ;

Enregistrez le fichier et redémarrez la session de débogage. Quand il atteint le point d'arrêt, appuyez simplement sur Continuez et laissez le code finir de s'exécuter. La table devrait maintenant être visible:

 Table fixe Chrome

Vous pouvez maintenant supprimer le point d'arrêt. Essayons d'ajouter un nouvel endroit – par exemple, Cape Town, Afrique du Sud

 Pays disparu

Hmm … ce n'est pas correct. L'endroit est ajouté, mais le pays n'est pas affiché. Le problème n'est évidemment pas le code de la table HTML, puisque la première cellule contient la cellule pays, donc quelque chose doit se passer du côté JavaScript. Ouvrez app.js et ajoutez un point d'arrêt sur la ligne 58 où il est dit:

 addPlace (city, country);

Redémarrez la session de débogage et réessayez d'ajouter un nouvel emplacement. L'exécution doit s'arrêter au point d'arrêt que vous venez de définir. Commencez à survoler les variables pertinentes. Vous pouvez également ajouter des expressions au panneau de la montre, comme indiqué ci-dessous:

 Pays bug trouvé

Comme vous pouvez le voir, la variable country est indéfinie, mais ] ville variable est. Si vous regardez les expressions du sélecteur jQuery qui ont été définies dans le panneau de la montre, vous remarquerez que le sélecteur #country ne renvoie rien. Cela signifie qu'il n'était pas présent dans le DOM. Dirigez-vous vers index.html pour vérifier.

Hélas! Si vous regardez la ligne 59 où l'entrée country a été définie, il manque l'attribut ID. Vous devez en ajouter un comme ceci:

  

Redémarrez la session de débogage et essayez d'ajouter un nouvel emplacement

 Correction d'un bug de pays

Cela fonctionne maintenant! Excellent travail pour corriger un autre bug sans console.log . Passons maintenant à notre dernier bug

Déboguer le routage côté client

Cliquez sur le lien Convert dans la barre de navigation. Vous devriez être pris à cette vue pour effectuer une conversion rapide:

 Convertir la monnaie

Cela fonctionne bien. Pas de bugs là-bas.

En fait, il y en a, et ils n'ont rien à voir avec la forme. Pour les repérer, actualisez la page.

Dès que vous appuyez sur recharger, l'utilisateur revient à / la racine de l'application. Il s'agit clairement d'un problème de routage que le paquetage Vanilla Router est censé gérer. Revenez à app.js et cherchez cette ligne:

 router.navigateTo (window.location.path);

Ce morceau de code est censé rediriger les utilisateurs vers la bonne page en fonction de l'URL fournie. Mais pourquoi ça ne marche pas? Ajoutons un point d'arrêt ici, puis revenons à l'URL / convert et réessayons la mise à jour de la page.

Dès que vous rafraîchissez, l'éditeur s'arrête au point d'arrêt. Passez la souris sur l'express windows.location.path . Une fenêtre contextuelle apparaît indiquant que la valeur est indéfinie . Allons à la console de débogage et commençons à taper l'expression ci-dessous:

 Erreur de navigation

Hold up! La console de débogage nous a juste donné l'expression correcte. Il est supposé lire window.location.pathname . Corrigez la ligne de code, supprimez le point d'arrêt et redémarrez la session de débogage.

Accédez à l'URL / convert et actualisez. La page devrait recharger le bon chemin. Awesome!

C'est le dernier bug que nous allons écraser, mais je vous recommande de continuer à expérimenter dans la session de débogage. Mettre en place de nouveaux points d'arrêt afin d'inspecter d'autres variables. Par exemple, extrayez l'objet de réponse dans la fonction de routeur ('/ convert') . Cela montre comment vous pouvez utiliser une session de débogage pour déterminer la structure de données renvoyée par une requête API lors de la gestion de nouveaux points de terminaison REST.

 Réponse inspection

Résumé

Maintenant que nous sommes arrivés à la fin de ce tutoriel, vous devriez être fier de vous pour apprendre une compétence essentielle dans la programmation. Apprendre à déboguer le code correctement vous aidera à corriger les erreurs plus rapidement. Vous devez être conscient, cependant, que cet article ne fait qu'effleurer la surface de ce qui est possible, et vous devriez jeter un coup d'œil à la documentation complète de débogage pour VS Code. Vous trouverez ici plus de détails sur les commandes spécifiques et les types de points d'arrêt que nous n'avons pas couverts, tels que Points d'arrêt conditionnels .

J'espère que vous cesserez d'utiliser la console . log pour déboguer et à la place atteindre VS Code pour commencer à débugger JavaScript comme un pro!




Source link