Je suis assez nouveau dans le développement Javascript, donc ça pourrait être une vraie question pour les débutants.
J'ai une application sencha-touch chargée de console.log();
à des fins de débogage.
J'ai gazouillis je fais tout mon temps de construction en le combinant. Il génère un app.debug.js
Pour le débogage ainsi qu'un app.min.js
Pour la production
Maintenant, je pourrais parcourir tous mes fichiers de code à la recherche de console.log();
et le supprimer manuellement lorsque je serai prêt à passer à la production, mais je me demande s'il existe un moyen de remplacer la méthode.
Fondamentalement, chaque fois que la méthode console.log();
est appelée, NE RIEN FAIRE.
De cette façon, je peux mettre le fichier de code de substitution dans ma configuration de production et PAS dans ma configuration de débogage.
Est-ce possible?
Placez ceci en haut du fichier:
var console = {};
console.log = function(){};
Pour certains navigateurs et minificateurs, vous devrez peut-être appliquer cela à l'objet window.
window.console = console;
Ou si vous voulez simplement redéfinir le comportement de la console (pour ajouter des journaux par exemple), vous pouvez faire quelque chose comme ça:
// define a new console
var console=(function(oldCons){
return {
log: function(text){
oldCons.log(text);
// Your code
},
info: function (text) {
oldCons.info(text);
// Your code
},
warn: function (text) {
oldCons.warn(text);
// Your code
},
error: function (text) {
oldCons.error(text);
// Your code
}
};
}(window.console));
//Then redefine the old console
window.console = console;
Il serait extrêmement utile de pouvoir basculer la journalisation dans la version de production. Le code ci-dessous désactive le consignateur par défaut.
Lorsque j'ai besoin de voir les journaux, je tape juste debug(true)
dans la console.
var consoleHolder = console;
function debug(bool){
if(!bool){
consoleHolder = console;
console = {};
Object.keys(consoleHolder).forEach(function(key){
console[key] = function(){};
})
}else{
console = consoleHolder;
}
}
debug(false);
Pour être complet, cela remplace TOUTES les méthodes de la console, pas seulement console.log
.
console.log = function(){};
Remplacez-le comme n'importe quelle autre chose.
J'utilise quelque chose de semblable à ce que fait les laboratoires de posologie. Enregistrer la console dans une fermeture et vous avez tout dans une fonction portable.
var GlobalDebug = (function () {
var savedConsole = console;
return function(debugOn,suppressAll){
var suppress = suppressAll || false;
if (debugOn === false) {
console = {};
console.log = function () { };
if(suppress) {
console.info = function () { };
console.warn = function () { };
console.error = function () { };
} else {
console.info = savedConsole.info;
console.warn = savedConsole.warn;
console.error = savedConsole.error;
}
} else {
console = savedConsole;
}
}
})();
Il suffit de faire globalDebug (false) pour désactiver les messages du journal ou globalDebug (false, true) pour supprimer tous les messages de la console.
Je recommanderais d'utiliser: https://github.com/sunnykgupta/jsLogger
Caractéristiques:
log
, warn
, error
, info
.Est ouvert aux modifications et sera mis à jour à chaque nouvelle suggestion.
Disclaimer: Je suis l'auteur du plugin.
Vous pouvez également utiliser regex pour supprimer tous les appels console.log () de votre code s'ils ne sont plus nécessaires. N'importe quel décent IDE vous permettra de rechercher et de remplacer ceux-ci dans tout un projet, et vous permettra de prévisualiser les correspondances avant de valider la modification.
\s*console\.log\([^)]+\);
N'oubliez pas qu'avec cette méthode, chaque appel console.log continuera d'appeler une fonction (vide), ce qui entraînera une surcharge. S'il y a 100 commandes console.log, vous effectuez toujours 100 appels vers une fonction vierge.
Je ne sais pas combien de temps cela va occasionner, mais il y en aura, il serait préférable d’avoir un drapeau pour activer le débogage puis utiliser quelque chose comme:
var debug=true; if (debug) console.log('blah')
Il n'y a aucune raison de laisser tout ce fichier console.log sur votre projet dans l'environnement de production ... Si vous voulez le faire de la bonne façon, ajoutez glifyJS2 à votre processus de déploiement en utilisant l'option "drop_console" .
Cela remplacera la fonction console.log lorsque l'URL ne contient pas localhost. Vous pouvez remplacer l'hôte local par vos propres paramètres de développement.
// overriding console.log in production
if(window.location.Host.indexOf('localhost:9000') < 0) {
console.log = function(){};
}
Après avoir lu beaucoup d'articles, j'ai créé ma propre solution comme suit:
SCRIPT:
function extendConsole() {
"use strict";
try {
var disabledConsoles = {};
console.enable = function (level, enabled) {
// Prevent errors in browsers without console[level]
if (window.console === 'undefined' || !window.console || window.console === null) {
window.console = {};
}
if (window.console[level] === 'undefined' || !window.console[level] || window.console[level] == null) {
window.console[level] = function() {};
}
if (enabled) {
if (disabledConsoles[level]) {
window.console[level] = disabledConsoles[level];
}
console.info("console." + level + "() was enabled.");
} else {
disabledConsoles[level] = window.console[level];
window.console[level] = function () { };
console.info("console." + level + "() was disabled.");
}
};
} catch (exception) {
console.error("extendConsole() threw an exception.");
console.debug(exception);
}
}
UTILISATION:
extendConsole();
console.enable("debug", window.debugMode);
EXEMPLE:
Vous pouvez regarder dans UglifyJS
: http://jstarrdewar.com/blog/2013/02/28/use-uglify-to-automatically-strip-debug-messages-from-your-javascript / , https://github.com/mishoo/UglifyJS Je n'ai pas encore essayé.
Citant,
if (typeof DEBUG === 'undefined') DEBUG = true; // will be removed
function doSomethingCool() {
DEBUG && console.log("something cool just happened"); // will be removed }
... La ligne de message du journal sera supprimée par le suppresseur de code mort d'Uglify (puisqu'il effacera toutes les conditions qui seront toujours considérées comme fausses). Il en sera de même pour le premier conditionnel. Mais lorsque vous testez en tant que code non compressé, DEBUG commencera par être indéfini, le premier conditionnel le définira sur true et tous vos messages console.log () fonctionneront.
Voici ce que j'ai fait
var domainNames =["fiddle.jshell.net"]; // we replace this by our production domain.
var logger = {
force:false,
original:null,
log:function(obj)
{
var hostName = window.location.hostname;
if(domainNames.indexOf(hostName) > -1)
{
if(window.myLogger.force === true)
{
window.myLogger.original.apply(this,arguments);
}
}else {
window.myLogger.original.apply(this,arguments);
}
},
forceLogging:function(force){
window.myLogger.force = force;
},
original:function(){
return window.myLogger.original;
},
init:function(){
window.myLogger.original = console.log;
console.log = window.myLogger.log;
}
}
window.myLogger = logger;
console.log("this should print like normal");
window.myLogger.init();
console.log("this should not print");
window.myLogger.forceLogging(true);
console.log("this should print now");
Également publié à ce sujet ici. http://bhavinsurela.com/naive-way-of-overriding-console-log/