J'en ai beaucoup console.log
(ou tout autre appel de console) dans mon code et je voudrais les utiliser uniquement lorsque mon application est en quelque sorte "mode de débogage" .
Je n'arrive pas à utiliser une sorte de fonction d'enregistrement et à utiliser en interne console.log
parce qu'alors je ne saurais pas quelle ligne l'a tiré. Peut-être seulement avec un try/catch, mais mes journaux sont très généraux et je ne veux pas try/catch dans mon code.
Que recommanderais-tu?
De nos jours, en 2014, j'utilise simplement GULP (et je le recommande à tous, c'est un outil incroyable), et j'ai installé un paquet qui s'appelle stripDebug qui fait ça pour vous.
(J'utilise également uglify
et closureCompiler
en production)
Il y a une Babel Macro qui supprime automatiquement toutes les instructions console
:
J'abuserais probablement de la nature court-circuitage de JavaScript opérateur AND logique et remplacerais les instances de:
console.log("Foo.");
Avec:
DEBUG && console.log("Foo.");
En supposant que DEBUG
est une variable globale qui est évaluée à true
si le débogage est activé.
Cette stratégie évite la castration de console.log()
, vous pouvez donc toujours l'appeler en mode release si vous en avez vraiment besoin (par exemple pour tracer un problème qui ne se produit pas en mode debug).
Remplacez simplement le console.log par une fonction vide pour la production.
if (!DEBUG_MODE_ON) {
console = console || {};
console.log = function(){};
}
Clobber les fonctions globales est généralement une mauvaise idée.
Au lieu de cela, vous pouvez remplacer toutes les instances de console.log
dans votre code avec LOG
, et au début de votre code:
var LOG = debug ? console.log.bind(console) : function () {};
Cela affichera toujours les numéros de ligne corrects et préservera également le console.log
fonction pour les trucs tiers si nécessaire.
Une autre façon de désactiver console.log en production et de le conserver en développement.
// overriding console.log in production
if(window.location.Host.indexOf('localhost:9000') < 0) {
console.log = function(){};
}
Vous pouvez modifier vos paramètres de développement comme localhost et port.
Facile.
Ajoutez un petit script bash qui trouve toutes les références à console.log
et les supprime.
Assurez-vous que ce script de commandes s'exécute dans le cadre de votre déploiement en production.
Ne cale pas console.log
en tant que fonction vide, c'est un gaspillage de calcul et d'espace.
Les dernières versions de chrome montrent quelle ligne de code dans quel fichier a lancé console.log. Si vous recherchez un système de gestion des journaux, vous pouvez essayer logeek it vous permet de contrôler les groupes de journaux que vous souhaitez voir.
la console peut afficher non seulement le journal, mais les avertissements d'erreur, etc. Voici une fonction pour remplacer toutes les sorties de la console
(function () {
var method;
var noop = function noop() { };
var methods = [
'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
'timeStamp', 'trace', 'warn'
];
var length = methods.length;
var console = (window.console = window.console || {});
while (length--) {
method = methods[length];
console[method] = noop;
}
}());
Reportez-vous à la publication détaillée ici https://stapp.space/disable-javascript-console-on-production/
// In Development:
var debugMode = true
// In Prod:
var debugMode = false
// This function logs console messages when debugMode is true .
function debugLog(logMessage) {
if (debugMode) {
console.log(logMessage);
}
}
// Use the function instead of console.log
debugLog("This is a debug message");
Ce remplacement de wrapper minuscule encapsulera l'original console.log
méthode avec une fonction qui contient une vérification, que vous pouvez contrôler de l'extérieur, approfondissant si vous voulez voir les journaux de la console et non.
J'ai choisi window.allowConsole
juste comme un exemple de drapeau mais en utilisation réelle ce serait probablement autre chose. selon votre cadre.
(function(cl){
console.log = function(){
if( window.allowConsole )
cl(...arguments);
}
})(console.log)
// in development (allow logging)
window.allowConsole = true;
console.log(1,[1,2,3],{a:1});
// in production (disallow logging)
window.allowConsole = false;
console.log(1,[1,2,3],{a:1});
Ce remplacement doit être implémenté aussi "haut" que possible dans la hiérarchie de code afin qu'il "intercepte" tous les journaux avant qu'il ne se produise. Cela pourrait être étendu à toutes les autres méthodes console
telles que warn
, time
, dir
et ainsi de suite.
Ce code fonctionne pour moi:
if(console=='undefined' || !console || console==null) {
var console = {
log : function (string) {
// nothing to do here!!
}
}
}