Expérience de débogage moderne partie 2


Dans la première partie, nous avons vu comment écrire et exécuter du JavaScript à l’aide de DevTools. Dans la deuxième partie, nous examinerons le débogage de JavaScript et l’adoption d’un flux de travail permettant de résoudre plus efficacement les erreurs JavaScript et de diagnostiquer les problèmes..

Débogage de JavaScript à l'aide de DevTools

Débogueur mot-clé

Vous pouvez utiliser le mot clé debugger directement dans votre code pour appeler les fonctionnalités de débogage (le cas échéant) du moteur d'exécution JavaScript. L'effet de l'ajout du mot clé débogueur dans votre code est identique à la définition manuelle d'un point d'arrêt via l'interface utilisateur de DevTools. Dans Chrome, le débogueur le mot clé n'a aucun effet tant que DevTools est fermé.

Commandes du débogueur

Les commandes du débogueur fournissent un contrôle fin du flux de débogage. Utilisez-les lorsque vous êtes en pause à un point d'arrêt pour naviguer efficacement dans le code JavaScript. Chaque contrôle de débogueur répertorié dans cette section correspond à un bouton dans les outils de développement que vous pouvez sélectionner lorsque vous êtes en pause à un point d'arrêt..

Continuer

Laisse le point d'arrêt actuel et reprend l'exécution du code normalement. Cela n'affecte pas les autres points d'arrêt qui n'ont pas encore été mis en pause.

Utilisation Continuer lorsque le point d'arrêt actuellement mis en pause n'est pas utile et que vous souhaitez que l'exécution du code reprenne normalement.

Enjamber

Parcourez le code ligne par ligne (une ligne par clic) jusqu'à ce qu'un appel de fonction soit atteint. À ce stade, l’appel de la fonction est "écrasé" et vous n’intervenez pas dans cet appel de fonction particulier..

Utilisation Enjamber lorsque ce que vous essayez de résoudre est couvert par la fonction actuelle et que vous n'avez pas besoin de regarder les appels de fonction externes.

Entrer dans

Semblable à Enjamber, sauf que dans ce cas, vous accédez aux appels de fonction externes en allant à leur première ligne.

Utilisation Entrer dans lorsque vous êtes intéressé par l'exécution ligne par ligne ainsi que par les appels de fonction externes.

Sors

Quand vous entrez dans une fonction, Sors continuera à exécuter le reste du code de fonction, mais il n'est pas débogué.

Utilisation Sors lorsque vous n'avez aucun intérêt pour le reste de la fonction actuelle et que vous souhaitez continuer à déboguer en dehors de celle-ci.

La pile d'appels

La pile d'appels est active lorsqu'elle est suspendue à un point d'arrêt. Le chemin d’exécution qui mène au point d’interruption actuellement mis en pause est indiqué dans la pile d’appels, l’appel supérieur étant le plus récent..

Chaque appel dans la pile contient:

  • nom de la fonction
  • nom de fichier contenant la fonction
  • la ligne de code où la fonction existe

Cliquez sur n'importe quel appel dans la pile pour naviguer jusqu'à son point dans le code source avec la ligne appropriée en surbrillance. Pour copier une trace de pile dans votre presse-papiers, clic-droit sur un appel et sélectionnez Copier la trace de la pile. Dans le menu contextuel de la pile d'appels, vous pouvez également sélectionner Redémarrer le cadre.

Fonctions de réécriture en pause à un point d'arrêt

Considérez le cas d’utilisation que le débogueur a suspendu à mi-parcours d’une fonction de rappel déclenchée par un gestionnaire d’événements click et vous essayez de déboguer pourquoi la récupération du cible ne semble pas fonctionner comme prévu. 

Vous constatez qu'une tentative d'accès à la propriété cible a été effectuée dans le cadre du ce mot-clé, mais vous rappelez ensuite que c'est une propriété de l'objet événement passé en tant qu'argument à la fonction de rappel. 

Vous pouvez réécrire la fonction à l'aide de Live Edit pour vérifier que vos modifications fonctionnent et que le nouveau JavaScript est injecté dans le moteur V8..

monitorEvents

Lorsque vous écrivez un gestionnaire d’événements pour un événement tel que scroll, vous pouvez commencer par utiliser console.log pour voir à quoi ressemble l'argument passé (l'objet event). Un conseil rapide pour y parvenir est d’utiliser le monitorEvents raccourci. Collez le code suivant dans le Panneau de la console puis faites défiler la page:

monitorEvents (fenêtre, "redimensionner");

Notez que l'objet événement est enregistré dans la console, prêt pour l'inspection..

Déboguer

