Schlechte Idee, “console.log()”-Aufrufe in Ihrem Produktions-JavaScript-Code zu belassen?
Lesezeit: 7 Minuten
Charlie Kotter
Ich habe eine Menge console.log() Aufrufe in meinem JavaScript.
Sollte ich sie auskommentieren, bevor ich sie in der Produktion bereitstelle?
Ich möchte sie einfach dort belassen, damit ich mir später nicht die Mühe machen muss, die Kommentare erneut hinzuzufügen, wenn ich noch mehr debuggen muss. Ist das eine schlechte Idee?
Für diejenigen, die nach der Angular-Version dieser Frage suchen: stackoverflow.com/questions/42307317/…
– rmcsharry
10. Mai 2018 um 21:35 Uhr
Es verursacht Javascript-Fehler und beendet die Ausführung des Javascript-Blocks, der den Fehler enthält.
Sie könnten jedoch eine Dummy-Funktion definieren, die keine Operation ist, wenn Firebug nicht aktiv ist:
Wenn Sie andere Methoden als verwenden logmüssten Sie diese auch ausdrücken.
Vielen Dank. Das sieht nach einem netten Workaround aus. Mal sehen, ob ich es verstehe. Sie sagen, wenn die Konsole nicht definiert ist, setzen Sie die Konsole auf eine leere Funktion. Ich verstehe die Doppelpunktsyntax nach ‘log’ nicht. Was macht das und warum steht nach “console=” alles in geschweiften Klammern?
– Charlie Kotter
11. Juli 2009 um 17:30 Uhr
Die geschweiften Klammern definieren ein Objektliteral: developer.mozilla.org/en/Core_JavaScript_1.5_Guide/… und das “function() {}”-Bit definiert eine anonyme Funktion, die keine Argumente akzeptiert und nichts tut. (Es funktioniert immer noch, “console.log(foo)” mit einem Argument aufzurufen, da es JS egal ist, ob Sie eine Funktion mit zu vielen oder zu wenigen Argumenten aufrufen.)
– Jason Creighton
11. Juli 2009 um 17:37 Uhr
Verstanden. Danke auch für den Link.
– Charlie Kotter
11. Juli 2009 um 18:11 Uhr
Super Lösung Mann!! 🙂 Ich hatte gerade dieses Problem neulich. Meine Seite funktionierte nur in FF, wenn FireBug eingeschaltet war, und sie wurde bei bestimmten Aktionen im IE zufällig angehalten. Ich war wie WTF!?! Und dann wurde mir klar, dass ich die console.log-Aufrufe immer noch dort hatte und ich sie durchgehen und entfernen musste. Ich werde Ihre Lösung wahrscheinlich jetzt zu meiner Haupt-JS-Datei hinzufügen und muss mich nie wieder um dieses unglückliche Szenario kümmern.
– Kyle Farris
11. Juli 2009 um 19:42 Uhr
Ich habe ein kleines (getestetes) Projekt, das Ihnen dabei hilft, genau dies mit verschiedenen Konsolenmethoden in möglichst wenig Code zu tun. Es befindet sich hier: github.com/andyet/ConsoleDummy.js
– Henrik Joreteg
28. Januar 2011 um 23:17 Uhr
Wie andere bereits darauf hingewiesen haben, führt das Belassen zu Fehlern in einigen Browsern, aber diese Fehler können umgangen werden, indem einige Stubs eingefügt werden.
Ich würde sie jedoch nicht nur auskommentieren, sondern diese Zeilen direkt entfernen. Es scheint einfach schlampig zu sein, etwas anderes zu tun. Vielleicht bin ich pedantisch, aber ich denke nicht, dass “Produktionscode” überhaupt “Debug”-Code enthalten sollte, nicht einmal in kommentierter Form. Wenn Sie überhaupt Kommentare hinterlassen, sollten diese Kommentare beschreiben, was der Code macht, oder die Gründe dafür – nicht Blöcke von deaktiviertem Code. (Obwohl die meisten Kommentare automatisch durch Ihren Minimierungsprozess entfernt werden sollten. Sie minimieren doch, oder?)
Außerdem kann ich mich in mehreren Jahren der Arbeit mit JavaScript nicht erinnern, jemals zu einer Funktion zurückgekehrt zu sein und gesagt zu haben: “Mensch, ich wünschte, ich hätte diese console.logs hier gelassen!” Wenn ich mit der Arbeit an einer Funktion “fertig” bin und später darauf zurückkommen muss, komme ich im Allgemeinen zurück, um ein anderes Problem zu beheben. Was auch immer dieses neue Problem ist, wenn die console.logs aus einer früheren Arbeitsrunde hilfreich gewesen wären, dann hätte ich das Problem beim ersten Mal entdeckt. Mit anderen Worten, wenn ich auf etwas zurückkomme, benötige ich wahrscheinlich nicht genau dieselben Debug-Informationen wie bei früheren Gelegenheiten.
Nur meine zwei Cent… Viel Glück!
Das Problem tritt oft während des Produktionszyklus auf, wenn etwas debuggt oder getestet wird, und Leute außerhalb des Entwicklungsteams sehen, die keine Entwicklungskonsole haben. Meine persönliche Vorliebe ist es, die App nicht sterben zu lassen, damit wir keine Anrufe erhalten wie „Ihr neuer Code bringt mir nichts“.
– Dimitar Christoff
30. Juni 2010 um 20:06 Uhr
Permanente Debug-Zeilen sind fantastisch. Sie bedeuten, dass Sie sich oft nicht nach der Quelle eines Fehlers umsehen müssen, sondern sofort sehen können, was passiert. Es gibt viele Codeabschnitte, in denen eine Protokollanweisung keinen signifikanten Leistungsunterschied bewirkt.
– Casebash
11. Januar 2013 um 6:43 Uhr
Eine gute Protokollierung sollte für eine Vielzahl von Zwecken nützlich sein. Zu sagen, dass log () -Anweisungen nur zum Debuggen eines Problems nützlich waren, erinnert mich an die Java-Protokollierung von Leuten, die nicht wissen, wie man eine ordnungsgemäße Protokollierung schreibt.
–Thomas W
2. Mai 2013 um 3:48 Uhr
Kurz gesagt: Protokollieren Sie wichtige (allgemeine) Entscheidungen und die Ereignisbehandlung, damit das Geschäft, die Benutzeroberfläche auf hoher Ebene und die Behandlung wichtiger Ereignisse verfolgt werden können. Diese sind für die Entwicklung der Anwendung auf Dauer wertvoll. Das Protokollieren von ‘Eintritt in Methode A’, ‘Verlassen von Methode A’, ‘param1 77’ ist OTOH keine gute Protokollierung.
–Thomas W
2. Mai 2013 um 3:50 Uhr
Wenn Sie über ein Bereitstellungsskript verfügen, können Sie damit die Aufrufe von console.log entfernen (und die Datei minimieren).
Wenn Sie schon dabei sind, können Sie Ihr JS durch JSLint werfen und die Verstöße zur Überprüfung protokollieren (oder die Bereitstellung verhindern).
Dies ist ein hervorragendes Beispiel dafür, warum Sie Ihre Bereitstellung automatisieren möchten. Wenn Ihr Prozess es Ihnen erlaubt, eine js-Datei mit console.logs darin zu veröffentlichen, müssen Sie irgendwann Wille Tu es.
Henrik Joreteg
Meines Wissens nach gibt es keine kürzere Methode zum Stubben console.log als die folgenden 45 Zeichen:
window.console||(console={log:function(){}});
Das ist die erste von 3 verschiedenen Versionen, je nachdem, welche Konsolenmethoden Sie verwenden möchten, alle sind winzig und alle wurden in IE6+ und modernen Browsern getestet.
Die anderen beiden Versionen decken verschiedene andere Konsolenmethoden ab. Eine behandelt die vier Grundlagen und die andere alle bekannten Konsolenmethoden für Firebug und Webkit. Auch hier in den kleinstmöglichen Dateigrößen.
Wenn Ihnen eine Möglichkeit einfällt, den Code weiter zu minimieren, sind Beiträge willkommen.
— BEARBEITEN — 16. Mai 2012
Ich habe seitdem diesen Code verbessert. Es ist immer noch winzig, fügt aber die Möglichkeit hinzu, die Konsolenausgabe ein- und auszuschalten: https://github.com/HenrikJoreteg/andlog
Sie sollten zumindest einen Dummy erstellen console.log Wenn das Objekt nicht vorhanden ist, wird Ihr Code keine Fehler auf den Computern der Benutzer ausgeben, ohne dass Firebug installiert ist.
Eine andere Möglichkeit wäre, das Logging nur im ‘Debug Mode’ auszulösen, also wenn ein bestimmtes Flag gesetzt ist:
Stimmen Sie Cristoph zu, für Safari wird es kein Problem sein, aber in anderen Browsern werden Fehler ausgegeben und möglicherweise wird Javascript angehalten, um fortzufahren. Generell keine gute Idee…
– Sinan
11. Juli 2009 um 17:22 Uhr
Hoffe, es hilft jemandem – ich habe vor einiger Zeit einen Wrapper dafür geschrieben, der etwas flexibler ist als die akzeptierte Lösung.
Wenn Sie andere Methoden wie console.info usw. verwenden, können Sie den Effekt natürlich replizieren. Wenn Sie mit Ihrer Staging-Umgebung fertig sind, ändern Sie einfach den Standard-C.debug für die Produktion auf „false“ und Sie müssen keinen anderen Code ändern / Zeilen entfernen usw. Sehr einfach, später darauf zurückzukommen und zu debuggen.
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");
Stimmen Sie Cristoph zu, für Safari wird es kein Problem sein, aber in anderen Browsern werden Fehler ausgegeben und möglicherweise wird Javascript angehalten, um fortzufahren. Generell keine gute Idee…
– Sinan
11. Juli 2009 um 17:22 Uhr
Nick Fuchs
das scheint bei mir zu funktionieren…
if (!window.console) {
window.console = {
log: function () {},
group: function () {},
error: function () {},
warn: function () {},
groupEnd: function () {}
};
}
11199300cookie-checkSchlechte Idee, “console.log()”-Aufrufe in Ihrem Produktions-JavaScript-Code zu belassen?yes
Schlechte Idee, “console.log()”-Aufrufe in Ihrem Produktions-JavaScript-Code zu belassen?
Lesezeit: 7 Minuten
Charlie Kotter
Ich habe eine Menge console.log() Aufrufe in meinem JavaScript.
Sollte ich sie auskommentieren, bevor ich sie in der Produktion bereitstelle?
Ich möchte sie einfach dort belassen, damit ich mir später nicht die Mühe machen muss, die Kommentare erneut hinzuzufügen, wenn ich noch mehr debuggen muss. Ist das eine schlechte Idee?
Für diejenigen, die nach der Angular-Version dieser Frage suchen: stackoverflow.com/questions/42307317/…
– rmcsharry
10. Mai 2018 um 21:35 Uhr
Es verursacht Javascript-Fehler und beendet die Ausführung des Javascript-Blocks, der den Fehler enthält.
Sie könnten jedoch eine Dummy-Funktion definieren, die keine Operation ist, wenn Firebug nicht aktiv ist:
Wenn Sie andere Methoden als verwenden logmüssten Sie diese auch ausdrücken.
Vielen Dank. Das sieht nach einem netten Workaround aus. Mal sehen, ob ich es verstehe. Sie sagen, wenn die Konsole nicht definiert ist, setzen Sie die Konsole auf eine leere Funktion. Ich verstehe die Doppelpunktsyntax nach ‘log’ nicht. Was macht das und warum steht nach “console=” alles in geschweiften Klammern?
– Charlie Kotter
11. Juli 2009 um 17:30 Uhr
Die geschweiften Klammern definieren ein Objektliteral: developer.mozilla.org/en/Core_JavaScript_1.5_Guide/… und das “function() {}”-Bit definiert eine anonyme Funktion, die keine Argumente akzeptiert und nichts tut. (Es funktioniert immer noch, “console.log(foo)” mit einem Argument aufzurufen, da es JS egal ist, ob Sie eine Funktion mit zu vielen oder zu wenigen Argumenten aufrufen.)
– Jason Creighton
11. Juli 2009 um 17:37 Uhr
Verstanden. Danke auch für den Link.
– Charlie Kotter
11. Juli 2009 um 18:11 Uhr
Super Lösung Mann!! 🙂 Ich hatte gerade dieses Problem neulich. Meine Seite funktionierte nur in FF, wenn FireBug eingeschaltet war, und sie wurde bei bestimmten Aktionen im IE zufällig angehalten. Ich war wie WTF!?! Und dann wurde mir klar, dass ich die console.log-Aufrufe immer noch dort hatte und ich sie durchgehen und entfernen musste. Ich werde Ihre Lösung wahrscheinlich jetzt zu meiner Haupt-JS-Datei hinzufügen und muss mich nie wieder um dieses unglückliche Szenario kümmern.
– Kyle Farris
11. Juli 2009 um 19:42 Uhr
Ich habe ein kleines (getestetes) Projekt, das Ihnen dabei hilft, genau dies mit verschiedenen Konsolenmethoden in möglichst wenig Code zu tun. Es befindet sich hier: github.com/andyet/ConsoleDummy.js
– Henrik Joreteg
28. Januar 2011 um 23:17 Uhr
Wie andere bereits darauf hingewiesen haben, führt das Belassen zu Fehlern in einigen Browsern, aber diese Fehler können umgangen werden, indem einige Stubs eingefügt werden.
Ich würde sie jedoch nicht nur auskommentieren, sondern diese Zeilen direkt entfernen. Es scheint einfach schlampig zu sein, etwas anderes zu tun. Vielleicht bin ich pedantisch, aber ich denke nicht, dass “Produktionscode” überhaupt “Debug”-Code enthalten sollte, nicht einmal in kommentierter Form. Wenn Sie überhaupt Kommentare hinterlassen, sollten diese Kommentare beschreiben, was der Code macht, oder die Gründe dafür – nicht Blöcke von deaktiviertem Code. (Obwohl die meisten Kommentare automatisch durch Ihren Minimierungsprozess entfernt werden sollten. Sie minimieren doch, oder?)
Außerdem kann ich mich in mehreren Jahren der Arbeit mit JavaScript nicht erinnern, jemals zu einer Funktion zurückgekehrt zu sein und gesagt zu haben: “Mensch, ich wünschte, ich hätte diese console.logs hier gelassen!” Wenn ich mit der Arbeit an einer Funktion “fertig” bin und später darauf zurückkommen muss, komme ich im Allgemeinen zurück, um ein anderes Problem zu beheben. Was auch immer dieses neue Problem ist, wenn die console.logs aus einer früheren Arbeitsrunde hilfreich gewesen wären, dann hätte ich das Problem beim ersten Mal entdeckt. Mit anderen Worten, wenn ich auf etwas zurückkomme, benötige ich wahrscheinlich nicht genau dieselben Debug-Informationen wie bei früheren Gelegenheiten.
Nur meine zwei Cent… Viel Glück!
Das Problem tritt oft während des Produktionszyklus auf, wenn etwas debuggt oder getestet wird, und Leute außerhalb des Entwicklungsteams sehen, die keine Entwicklungskonsole haben. Meine persönliche Vorliebe ist es, die App nicht sterben zu lassen, damit wir keine Anrufe erhalten wie „Ihr neuer Code bringt mir nichts“.
– Dimitar Christoff
30. Juni 2010 um 20:06 Uhr
Permanente Debug-Zeilen sind fantastisch. Sie bedeuten, dass Sie sich oft nicht nach der Quelle eines Fehlers umsehen müssen, sondern sofort sehen können, was passiert. Es gibt viele Codeabschnitte, in denen eine Protokollanweisung keinen signifikanten Leistungsunterschied bewirkt.
– Casebash
11. Januar 2013 um 6:43 Uhr
Eine gute Protokollierung sollte für eine Vielzahl von Zwecken nützlich sein. Zu sagen, dass log () -Anweisungen nur zum Debuggen eines Problems nützlich waren, erinnert mich an die Java-Protokollierung von Leuten, die nicht wissen, wie man eine ordnungsgemäße Protokollierung schreibt.
–Thomas W
2. Mai 2013 um 3:48 Uhr
Kurz gesagt: Protokollieren Sie wichtige (allgemeine) Entscheidungen und die Ereignisbehandlung, damit das Geschäft, die Benutzeroberfläche auf hoher Ebene und die Behandlung wichtiger Ereignisse verfolgt werden können. Diese sind für die Entwicklung der Anwendung auf Dauer wertvoll. Das Protokollieren von ‘Eintritt in Methode A’, ‘Verlassen von Methode A’, ‘param1 77’ ist OTOH keine gute Protokollierung.
–Thomas W
2. Mai 2013 um 3:50 Uhr
Wenn Sie über ein Bereitstellungsskript verfügen, können Sie damit die Aufrufe von console.log entfernen (und die Datei minimieren).
Wenn Sie schon dabei sind, können Sie Ihr JS durch JSLint werfen und die Verstöße zur Überprüfung protokollieren (oder die Bereitstellung verhindern).
Dies ist ein hervorragendes Beispiel dafür, warum Sie Ihre Bereitstellung automatisieren möchten. Wenn Ihr Prozess es Ihnen erlaubt, eine js-Datei mit console.logs darin zu veröffentlichen, müssen Sie irgendwann Wille Tu es.
Henrik Joreteg
Meines Wissens nach gibt es keine kürzere Methode zum Stubben console.log als die folgenden 45 Zeichen:
window.console||(console={log:function(){}});
Das ist die erste von 3 verschiedenen Versionen, je nachdem, welche Konsolenmethoden Sie verwenden möchten, alle sind winzig und alle wurden in IE6+ und modernen Browsern getestet.
Die anderen beiden Versionen decken verschiedene andere Konsolenmethoden ab. Eine behandelt die vier Grundlagen und die andere alle bekannten Konsolenmethoden für Firebug und Webkit. Auch hier in den kleinstmöglichen Dateigrößen.
Wenn Ihnen eine Möglichkeit einfällt, den Code weiter zu minimieren, sind Beiträge willkommen.
— BEARBEITEN — 16. Mai 2012
Ich habe seitdem diesen Code verbessert. Es ist immer noch winzig, fügt aber die Möglichkeit hinzu, die Konsolenausgabe ein- und auszuschalten: https://github.com/HenrikJoreteg/andlog
Sie sollten zumindest einen Dummy erstellen console.log Wenn das Objekt nicht vorhanden ist, wird Ihr Code keine Fehler auf den Computern der Benutzer ausgeben, ohne dass Firebug installiert ist.
Eine andere Möglichkeit wäre, das Logging nur im ‘Debug Mode’ auszulösen, also wenn ein bestimmtes Flag gesetzt ist:
Stimmen Sie Cristoph zu, für Safari wird es kein Problem sein, aber in anderen Browsern werden Fehler ausgegeben und möglicherweise wird Javascript angehalten, um fortzufahren. Generell keine gute Idee…
– Sinan
11. Juli 2009 um 17:22 Uhr
Hoffe, es hilft jemandem – ich habe vor einiger Zeit einen Wrapper dafür geschrieben, der etwas flexibler ist als die akzeptierte Lösung.
Wenn Sie andere Methoden wie console.info usw. verwenden, können Sie den Effekt natürlich replizieren. Wenn Sie mit Ihrer Staging-Umgebung fertig sind, ändern Sie einfach den Standard-C.debug für die Produktion auf „false“ und Sie müssen keinen anderen Code ändern / Zeilen entfernen usw. Sehr einfach, später darauf zurückzukommen und zu debuggen.
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");
Stimmen Sie Cristoph zu, für Safari wird es kein Problem sein, aber in anderen Browsern werden Fehler ausgegeben und möglicherweise wird Javascript angehalten, um fortzufahren. Generell keine gute Idee…
– Sinan
11. Juli 2009 um 17:22 Uhr
Nick Fuchs
das scheint bei mir zu funktionieren…
if (!window.console) {
window.console = {
log: function () {},
group: function () {},
error: function () {},
warn: function () {},
groupEnd: function () {}
};
}
11199200cookie-checkSchlechte Idee, “console.log()”-Aufrufe in Ihrem Produktions-JavaScript-Code zu belassen?yes
Für diejenigen, die nach der Angular-Version dieser Frage suchen: stackoverflow.com/questions/42307317/…
– rmcsharry
10. Mai 2018 um 21:35 Uhr