Module communautaire génial

déboguer

Statut de la construction Statut de couverture Mou OpenCollective OpenCollective

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

Installation

1
$ npm install debug

Usage

debug expose une fonction; passez simplement à cette fonction le nom de votre module, et il renverra une version décorée de console.error pour que vous puissiez passer des instructions de débogage à. Cela vous permettra de basculer la sortie de débogage pour différentes parties de votre module comme ainsi que 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 fichier worker.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 variable d'environnement DEBUG est ensuite utilisée pour les activer en fonction de l'espace ou des noms délimités par des virgules.

Voici quelques exemples:

capture d'écran 2017-08-08 à 12 53 04 pmcapture d'écran 2017-08-08 à 12 53 38 pmcapture d'écran 2017-08-08 à 12 53 25 pm

Remarque sur Windows

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

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 à identifier à quelle instance de débogage appartient une ligne de débogage.

Node.js

En Node.js, les couleurs sont activés lorsque stderr est un ATS. Vous devez également installer le supports-color le module à côté de débogage, sinon débogage utilisera uniquement une petite poignée de couleurs de base.

Navigateur Web

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

Diff en millisecondes

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

Lorsque stdout n'est pas un ATS, Date#toISOString() est utilisé, ce qui le rend plus utile pour la journalisation des informations de débogage, comme illustré ci-dessous:

Conventions

Si vous utilisez ce dans un ou plusieurs de vos bibliothèques, vous devez utiliser le nom de votre bibliothèque afin que les développeurs peuvent activer le débogage comme vous le souhaitez sans deviner les noms. Si vous avez plus d'un débogueurs vous devez les préfixe avec votre nom de la 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 une sortie normale ainsi que pour une 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 possède des débogueurs nommés "connect: bodyParser", "connect: compress", "connect: session", au lieu de répertorier les trois avec DEBUG=connect:bodyParser,connect:compress,connect:session , vous pouvez simplement faire DEBUG=connect:* , ou pour exécuter tout en utilisant ce module, utilisez simplement DEBUG=* .

Vous pouvez également exclure des débogueurs spécifiques en les préfixant avec un caractère "-". Par exemple, 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 changeront le comportement de la journalisation du débogage:

Nom Objectif
DEBUG Active / désactive des espaces de noms de débogage spécifiques.
DEBUG_HIDE_DATE Masquer la date de la sortie de débogage (non TTY).
DEBUG_COLORS Utiliser ou non des couleurs dans la sortie de débogage.
DEBUG_DEPTH Profondeur d'inspection des objets.
DEBUG_SHOW_HIDDEN Affiche les propriétés caché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 pour util.inspect() pour la liste complète.

Formateurs

Le débogage utilise un formatage de style printf . Voici les formateurs officiellement pris en charge:

Formateur Représentation
%O Imprimez un objet sur plusieurs lignes.
%o Imprimez 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'objet debug.formatters . Par exemple, si vous souhaitez ajouter la prise en charge du rendu d'un tampon en 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 construire un script prêt navigateur en utilisant browserify , ou tout simplement utiliser le browserify-as-a-service de construction , si vous ne voulez pas construire vous - même.

L'état d'activation du débogage est actuellement conservé par localStorage . Considérez la situation ci-dessous où vous avez un worker:a et worker:a worker:b et souhaitez déboguer les deux. Vous pouvez l'activer à l'aide de localStorage.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, le debug se connectera à stderr, mais cela peut être configuré par espace de noms en remplaçant la méthode de log :

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 de manière dynamique en appelant la méthode enable() :

1 2 3 4 5 6 7 8 9 10
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'));

impression:

1 2 3
1 false 2 true 3 false

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

Notez que l'appel de 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 propriété enabled :

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

Vous pouvez également basculer 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

Contributeurs

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

Sponsors

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

Licence

(La licence MIT)

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

La permission est accordée, sans frais, à toute personne obtenant une copie de ce logiciel et des fichiers de documentation associés (le «logiciel»), de traiter le logiciel sans restriction, y compris, sans limitation, les droits d'utilisation, de copie, de modification, de fusion , publier, distribuer, sous-licencier et / ou vendre des copies du Logiciel, et autoriser les personnes à qui le Logiciel est fourni à 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 S'Y LIMITER, LES GARANTIES DE QUALITÉ MARCHANDE, D'ADÉQUATION À UN USAGE PARTICULIER ET D'ABSENCE DE CONTREFAÇON. EN AUCUN CAS LES AUTEURS OU LES TITULAIRES DU DROIT D'AUTEUR NE SONT RESPONSABLES. RÉCLAMATION, DOMMAGES OU AUTRES RESPONSABILITÉS, QUE CE SOIT DANS UNE ACTION CONTRACTUELLE, DÉLICATOIRE OU AUTRE, DÉCOULANT, DEPUIS OU EN RELATION AVEC LE LOGICIEL OU L'UTILISATION OU D'AUTRES OPÉRATIONS DANS LE LOGICIEL.