J'ai actuellement cette déclaration JS partout dans mon code:
window.console && console.log("Foo");
Je me demande si cela coûte cher ou s'il a des effets secondaires négatifs sur la production.
Suis-je libre de laisser la connexion côté client ou doit-il y aller?
EDIT: En fin de compte, je suppose que le meilleur argument que je puisse (et qui que ce soit d'autre?) Est qu'il existe une quantité non négligeable de données supplémentaires transférées entre le serveur et le client en laissant des messages de journalisation laissés. Pour que le code de production soit entièrement optimisé, la journalisation devra être supprimée afin de réduire la taille du javascript envoyé au client.
Vous devriez pas ajouter des outils de développement à une page de production.
Pour répondre à l’autre question: le code ne peut avoir d’effet secondaire négatif:
window.console
sera évalué à false si console
n'est pas définiconsole.log("Foo")
imprimera le message sur la console quand il sera défini (à condition que la page ne remplace pas console.log
par une non-fonction).Une autre solution consiste à «tronquer» l’objet console s’il n’est pas défini, afin d’éviter les erreurs dans des contextes où la console n’est pas i.e.
if (!window.console) {
var noOp = function(){}; // no-op function
console = {
log: noOp,
warn: noOp,
error: noOp
}
}
vous avez l’idée ... il y a beaucoup de fonctions définies dans les différentes implémentations de la console, vous pouvez donc les stub toutes ou juste celles que vous utilisez (par exemple, si vous n’utilisez que console.log
et n’avez jamais utilisé console.profile
, console.time
, etc. ..)
Pour moi, cela constitue une meilleure alternative de développement que d’ajouter des conditions devant chaque appel ou de ne pas les utiliser.
voir aussi: Est-ce une mauvaise idée de laisser des appels "console.log ()" dans votre produit sur du code JavaScript?
Si vous utilisez ce minifier, vous pouvez définir l’option drop_console
:
Passez true pour rejeter les appels à la console. * Fonctions
Je suggérerais donc de laisser les appels console.log
tels qu'ils sont pour la partie la plus délicate de la base de code.
Si la minification fait partie de votre processus de construction, vous pouvez l'utiliser pour supprimer le code de débogage, comme expliqué ici avec le compilateur de fermetures Google: Exclure le code JavaScript de débogage pendant la minification
if (DEBUG) {
console.log("Won't be logged if compiled with --define='DEBUG=false'")
}
Si vous compilez avec des optimisations avancées, ce code sera même identifié comme mort et entièrement supprimé
Oui. console.log lève une exception dans les navigateurs qui ne le supportent pas (aucun objet console ne sera trouvé).
Généralement, oui, ce n’est pas une bonne idée d’exposer des messages de journal dans votre code de production.
Idéalement, vous devriez supprimer ces messages de journal avec un script de construction avant le déploiement. mais beaucoup (la plupart) des gens n'utilisent pas de processus de construction (y compris moi).
Voici un extrait de code que j'ai utilisé récemment pour résoudre ce dilemme. Il corrige les erreurs causées par une console
non définie dans l'ancien IE, ainsi que la désactivation de la journalisation si elle était dans "mode_développement".
// fn to add blank (noOp) function for all console methods
var addConsoleNoOp = function (window) {
var names = ["log", "debug", "info", "warn", "error",
"assert", "dir", "dirxml", "group", "groupEnd", "time",
"timeEnd", "count", "trace", "profile", "profileEnd"],
i, l = names.length,
noOp = function () {};
window.console = {};
for (i = 0; i < l; i = i + 1) {
window.console[names[i]] = noOp;
}
};
// call addConsoleNoOp() if console is undefined or if in production
if (!window.console || !window.development_mode) {
this.addConsoleNoOp(window);
}
Je suis à peu près sûr d'avoir pris une grande partie de la addConsoleNoOp
f'n ci-dessus d'une autre réponse sur SO, mais je ne le trouve pas pour le moment. J'ajouterai une référence plus tard si je la trouve.
edit: Ce n'est pas le message auquel je pensais, mais voici une approche similaire: https://github.com/paulmillr/console-polyfill/blob/master/index.js
var AppLogger = (function () {
var debug = false;
var AppLogger = function (isDebug) {
debug = isDebug;
}
AppLogger.conlog = function (data) {
if (window.console && debug) {
console.log(data);
}
}
AppLogger.prototype = {
conlog: function (data) {
if (window.console && debug) {
console.log(data);
}
}
};
return AppLogger;
})();
Utilisation:
var debugMode=true;
var appLogger = new AppLogger(debugMode);
appLogger.conlog('test');
Oui, il est recommandé d’utiliser console.log
à des fins de débogage javascript, mais il doit être supprimé du serveur de production ou, si nécessaire, ajouté sur le serveur de production en prenant en compte certains points clés:
**var isDebugEnabled="Get boolean value from Configuration file to check whether debug is enabled or not".**
if (window.console && isDebugEnabled) {
console.log("Debug Message");
}
Le bloc de code ci-dessus doit être utilisé partout pour la journalisation afin de vérifier d'abord si la console est prise en charge pour le navigateur actuel et si le débogage est activé ou non.
isDebugEnabled
doit être défini sur true ou false en fonction de notre environnement.
En gros, je remplace la fonction console.log par celle qui sait où le code est exécuté. Ainsi, je peux continuer à utiliser console.log comme je le fais toujours. Il sait automatiquement que je suis en mode dev/qa ou en production. Il existe également un moyen de le forcer . Voici un violon qui fonctionne . http://jsfiddle.net/bsurela/Zneek/
Voici l'extrait de code car le débordement de pile est signalé par des personnes postant jsfiddle
log:function(obj)
{
if(window.location.hostname === domainName)
{
if(window.myLogger.force === true)
{
window.myLogger.original.apply(this,arguments);
}
}else {
window.myLogger.original.apply(this,arguments);
}
},
Idée: La journalisation des objets les empêche d’être récupérés.
console.log
, ces objets sont accessibles par référence à partir de la console de DevTools. Vous pouvez le vérifier en enregistrant un objet, en le modifiant et en constatant que les anciens messages reflètent les modifications ultérieures de l'objet.C'est juste une idée: J'ai vérifié les points 1 et 2 mais pas 3.
Si vous souhaitez conserver les journaux à des fins de dépannage côté client ou pour d’autres besoins, procédez comme suit:
['log', 'warn', 'error'].forEach( (meth) => {
const _meth = window.console[meth].bind(console);
window.console[meth] = function(...args) { _meth(...args.map((arg) => '' + arg)) }
});