我的JavaScript中有一堆console.log()
次调用。
我应该在部署到生产之前对它们进行评论吗?
我想把它们留在那里,所以如果我需要进行更多的调试,我不必在以后重新添加注释的麻烦。这是个坏主意吗?
答案 0 :(得分:116)
这将导致Javascript错误,终止包含错误的Javascript块的执行。
然而,当Firebug不活动时,您可以定义一个虚操作函数:
if(typeof console === "undefined") {
console = { log: function() { } };
}
如果你使用除log
以外的任何方法,你也需要将它们排除在外。
答案 1 :(得分:36)
正如其他人已经指出的那样,留下它会导致某些浏览器出错,但这些错误可以通过放入一些存根来解决。
但是,我不仅会对它们进行评论,而是直接删除这些行。这样做似乎很草率。也许我是迂腐的,但我不认为“生产”代码应该包括“调试”代码,即使是在评论的形式。如果你完全留下评论,那些评论应该描述代码正在做什么,或者背后的原因 - 不是禁用代码块。 (虽然,你的缩小过程应该自动删除大多数评论。你正在最小化,对吗?)
此外,在使用JavaScript的几年中,我不记得曾经回到某个功能并说“哎呀,我希望我在这里留下那些console.logs!”一般来说,当我“完成”一个函数,然后必须回到它,我回来修复一些其他问题。无论新问题是什么,如果上一轮工作中的console.logs可能有所帮助,那么我第一次就发现了这个问题。换句话说,如果我回到原点,我不太可能需要完全相同的调试信息,而不是以前需要的。
只是我的两分钱......祝你好运!
答案 2 :(得分:10)
如果您有部署脚本,则可以使用它来去除对console.log的调用(并缩小文件)。
当你遇到它时,你可以通过JSLint抛出你的JS并记录违规行为以进行检查(或阻止部署)。
这是您希望自动部署的一个很好的示例。如果你的进程允许你发布一个带有console.logs的js文件,那么将 。
答案 3 :(得分:9)
据我所知,除了以下45个字符外,没有简短的方法来截短console.log
:
window.console||(console={log:function(){}});
这是3个不同版本中的第一个,取决于你想要存根的所有控制台方法都很小,并且都已在IE6 +和现代浏览器中进行过测试。
其他两个版本涵盖了不同的其他控制台方法。一个涵盖了四个基础知识,另一个涵盖了firebug和webkit的所有已知控制台方法。同样,尽可能小的文件大小。
该项目位于github上:https://github.com/andyet/ConsoleDummy.js
如果您能想出任何方法来进一步减少代码,欢迎提供。
- 编辑 - 2012年5月16日
我已经改进了这段代码。它仍然很小,但增加了打开和关闭控制台输出的能力:https://github.com/HenrikJoreteg/andlog
答案 4 :(得分:5)
如果对象不存在,您至少应该创建一个虚拟console.log
,这样您的代码就不会在没有安装firebug的情况下在用户的计算机上抛出错误。
另一种可能性是仅在“调试模式”下触发记录,即如果设置了某个标志:
if(_debug) console.log('foo');
_debug && console.log('foo');
答案 5 :(得分:5)
希望它有所帮助 - 我曾经为它写了一个包装器,它比公认的解决方案稍微灵活一些。
显然,如果你使用其他方法,如console.info等,你可以复制效果。完成暂存环境后,只需将默认的C.debug更改为false即可进行生产,您不必更改任何其他代码/取出线等。以后很容易回来调试。
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");
答案 6 :(得分:4)
这似乎对我有用......
if (!window.console) {
window.console = {
log: function () {},
group: function () {},
error: function () {},
warn: function () {},
groupEnd: function () {}
};
}
答案 7 :(得分:2)
想我会分享不同的观点。让这种类型的输出在PCI应用程序中对外界可见会使您不合规。
答案 8 :(得分:2)
我同意控制台存根是一种很好的方法。我尝试了各种控制台插件,代码片段,包括一些相当复杂的插件。他们在至少一个浏览器中都遇到了一些问题,所以我最终得到了类似下面的简单内容,这是我见过的其他片段以及YUI团队的一些建议的合并。它似乎可以在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;
};
注意:它支持通过标志禁用日志记录。也许您也可以通过构建脚本自动执行此操作。或者,您可以在运行时公开UI或其他一些机制来翻转此标志。当然,您可以获得更复杂的日志记录级别,基于日志阈值的日志提交日志(例如,所有错误级别语句都会传输到服务器以便存储在那里等)。
许多关于日志记录的线程/问题似乎都将日志语句视为调试代码而不是代码 instrumentation 。因此希望删除日志语句。当应用程序在野外时,检测非常有用,并且不再容易连接调试器或从用户或通过支持向您提供信息。您不应该记录敏感的任何内容,无论它在何处登录,因此不应损害隐私/安全性。一旦您将日志记录视为工具,它现在就变成了生产代码,应该写入相同的标准。
对于使用更复杂的javascript的应用程序,我认为仪器是至关重要的。
答案 9 :(得分:1)
正如其他人提到的那样,它会在大多数浏览器中引发错误。在Firefox 4中,它不会抛出错误,该消息会记录在Web开发人员控制台中(Firefox 4中的新增内容)。
我真正喜欢的错误的一种解决方法是de&&bug:
var de = true;
var bug = function() { console.log.apply(this, arguments); }
// within code
de&&bug(someObject);
答案 10 :(得分:0)
一个不错的单行:
(!console) ? console.log=function(){} : console.log('Logging is supported.');