将“console.log()”调用留在producton JavaScript代码中是不是一个好主意?

我在JavaScript中有一堆console.log()调用。

在部署到生产之前,我应该评论一下吗?

我想把它们留在那里,所以如果我需要做更多的debugging的话,我不必再去掉那些评论。 这是一个坏主意吗?

它会导致Javascript错误,终止包含错误的Javascript块的执行。

但是,你可以定义一个虚拟函数,当Firebug不活跃时它是无操作的:

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

如果您使用log以外的任何方法,则需要将这些方法也删除。

正如其他人已经指出的那样,把它留在一些浏览器会导致错误,但这些错误可以通过放置一些存根(stub)来解决。

不过,我不但要评论,而且要彻底删除这些内容。 否则,这似乎是sl </s>。 也许我很迂腐,但我不认为“生产”代码应该包括“debugging”代码,甚至在评论的forms。 如果你留下评论,那么这些评论应该描述代码在做什么或者背后的推理 – 而不是被禁用的代码块。 (尽pipe大多数评论应该通过你的缩小过程自动删除,你正在最小化,对不对?)

而且,在使用JavaScript的几年时间里,我不记得回到一个函数,并说“哎呀,我希望我把这些console.log放在这里!” 一般来说,当我完成一个函数的“完成”,后来不得不回头去解决一些其他的问题。 无论新的问题是什么,如果前一轮工作中的console.logs有帮助,那么我第一次发现这个问题。 换句话说,如果我回到某个东西,我不太可能需要完全相同的debugging信息,我需要在以前的场合。

只是我的两分钱…祝你好运!

如果你有一个部署脚本,你可以使用它去除对console.log的调用(并缩小文件)。

当你在这个时候,你可以通过JSLint抛出你的JS,并logging违规情况以便检查(或阻止部署)。

这是您为什么要自动化部署的一个很好的例子。 如果你的程序允许你发布一个带有console.log的js文件,那么在某个时候你就可以做到。

据我所知,没有比以下45个字符更短的console.log方法:

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

这是3个不同版本中的第一个,这取决于你想把所有这些控制台的方法都删掉,所有这些都是在IE6 +和现代浏览器中testing过的。

另外两个版本涵盖了不同的其他控制台方法。 一个涵盖四个基本知识,另一个涵盖所有已知的萤火虫和webkit的控制台方法。 再次,以最小的文件大小可能。

该项目在github上: https : //github.com/andyet/ConsoleDummy.js

如果您能想出任何方法来进一步减less代码,欢迎提供贡献。

– 编辑 – 2012年5月16日

我从此改进了这个代码。 它仍然很小,但增加了打开和closures控制台输出的function: https : //github.com/HenrikJoreteg/andlog

它在“更改日志显示”中显示

如果对象不存在,至less应该创build一个虚拟console.log如果没有安装萤火虫,您的代码不会在用户的机器上抛出错误。

另一种可能性是仅在“debugging模式”下触发日志logging,即如果设置了某个标志:

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

希望它能帮助别人 – 我后来写了一个封装,比接受的解决scheme稍微灵活一些。

显然,如果你使用其他方法,如console.info等,你可以复制效果。 当你的临时环境完成后,只需将默认的C.debug更改为false以便生产,而不需要更改任何其他代码/取出等。很容易返回并稍后debugging。

 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/oa 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"); 

这似乎为我工作…

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

我想分享一个不同的观点。 在PCI应用程序中将这种types的输出留给外部世界使您不符合要求。

我同意控制台存根是一个很好的方法。 我已经尝试了各种控制台插件,代码片断,包括一些相当复杂的代码片段。 他们至less在一个浏览器中遇到了一些问题,所以我最终做了一些简单的事情,比如我看过的其他代码片段和YUI团队的一些build议。 它似乎在IE8 +,Firefox,Chrome和Safari(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; }; 

注意:它支持通过标志禁用日志logging到控制台。 也许你也可以通过构build脚本自动化。 或者,您可以公开UI或其他机制来在运行时翻转此标志。 当然,您可以获得更复杂的日志logging级别,基于日志阈值的ajax日志提交(例如,所有错误级别语句都传输到服务器以供存储在那里等)。

许多围绕日志logging的线程/问题似乎将日志语句视为debugging代码而不是代码检测 。 因此希望删除日志语句。 当一个应用程序处于疯狂状态时,Instrumentation非常有用,它不再像debugging器那样简单,或者从用户或通过支持向您提供信息。 你不应该logging任何敏感的东西,不pipe它被login到什么地方,所以隐私/安全不应该被破坏。 一旦您将日志logging视为仪器,现在就成为生产代码,并应该写入相同的标准。

随着使用更复杂的JavaScript的应用程序,我认为仪器是至关重要的。

正如其他人所说,它会在大多数浏览器中引发错误。 在Firefox 4中,它不会抛出错误,该消息logging在Web开发者控制台(Firefox 4中的新增function)中。

我真正喜欢的这种错误的一个解决方法是de && bug :

 var de = true; var bug = function() { console.log.apply(this, arguments); } // within code de&&bug(someObject); 

一个不错的单行:

 (!console) ? console.log=function(){} : console.log('Logging is supported.');