Lorsque vous souhaitez que le débogueur suspende la première ligne d'une fonction lors de son exécution, vous pouvez effectuer l'une des opérations suivantes:

  • Ajouter un point d'arrêt via l'interface utilisateur de DevTools.
  • Ajouter une instruction de débogage à la fonction.

Une autre technique consiste à exécuter débogage (fn) qui fait partie de l'API de ligne de commande. La fonction prend comme argument la fonction que vous souhaitez déboguer et sera interrompue à la première ligne de son exécution..

Pause sur l'accès à la propriété

Cette technique vous permet de suspendre le débogueur lorsqu'une propriété d'un objet qui vous intéresse est accédée de quelque manière que ce soit (en lecture ou en écriture). Pour interrompre la lecture ou l’écriture d’une propriété d’un objet, exécutez ce qui suit (via la commande Panneau de la console ou Extraits):

Object.defineProperty (document.body, 'scrollTop', get: function () debugger;, set: function (val) debugger;);

Ceci applique un getter et un setter au scrollTop propriété du document.body objet. L'instruction de débogage existe dans le getter et le setter personnalisés. Vous pouvez aussi utiliser Objet.observer interrompre les ajouts de propriétés pour un objet spécifié:

var watchMe = ; Object.observe (watchMe, function () debugger;);

Points d'arrêt conditionnels à l'aide de console.log

Le mot-clé débogueur à part, pour définir un point d'arrêt via DevTools, vous pouvez cliquer sur la ligne de code que vous souhaitez interrompre dans la gouttière. Cette méthode de définition d'un point d'arrêt comporte des fonctionnalités supplémentaires: vous définissez un point d'arrêt conditionnel qui ordonnera aux outils de développement de faire une pause à un point d'arrêt uniquement si une expression donnée a la valeur true. Par exemple, vous pouvez définir un point d'arrêt conditionnel sur pause uniquement s'il existe un argument d'erreur..

Pour définir un point d'arrêt conditionnel:

  1. Clic-droit dans le caniveau.
  2. Sélectionner Ajouter un point d'arrêt conditionnel.
  3. Entrez l'expression que vous souhaitez que DevTools évalue..
  4. presse Entrer.

Vous pouvez également utiliser la technique du point d'arrêt conditionnel pour insérer rapidement un console.log déclaration en tant qu'expression à évaluer. Puisque console.log évalue à indéfini, DevTools ne se met pas en pause, mais comme l'expression est toujours exécutée, vous pouvez inspecter la valeur des variables de cette façon..

Utilisation des expressions de surveillance

Lorsque le débogueur est suspendu à un point d'arrêt, vous pouvez afficher le Panneau de la console en mode tiroir en utilisant le Échapper clé. Le code que vous entrez est évalué dans le même contexte que le point auquel vous êtes mis en pause, ce qui signifie que les variables dont la portée est étendue vous seront accessibles..

Une expression de montre est un outil permettant de simplifier la technique d’inspection régulière (via console.log par exemple) de variables étendues. Regarder les expressions est un volet du panneau Sources. Vous pouvez ajouter ou supprimer des expressions de surveillance à l'aide de la commande Plus et Moins boutons. Un objet typique à surveiller est le ce objet; remarquez comment il fait référence à un objet de fenêtre global lorsque vous n'êtes pas en pause à un point d'arrêt.

Watch Expressions se mettra généralement à jour pendant que vous parcourez le code. Si ce n'est pas le cas, cliquez sur le bouton Rafraîchir bouton.

Exceptions

Considérez le script suivant:

fonction a () return b ();  fonction b () return c ();  function c () console.trace ('La trace'); retourne 42;  une();

Il y a trois fonctions déclarées. Une fonction une fonction d'appels b, puis fonction b fonction d'appels c. Le script lance la chaîne avec un appel à la fonction une. le console.trace instruction enregistre dans la console une trace de pile à partir du point où la méthode a été appelée. Utiliser console.trace affiche le résultat de l’utilisation de console.trace.

Notez que les noms des fonctions et les lignes où elles sont appelées sont indiqués dans le message de trace. Vous pouvez cliquer sur le numéro de ligne à atteindre jusqu'à son point dans le code source via le panneau Sources. Cette technique fonctionne aussi pour les extraits..

Le débogueur propose différents modes de traitement des exceptions:

  • Pause sur les exceptions non interceptées.
  • Pause sur les exceptions capturées et non capturées.
  • Ne vous arrêtez pas sur les exceptions.

2. Débogage de l'extérieur vers l'intérieur

Lorsque vous devez déboguer un site sur lequel vous avez peu de connaissances, vous pouvez utiliser une technique de débogage différente. Dans cette approche, vous vous connectez à des événements qui, selon vous, vont être déclenchés, et vous demandez à DevTools d'interrompre ces événements si et quand ils se produisent. Il existe deux catégories de points d'entrée "extérieur> dans":

  • Modifications DOM
  • Points d'arrêt du programme d'écoute d'événement

