Remplacer la console.log (); pour la production [duplicate]
cette question a déjà une réponse ici:
- comment désactiver rapidement et commodément toute console.enregistrer les déclarations dans mon code? 23 réponses
Je suis assez nouveau dans le développement de Javascript donc cela pourrait être une vraie question de débutant.
j'ai un sencha-touch application criblée de console.log();
à des fins de débogage.
j'ai crépitant faire tout mon temps de construction combinant. Il produit un app.debug.js
pour le débogage ainsi qu'un app.min.js
pour la production
maintenant je peux passer en revue tous mes fichiers de code à la recherche de console.log();
et l'effacer manuellement quand je suis prêt à aller en production, mais je me demande s'il y a un moyen de passer outre méthode.
En Gros, chaque fois que la méthode console.log();
est appelée, ne faites rien.
de cette façon, je peux mettre le fichier de code override dans ma configuration de production, et pas dans ma configuration de débogage.
est-ce possible?
13 réponses
mettez ceci en haut du fichier:
var console = {};
console.log = function(){};
pour certains navigateurs et mini-navigateurs, vous devrez peut-être appliquer ceci sur l'objet window.
window.console = console;
ou si vous voulez simplement redéfinir le comportement de la console (pour ajouter des logs 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 super utile de pouvoir basculer la journalisation dans la construction de production. Le code ci-dessous éteint l'enregistreur par défaut.
quand j'ai besoin de voir les logs, je tape 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 dépasse toutes les méthodes de la console, pas seulement console.log
.
console.log = function(){};
L'annulent comme n'importe quelle autre chose.
j'utilise quelque chose de similaire à ce que posit labs fait. Enregistrez 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;
}
}
})();
faites simplement globalDebug(false) pour désactiver les messages log ou globalDebug(false,true) pour supprimer tous les messages de la console.
je recommande d'utiliser: https://github.com/sunnykgupta/jsLogger
Dispose:
- il surpasse en toute sécurité la console.journal.
- prend soin si la console n'est pas disponible (oh oui, vous devez prendre en compte cela aussi.)
- stocke tous les journaux (même s'ils sont supprimés) pour une récupération ultérieure.
- Poignées majeur fonctions de la console comme
log
,warn
,error
,info
.
peut faire l'objet de modifications et sera mis à jour à chaque nouvelle suggestion.
Avertissement: je suis l'auteur du plugin.
vous pouvez également utiliser regex pour supprimer toute la console.enregistrez les appels dans votre code s'ils ne sont plus nécessaires. N'importe quel IDE décent vous permettra de rechercher et de remplacer ceux-ci à travers un projet entier, et vous permettra de prévisualiser les correspondances avant de commettre le changement.
\s*console\.log\([^)]+\);
n'oubliez pas qu'avec cette méthode, chaque console.log call fera quand même un appel à une fonction (vide) provoquant des frais généraux, s'il y a 100 console.log commandes, vous faites encore 100 appels à une fonction vierge.
Je ne suis pas sûr de combien cela causerait des frais généraux, mais il y en aura quelques-uns, il serait préférable d'avoir un drapeau pour activer le débogage puis d'utiliser quelque chose comme:
var debug=true; if (debug) console.log('blah')
après avoir lu beaucoup de messages, j'ai fait 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:
ceci va surcharger la console.log function quand l'url ne contient pas localhost. Vous pouvez remplacer le localhost par vos propres paramètres de développement.
// overriding console.log in production
if(window.location.host.indexOf('localhost:9000') < 0) {
console.log = function(){};
}
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 de journal sera supprimée par le démultiplicateur de code mort D'Uglify (puisqu'il effacera toute condition qui évaluera toujours de faux.) Il en sera de cette première conditionnelle. Mais quand vous testez comme code non compressé, le débogage commencera Non défini, le premier le conditionnel le positionnera à true, et toute votre console.journal (le) des messages va travailler.
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");
a également publié à ce sujet ici. http://bhavinsurela.com/naive-way-of-overriding-console-log /