Ich habe derzeit diese JS-Anweisung überall in meinem Code:
window.console && console.log("Foo");
Ich frage mich, ob dies überhaupt teuer ist oder negative Nebenwirkungen in der Produktion hat.
Kann ich mich clientseitig anmelden oder sollte es gehen?
BEARBEITEN: Letztendlich denke ich, dass das beste Argument, das ich (und irgendjemand anderes?) Vorbringen kann, ist, dass möglicherweise eine nicht zu vernachlässigende Menge zusätzlicher Daten zwischen dem Server und dem Client übertragen wird, indem Protokollnachrichten hinterlassen werden. Wenn Der Produktionscode muss vollständig optimiert werden. Die Protokollierung muss entfernt werden, um die Größe des an den Client gesendeten Javascript zu verringern.
javascript
logging
Sean Anderson
quelle
quelle
Antworten:
Sie sollten einer Produktionsseite keine Entwicklungstools hinzufügen.
Um die andere Frage zu beantworten: Der Code kann keine negativen Nebenwirkungen haben:
window.console
wird als falsch ausgewertet, wennconsole
nicht definiert istconsole.log("Foo")
druckt die Nachricht an die Konsole, wenn sie definiert ist (vorausgesetzt, die Seite wird nichtconsole.log
durch eine Nichtfunktion überschrieben ).quelle
/*DEBUG:start*/console.log("Foo");/*DEBUG:end*/
. Verwenden Sie dann ein RegExp, um alle Vorkommen von zu entfernen/*DENUG-start*/[\S\s]*?/*DEBUG-end*/
. Die verbleibenden Leerzeichen werden vom Minimierer entfernt.Eine andere Möglichkeit, damit umzugehen, besteht darin, das Konsolenobjekt zu "stubben", wenn es nicht definiert ist, damit in Kontexten, in denen die Konsole nicht vorhanden ist, keine Fehler ausgegeben werden
Sie erhalten die Idee ... es gibt eine Menge von Funktionen auf den verschiedenen Implementierungen der Konsole definiert sind, so könnte man sie alle oder nur die , die Sie verwenden (zB wenn Sie jemals verwenden Stummel
console.log
und nie benutztconsole.profile
,console.time
etc ...)Dies ist für mich eine bessere Alternative in der Entwicklung, als vor jedem Anruf Bedingungen hinzuzufügen oder diese nicht zu verwenden.
Siehe auch: Ist es eine schlechte Idee, "console.log ()" - Aufrufe in Ihrem Produkt auf JavaScript-Code zu belassen?
quelle
$.noop
.UglifyJS2
Wenn Sie diesen Minifier verwenden, können Sie folgende
drop_console
Optionen festlegen :Daher würde ich vorschlagen,
console.log
Anrufe so zu belassen, wie sie für einen der schwierigsten Teile der Codebasis sind.quelle
drop_console
zufalse
, beobachten sie und verstecken sie wieder.Wenn die Minimierung Teil Ihres Erstellungsprozesses ist, können Sie damit Debug-Code entfernen, wie hier mit dem Google Closure Compiler erläutert: Schließen Sie den Debug-JavaScript-Code während der Minimierung aus
Wenn Sie mit erweiterten Optimierungen kompilieren, wird dieser Code sogar als tot identifiziert und vollständig entfernt
quelle
Ja. console.log löst in Browsern, die dies nicht unterstützen, eine Ausnahme aus (Konsolenobjekt wird nicht gefunden).
quelle
Im Allgemeinen ist es keine gute Idee, Protokollnachrichten in Ihrem Produktionscode verfügbar zu machen.
Idealerweise sollten Sie solche Protokollnachrichten vor der Bereitstellung mit einem Build-Skript entfernen. Aber viele (die meisten) Leute verwenden keinen Build-Prozess (einschließlich mir).
Hier ist ein kurzer Ausschnitt eines Codes, den ich in letzter Zeit verwendet habe, um dieses Dilemma zu lösen. Es behebt Fehler, die durch einen undefinierten
console
im alten IE verursacht wurden, und deaktiviert die Protokollierung, wenn im "Entwicklungsmodus".Ich bin mir ziemlich sicher, dass ich viel von dem oben genannten
addConsoleNoOp
f'n aus einer anderen Antwort auf SO genommen habe, kann es aber momentan nicht finden. Ich werde später eine Referenz hinzufügen, wenn ich sie finde.edit: Nicht der Beitrag, an den ich gedacht habe, aber hier ist ein ähnlicher Ansatz: https://github.com/paulmillr/console-polyfill/blob/master/index.js
quelle
Verwendung:
quelle
Ja, es wird
console.log
empfohlen, es für das Debuggen von Javascript zu verwenden, aber es muss vom Produktionsserver entfernt werden oder kann bei Bedarf auf dem Produktionsserver hinzugefügt werden, wobei einige wichtige Punkte zu berücksichtigen sind:Der obige Codeblock muss überall für die Protokollierung verwendet werden, um zunächst zu überprüfen, ob die Konsole für den aktuellen Browser unterstützt wird und ob das Debuggen aktiviert ist oder nicht.
quelle
TL; DR
Idee: Das Protokollieren von Objekten verhindert, dass sie durch Müll gesammelt werden.
Einzelheiten
console.log
diese Objekte über die Konsole von DevTools zugreifen. Sie können dies überprüfen, indem Sie das Objekt protokollieren, es mutieren und feststellen, dass alte Nachrichten spätere Änderungen des Objekts widerspiegeln.Es ist nur eine Idee: Ich habe die Punkte 1 und 2 überprüft, aber nicht 3.
Lösung
Wenn Sie Protokolle zur clientseitigen Fehlerbehebung oder für andere Anforderungen führen möchten, gehen Sie wie folgt vor:
quelle
Grundsätzlich überschreibe ich die Funktion console.log mit der Funktion, die weiß, wo der Code ausgeführt wird. Somit kann ich console.log wie immer weiter verwenden. Es weiß automatisch, dass ich mich im Dev / Qa-Modus oder in der Produktion befinde. Es gibt auch eine Möglichkeit, dies zu erzwingen. Hier ist eine funktionierende Geige. http://jsfiddle.net/bsurela/Zneek/
Hier ist das Snippet, da der Stapelüberlauf von Leuten angedeutet wird, die jsfiddle posten
quelle
Ich weiß, dass dies eine ziemlich alte Frage ist und seit einiger Zeit nicht mehr viel Aktivität hatte. Ich wollte nur meine Lösung hinzufügen, die ich mir ausgedacht habe und die für mich recht gut zu funktionieren scheint.
Dann erstelle ich normalerweise eine Funktion in meinen Skripten wie diese oder Sie können sie in einem globalen Skript verfügbar machen:
Und dann benutze ich das einfach anstelle von console.log wie folgt:
quelle