Pause sur les modifications DOM

Vous avez pour tâche de déboguer une page Web, en particulier le DOM. Les nœuds sont ajoutés et supprimés au cours du cycle de vie de la page, et vous devez inspecter le JavaScript qui permet de réaliser cela. Définissez un point d'arrêt DOM en procédant comme suit:

  • Faites un clic droit sur un nœud DOM dans le panneau des éléments.
  • Sélectionnez un point d'arrêt DOM préféré dans la liste. Pause sur menu contextuel.
  • Lorsque vous êtes en pause à un point d'arrêt, vous pouvez voir un message expliquant la raison pour laquelle le débogueur s'est arrêté, comme indiqué dans Raison de la pause à un point d'arrêt..

Chaque fois que vous définissez un point d'arrêt DOM, vous pouvez facilement l'activer ou le désactiver au niveau de la Points d'arrêt DOM volet dans le Panneau d'éléments. Dans ce volet, chaque point d'arrêt que vous avez défini est répertorié et vous pouvez interagir avec ce volet des manières suivantes:

  • Activer et désactiver la case à cocher pour activer ou désactiver le point d'arrêt.
  • Cliquez sur le nom du nœud (souligné) pour y accéder dans l'arborescence DOM..
  • Clic-droit et sélectionnez Supprimer tous les points d'arrêt DOM désactiver et supprimer tous les points d'arrêt DOM.

Modifications de sous-arbres 

La description: Une modification de sous-arbre se produit lorsque l’arborescence d’un nœud racine (qui a le point de rupture défini) est modifiée. Cela peut inclure l'ajout ou la suppression de nœuds.

Cas d'utilisation: Un vide div Le conteneur est présent dans le DOM et une requête Ajax se produit lors du chargement de la page, qui ajoute de nouveaux nœuds au conteneur d'origine. Ajoutez un point d'arrêt de modification de sous-arbre sur le conteneur pour afficher le point exact dans le code qui ajoute de nouveaux nœuds au DOM.

Exemples de message: En pause sur un Sous-arbre modifié point d'arrêt défini sur corps, parce que son descendant p a été éliminé. Ou: en pause sur un Sous-arbre modifié point d'arrêt défini sur div # parent, car un nouvel enfant a été ajouté à ce noeud.

Attributs Modifications 

La description: Une modification d'attribut se déclenche lorsqu'un nom d'attribut ou une valeur sur un nœud est ajouté, supprimé ou modifié. Ceci inclut tous les attributs, tels que classeLes données-*, ou style.

Cas d'utilisation: Un changement visuel se produit sur la page à un moment apparemment aléatoire, et vous le limitez à une classe qui est définie de manière dynamique sur l'élément body. Vous souhaitez rechercher la cause de cet ajout de classe dynamique.

Exemple de message: En pause sur un Attribut modifié point d'arrêt défini sur p.

Élimination des noeuds 

La description: Un point d'arrêt de suppression de nœud se déclenche au point où un nœud est supprimé du parent contenant le point d'arrêt défini.

Cas d'utilisation: Vous construisez une application de liste de tâches et souhaitez vérifier que lorsqu'un utilisateur supprime une tâche, celle-ci est également supprimée du DOM. Vous pouvez définir un point d'arrêt de suppression de nœud pour vous assurer que ce problème se produit..

Exemple de message: En pause sur un Nœud supprimé div # conteneur.

Points d'arrêt de l'écouteur d'événements

Dans DevTools, vous pouvez activer un certain nombre de points d'arrêt prédéfinis du programme d'écoute d'événements. Ceux-ci offrent des points d'entrée dans le code JavaScript qui appartient à une page.

Considérons un simple à propos de: vide page. Définir un Cliquez sur point d'arrêt de l'écouteur d'événements sur cette page en procédant comme suit:

  • Accédez au Points d'arrêt de l'écouteur d'événements volet dans le Panneau de sources.
  • Ouvrez le Souris Catégorie d'auditeur d'événement.
  • Activer le Cliquez sur écouteur d'événement.

Vous avez maintenant défini un point d'arrêt. Si vous cliquez sur la page, notez que rien ne se passe. Maintenant, exécutez le code JavaScript suivant dans le répertoire Panneau de la console.

