Module communautaire génial

déboguer

Statut de construction Statut de couverture Mou OuvrirCollectif OuvrirCollectif

Un petit utilitaire de débogage JavaScript inspiré de la technique de débogage du noyau Node.js. Fonctionne dans Node.js et les navigateurs Web.

Installation

1
$ npm install debug

Usage

debugexpose une fonction ; transmettez simplement à cette fonction le nom de votre module, et elle renverra une version décorée de console.errorà laquelle vous pourrez transmettre les instructions de débogage. Cela vous permettra de basculer la sortie de débogage pour différentes parties de votre module ainsi que pour le module dans son ensemble.

Exemple app.js :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
var debug = require('debug')('http') , http = require('http') , name = 'My App'; // fake app debug('booting %o', name); http.createServer(function(req, res){ debug(req.method + ' ' + req.url); res.end('hello\n'); }).listen(3000, function(){ debug('listening'); }); // fake worker of some kind require('./worker');

Exemple de travailleur.js :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
var a = require('debug')('worker:a') , b = require('debug')('worker:b'); function work() { a('doing lots of uninteresting work'); setTimeout(work, Math.random() * 1000); } work(); function workb() { b('doing some work'); setTimeout(workb, Math.random() * 2000); } workb();

La DEBUGvariable d'environnement est ensuite utilisée pour les activer en fonction de noms délimités par des espaces ou des virgules.

Voici quelques exemples:

capture d'écran du 08/08/2017 à 12 h 53 04 capture d'écran le 08/08/2017 à 12 h 53 38 capture d'écran du 08/08/2017 à 12 h 53 25 h

Remarque Windows

Sous Windows, la variable d'environnement est définie à l'aide de la setcommande.

1
set DEBUG=*,-not_this

Notez que PowerShell utilise une syntaxe différente pour définir les variables d'environnement.

1
$env:DEBUG = "*,-not_this"

Ensuite, exécutez le programme à déboguer comme d'habitude.

Couleurs de l'espace de noms

Chaque instance de débogage a une couleur générée pour elle en fonction de son nom d'espace de noms. Cela aide lors de l'analyse visuelle de la sortie de débogage pour identifier à quelle instance de débogage appartient une ligne de débogage.

Noeud.js

Dans Node.js, les couleurs sont activées lorsque stderr est un TTY. Vous devez également installer le supports-colormodule avec le débogage, sinon le débogage n'utilisera qu'une petite poignée de couleurs de base.

Navigateur Web

