Mauvaise idée de quitter « console.log () » appels dans votre code JavaScript de production?

StackOverflow https://stackoverflow.com/questions/1114187

Question

J'ai un tas d'appels console.log() dans mon JavaScript.

Dois-je les commenter avant la production à déployer?

Je voudrais les laisser là-bas, donc je ne pas aller à la peine de re-ajouter les commentaires plus tard si je dois faire plus de débogage. Est-ce une mauvaise idée?

Était-ce utile?

La solution

Il provoque des erreurs Javascript, mettre fin à l'exécution du bloc de Javascript contenant l'erreur.

Vous pouvez cependant définir une fonction factice qui est un non-op quand Firebug est pas actif:

if(typeof console === "undefined") {
    console = { log: function() { } };
}

Si vous utilisez des méthodes autres que log, vous devez bouchonner ceux aussi bien.

Autres conseils

Comme d'autres l'ont déjà fait, en laissant en causera des erreurs dans certains navigateurs, mais ces erreurs peuvent être contournées en mettant dans certains talons.

Cependant, je ne ne les commenter, mais purement et simplement supprimer ces lignes. Il semble juste bâclée de faire autrement. Peut-être que je suis d'être pointilleux, mais je ne pense pas que le code « production » devrait inclure le code du tout, même sous forme a commenté « debug ». Si vous laissez des commentaires sur tout, ces commentaires devraient décrire ce que fait le code ou le raisonnement derrière - pas des blocs de code désactivé. (Bien que, la plupart des commentaires doivent être supprimés automatiquement par votre processus de minification. Vous minimisez, non?)

En outre, dans plusieurs années de travail avec JavaScript, je ne me rappelle jamais revenir à une fonction et dire « Gee, je souhaite que je avais laissé ces console.logs en place ici! » En général, quand je suis « fait » avec le travail sur une fonction, et ont par la suite revenir à elle, je reviens à résoudre un autre problème. Quel que soit ce nouveau problème est, si les console.logs d'une série de travaux antérieurs auraient pu être utiles, je l'aurais repéré le problème pour la première fois. Autrement dit, si je reviens à quelque chose, je ne suis pas susceptible d'avoir besoin exactement les mêmes informations de débogage que je avais besoin à d'autres occasions.

Juste mes deux cents ... Bonne chance!

Si vous avez un script de déploiement, vous pouvez l'utiliser pour dépouiller les appels à console.log (et rapetisser le fichier).

Pendant que vous y êtes, vous pouvez jeter vos JS par JSLint et enregistrer les violations de l'inspection (ou empêcher le déploiement).

Ceci est un excellent exemple de la raison pour laquelle vous souhaitez automatiser votre déploiement. Si votre processus vous permet de publier un fichier js avec console.logs en elle, à un moment donné vous le faire.

A ma connaissance il n'y a pas de méthode plus courte que console.log sur stubbing les 45 caractères suivants:

window.console||(console={log:function(){}});

C'est la première de 3 versions différentes selon les méthodes console que vous voulez écraser tous sont minuscules et tous ont été testés dans IE6 + et les navigateurs modernes.

Les deux autres versions couvrent différentes autres méthodes de la console. L'un couvre les quatre bases et l'autre couvre toutes les méthodes de console connues pour Firebug et WebKit. Encore une fois, dans le plus infime possible la taille des fichiers.

Ce projet est sur github: https://github.com/andyet/ConsoleDummy.js

Si vous pouvez penser à une façon de minimiser le code supplémentaire, les contributions sont les bienvenues.

- EDIT - 16 mai 2012

Je l'ai depuis amélioré ce code. Il est encore petit, mais ajoute la possibilité d'activer la sortie de la console et hors: https://github.com/HenrikJoreteg/andlog

Il a été en vedette sur le changelog Voir

Vous devez au moins créer un console.log factice si l'objet n'existe pas votre code ne sera pas jeter des erreurs sur les machines des utilisateurs sans Firebug installé.

Une autre possibilité serait de déclencher la connexion uniquement en « mode de débogage », à savoir si un drapeau est défini:

if(_debug) console.log('foo');
_debug && console.log('foo');