document.addEventListener ('cliquez sur, console.log.bind (console))

Lorsque vous définissez un point d'arrêt pour le même événement pour lequel vous avez enregistré un écouteur d'événements, le débogueur s'interrompt avant le point d'exécution du rappel de votre écouteur d'événements..

Vous pouvez enregistrer des points d'arrêt pour de nombreux types d'événements, tels que des minuteries, des événements tactiles, etc. répertoriés dans le tableau ci-dessous..

Catégorie d'événement Exemples d'événements

Animation

requestAnimationFrame, cancelAnimationFrame, animationFrameFired

Contrôle

redimensionner, faire défiler, zoomer, mise au point, flou, sélectionner, modifier, envoyer, réinitialiser

Presse-papiers

copier, couper, coller, beforecopy, beforecut, beforepaste

Mutation DOM

DOMActivate, DOMFocusIn, DOMFocusOut, DOMAttrModified, DOMCharacterDataModified, DOMNodeInserted, DOMNodeInsertedIntoDocument, DOMNodeRemoved, DOMNodeRemovedFromDocument, DOMNodeInsertedIntoDocument, DOMNodeRemoved, DOMContentLoaded, DOMContentLoaded

Dispositif

appareilorientation, devicemotion

Glisser / déposer

dragenter, dragover, dragleave, drop

Clavier

saisie au clavier, saisie au clavier, pression au clavier, saisie

Charge

load, beforeunload, décharger, annuler, erreur, hashchange, popstate

Souris

cliquez, dblclick, mousedown, mouseup, mouseover, mousemove, mouseout, mousewheel, wheel

Minuteur

setTimer, clearTimer, timerFired

Toucher

touchstart, touchmove, touchend, touchcancel

WebGL

webglErrorFired, webglWarningFired


La technique du "débogage de l'extérieur dans" peut être utile lorsque vous devez déboguer un site Web tiers dont la fonctionnalité est défaillante, ou même lorsque vous êtes curieux de savoir comment fonctionne un élément de la page que vous consultez..

3. Extensions

Il existe un certain nombre d'extensions Chrome, dont beaucoup améliorent les fonctionnalités de DevTools. Une liste de fonctionnalités est disponible dans la galerie d'extensions de DevTools.

Prétraitement JavaScript de DevTools

Pour les auteurs de DevTools Extension, la fonctionnalité de prétraitement JavaScript est un sujet intéressant à connaître. Le préprocesseur peut intercepter le code source JavaScript avant d'entrer dans le moteur V8, ce qui signifie que le code source JavaScript peut être modifié via DevTools avant d'entrer dans la VM, le tout à partir d'une extension.. 

Outre les fonctionnalités d'interception, l'API de prétraitement dispose d'un accès par programme pour le rechargement des sources de script. Une extension peut, à tout moment de son cycle de vie, recharger une source JavaScript sans recharger la page Web d'origine..

4. Noeud

Cette section couvre quelques outils offrant un certain niveau d’intégration entre Node.js et Chrome DevTools..

Inspecteur de nœuds

Les outils de développement comportent deux parties:

  • L'extrémité avant: C’est ce que vous utilisez et avec lequel vous interagissez. Il est composé de HTML, CSS et JavaScript.
  • Back-end: Dans le cas de l'inspection d'une page dans Google Chrome, le back-end se trouve dans les éléments internes de Chrome. Les messages sont échangés via le protocole de débogage distant.

Toute application peut implémenter la communication via le protocole de débogage distant et permettre à ses utilisateurs de déboguer via DevTools. L'inspecteur de nœud est l'un de ces outils. Après l'installation, vous pouvez exécuter n'importe quel script de noeud à l'aide de Node Inspector. L'outil démarre un serveur Web qui héberge le frontal DevTools. Cette version spéciale de DevTools n'utilise pas le back-end Chrome, mais plutôt celle de Node Inspector..

Comme vous pouvez le voir dans l'inspecteur de nœud, DevTools est suspendu à un point d'arrêt. La pile d'appels fait référence aux appels exécutés dans Node.js. La seule implication du navigateur ici concerne l'interface utilisateur de DevTools..

Node Dump

Utilisez Node Heapdump pour prendre un instantané du segment de mémoire V8 à un moment donné dans votre code. L'état actuel du segment de mémoire V8 est sérialisé et exporté dans un fichier.

Comparez deux instantanés de tas pour déterminer quels objets ne sont pas récupérés. C'est utile pour attraper les fuites de mémoire.

Conclusion

Voilà pour cette série en deux parties sur une expérience de débogage moderne. J'espère qu'à ce stade, vous êtes à l'aise avec la création et le débogage de JavaScript dans Chrome DevTools. Vous connaissez les flux de travail qui peuvent faciliter le débogage et vous connaissez quelques astuces pour gérer un site de production sur lequel vous n'avez pas encore travaillé. Assurez-vous d’essayer certaines des techniques que vous avez apprises ici la prochaine fois que vous aurez besoin de déboguer..

Merci pour la lecture!