Les couleurs sont également activées sur les "Inspecteurs Web" qui comprennent l' %coption de formatage. Il s'agit des inspecteurs Web WebKit, Firefox ( depuis la version 31 ) et le plugin Firebug pour Firefox (n'importe quelle version).

Différent en millisecondes

Lors du développement actif d'une application, il peut être utile de voir le temps passé entre un debug()appel et le suivant. Supposons par exemple que vous invoquiez debug()avant de demander une ressource, et après également, le "+NNNms" vous montrera combien de temps a été passé entre les appels.

Lorsque stdout n'est pas un TTY, Date#toISOString()est utilisé, ce qui le rend plus utile pour enregistrer les informations de débogage, comme indiqué ci-dessous :

Conventions

Si vous l'utilisez dans une ou plusieurs de vos bibliothèques, vous devez utiliser le nom de votre bibliothèque afin que les développeurs puissent basculer le débogage comme ils le souhaitent sans deviner les noms. Si vous avez plusieurs débogueurs, vous devez les préfixer avec le nom de votre bibliothèque et utilisez ":" pour séparer les fonctionnalités. Par exemple, "bodyParser" de Connect serait alors "connect:bodyParser". Si vous ajoutez un "*" à la fin de votre nom, il sera toujours activé quel que soit le paramètre de DEBUG. variable d'environnement. Vous pouvez ensuite l'utiliser pour la sortie normale ainsi que pour la sortie de débogage.

Caractères génériques

Le *caractère peut être utilisé comme caractère générique. Supposons par exemple que votre bibliothèque ait des débogueurs nommés "connect:bodyParser", "connect:compress", "connect:session", au lieu de lister les trois avec , DEBUG=connect:bodyParser,connect:compress,connect:sessionvous pouvez simplement faire DEBUG=connect:*, ou exécuter tout ce qui utilise ce module utilise simplement DEBUG=*.

Vous pouvez également exclure des débogueurs spécifiques en les préfixant d'un caractère "-". Par exemple, cela DEBUG=*,-connect:*inclurait tous les débogueurs à l'exception de ceux commençant par "connect:".

Variables d'environnement

Lors de l'exécution via Node.js, vous pouvez définir quelques variables d'environnement qui modifieront le comportement de la journalisation de débogage :

Nom But
DEBUG Active/désactive les espaces de noms de débogage spécifiques.
DEBUG_HIDE_DATE Masquer la date de la sortie de débogage (non-TTY).
DEBUG_COLORS S'il faut ou non utiliser des couleurs dans la sortie de débogage.
DEBUG_DEPTH Profondeur d'inspection des objets.
DEBUG_SHOW_HIDDEN Affiche les propriétés masquées sur les objets inspectés.

Remarque : Les variables d'environnement commençant par DEBUG_finissent par être converties en un objet Options qui est utilisé avec les formateurs %o/ %O. Consultez la documentation Node.js util.inspect() pour la liste complète.

Formateurs

Debug utilise un formatage de style printf . Vous trouverez ci-dessous les formateurs officiellement pris en charge :

Formateur Représentation
%O Imprimez joliment un objet sur plusieurs lignes.
%o Imprimez joliment un objet sur une seule ligne.
%s Chaîne.
%d Nombre (entier et flottant).
%j JSON. Remplacé par la chaîne « [Circulaire] » si l'argument contient des références circulaires.
%% Signe de pourcentage unique (« % »). Cela ne consomme pas d’argument.

Custom formatters

Vous pouvez ajouter des formateurs personnalisés en étendant l' debug.formattersobjet. Par exemple, si vous souhaitez ajouter la prise en charge du rendu d'un tampon au format hexadécimal avec %h, vous pouvez faire quelque chose comme :

1 2 3 4 5 6 7 8 9
const createDebug = require('debug') createDebug.formatters.h = (v) => { return v.toString('hex') } // …elsewhere const debug = createDebug('foo') debug('this is hex: %h', new Buffer('hello world')) // foo this is hex: 68656c6c6f20776f726c6421 +0ms

Prise en charge du navigateur

Vous pouvez créer un script prêt pour le navigateur à l'aide de browserify , ou simplement utiliser la version browserify-as-a-service , si vous ne souhaitez pas le créer vous-même.

L'état d'activation du débogage est actuellement conservé par localStorage. Considérez la situation ci-dessous dans laquelle vous avez worker:aet worker:b, et souhaitez déboguer les deux. Vous pouvez l'activer en utilisantlocalStorage.debug :

1
localStorage.debug = 'worker:*'

Et puis actualisez la page.

1 2 3 4 5 6 7 8 9 10
a = debug('worker:a'); b = debug('worker:b'); setInterval(function(){ a('doing some work'); }, 1000); setInterval(function(){ b('doing some work'); }, 1200);

Flux de sortie

Par défaut, debugla connexion sera enregistrée sur stderr, mais cela peut être configuré par espace de noms en remplaçant la logméthode :

Exemple stdout.js :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
var debug = require('debug'); var error = debug('app:error'); // by default stderr is used error('goes to stderr!'); var log = debug('app:log'); // set this namespace to log via console.log log.log = console.log.bind(console); // don't forget to bind to console! log('goes to stdout'); error('still goes to stderr!'); // set all output to go via console.info // overrides all per-namespace log settings debug.log = console.info.bind(console); error('now goes to stdout via console.info'); log('still goes to stdout, but via console.info now');

Définir dynamiquement

Vous pouvez également activer le débogage dynamiquement en appelant la enable()méthode :

1 2 3 4 5 6 7 8 9
let debug = require('debug'); console.log(1, debug.enabled('test')); debug.enable('test'); console.log(2, debug.enabled('test')); debug.disable(); console.log(3, debug.enabled('test'));

imprimer:

1 2 3
1 false 2 true 3 false

Utilisation :
enable(namespaces)
namespacespeut inclure des modes séparés par deux points et des caractères génériques.

Notez que l'appel enable()remplace complètement la variable DEBUG précédemment définie :

1 2
$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))' => false

Vérifier si une cible de débogage est activée

Après avoir créé une instance de débogage, vous pouvez déterminer si elle est activée ou non en vérifiant la enabledpropriété :

1 2 3 4 5
const debug = require('debug')('http'); if (debug.enabled) { // do stuff... }

Vous pouvez également activer ou désactiver manuellement cette propriété pour forcer l'activation ou la désactivation de l'instance de débogage.

Auteurs

  • TJ Holowaychuk
  • Nathan Rajlich
  • Andrew Rhyne

Bailleurs de fonds

Soutenez-nous avec un don mensuel et aidez-nous à poursuivre nos activités. [ Devenir contributeur ]

Commanditaires

Devenez sponsor et obtenez votre logo sur notre README sur Github avec un lien vers votre site. [ Devenir sponsor ]

Licence

(La licence MIT)

Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca>

L'autorisation est accordée par la présente, gratuitement, à toute personne obtenant une copie de ce logiciel et des fichiers de documentation associés (le « Logiciel »), d'utiliser le Logiciel sans restriction, y compris, sans limitation, les droits d'utilisation, de copie, de modification, de fusion. , publier, distribuer, accorder des sous-licences et/ou vendre des copies du Logiciel, et permettre aux personnes à qui le Logiciel est fourni de le faire, sous réserve des conditions suivantes :

L'avis de droit d'auteur ci-dessus et cet avis d'autorisation doivent être inclus dans toutes les copies ou parties substantielles du logiciel.

LE LOGICIEL EST FOURNI « TEL QUEL », SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE, Y COMPRIS MAIS SANS LIMITATION LES GARANTIES DE QUALITÉ MARCHANDE, D'ADAPTATION À UN USAGE PARTICULIER ET DE NON-VIOLATION. EN AUCUN CAS LES AUTEURS OU LES TITULAIRES DES DROITS D'AUTEUR NE SERONT RESPONSABLES DE QUELQUE QUELQUE CAS RÉCLAMATION, DOMMAGES OU AUTRE RESPONSABILITÉ, QUE CE SOIT DANS UNE ACTION CONTRACTUELLE, DÉLIT OU AUTRE, DÉCOULANT DE, OU EN RELATION AVEC LE LOGICIEL OU L'UTILISATION OU D'AUTRES AFFAIRES DANS LE LOGICIEL.