il aide quelqu'un l'espoir -. J'ai écrit une enveloppe pour un certain temps, son légèrement plus souple que la solution retenue

De toute évidence, si vous utilisez d'autres méthodes telles que console.info etc, vous pouvez reproduire l'effet. lorsque vous avez terminé avec votre environnement de mise en scène, il suffit de changer la valeur par défaut C.debug false pour la production et vous ne devrez pas changer tout autre code / prendre les lignes sur etc. Très facile de revenir et debug plus tard.

var C = {
    // console wrapper
    debug: true, // global debug on|off
    quietDismiss: false, // may want to just drop, or alert instead
    log: function() {
        if (!C.debug) return false;

        if (typeof console == 'object' && typeof console.log != "undefined") {
            console.log.apply(this, arguments); 
        }
        else {
            if (!C.quietDismiss) {
                var result = "";
                for (var i = 0, l = arguments.length; i < l; i++)
                    result += arguments[i] + " ("+typeof arguments[i]+") ";

                alert(result);
            }
        }
    }
}; // end console wrapper.

// example data and object
var foo = "foo", bar = document.getElementById("divImage");
C.log(foo, bar);

// to surpress alerts on IE w/o a console:
C.quietDismiss = true;
C.log("this won't show if no console");

// to disable console completely everywhere:
C.debug = false;
C.log("this won't show ever");

cela semble fonctionner pour moi ...

if (!window.console) {
    window.console = {
        log: function () {},
        group: function () {},
        error: function () {},
        warn: function () {},
        groupEnd: function () {}
    };
}

Figured je voudrais partager une perspective différente. En quittant ce type de sortie visible au monde extérieur dans une application PCI vous fait non conforme.

Je suis d'accord que le talon de la console est une bonne approche. J'ai essayé différents plugins de la console, des extraits de code, dont certains assez complexes. Ils avaient tous un problème dans au moins un navigateur, donc j'ai fini par aller avec quelque chose de simple comme ci-dessous, qui est une fusion d'autres extraits que j'ai vu et quelques suggestions de l'équipe YUI. Il semble fonctionner dans IE8 +, Firefox, Chrome et Safari (pour Windows).

// To disable logging when posting a production release, just change this to false.
var debugMode = false;

// Support logging to console in all browsers even if the console is disabled. 
var log = function (msg) {
    debugMode && window.console && console.log ? console.log(msg) : null;
};

Remarque: Il prend en charge l'enregistrement à la désactivation de la console via un drapeau. Peut-être que vous pouvez automatiser cela aussi via créer des scripts. Sinon, vous pouvez exposer l'interface utilisateur ou un autre mécanisme pour faire basculer ce drapeau au moment de l'exécution. Vous pouvez obtenir beaucoup plus sophistiqué bien sûr, avec des niveaux d'enregistrement, la soumission ajax des journaux basés sur le seuil de journal (par exemple tous les relevés de niveau d'erreur sont transmises au serveur pour y stockage, etc.).

Un grand nombre de ces fils / questions autour de l'exploitation forestière semblent penser des déclarations de journaux code de débogage et non code instrumentation . D'où le désir de supprimer les instructions du journal. L'instrumentation est extrêmement utile lorsqu'une application est dans la nature et il est plus aussi facile d'attacher un débogueur ou des informations est alimenté à vous d'un utilisateur ou via le support. Vous ne devez jamais connecter quoi que ce soit sensible, peu importe où il a été connecté à tant la vie privée / sécurité ne doit pas être compromise. Une fois que vous pensez de l'enregistrement que l'instrumentation, il devient maintenant le code de production et devrait être écrit à la même norme.

Avec des applications utilisant jamais javascript plus complexe, je pense que l'instrumentation est critique.

Comme d'autres ont mentionne il jeté une erreur dans la plupart des navigateurs. Dans Firefox 4, il ne lancera pas d'erreur, le message est enregistré dans la console développeur web (nouveau dans Firefox 4).

Une solution à ces erreurs que j'ai vraiment aimé était de && bug :

var de = true;
var bug = function() { console.log.apply(this, arguments); }

// within code
de&&bug(someObject);

A nice one-liner:

(!console) ? console.log=function(){} : console.log('Logging is supported.');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top