使用调试功能会console.log
降低 JavaScript 的执行性能吗?是否会影响生产环境中脚本执行的速度?
是否有一种方法可以从单个配置位置禁用生产环境中的控制台日志?
使用调试功能会console.log
降低 JavaScript 的执行性能吗?是否会影响生产环境中脚本执行的速度?
是否有一种方法可以从单个配置位置禁用生产环境中的控制台日志?
如果您打算在公共站点或其他地方使用它,任何对使用开发人员工具知之甚少的人都可以阅读您的调试消息。根据您记录的内容,这可能不是理想的行为。
最好的方法之一是将其包装console.log
在您的方法之一中,您可以在其中检查条件并执行它。在生产版本中,您可以避免使用这些功能。这个Stack Overflow 问题详细讨论了如何使用Closure 编译器来做同样的事情。
所以,回答你的问题:
const DEBUG = true / false
DEBUG && console.log('string')
Will use of the debugging feature console.log reduce JavaScript execution performance? Will it affect the speed of script execution in production environments?
Of course, console.log()
will reduce your program's performance since it takes computational time.
Is there an approach to disable console logs in production environments from a single configuration location?
Put this code at the beginning of your script to override the standard console.log function to an empty function.
console.log = function () { };
如果您在通用核心脚本中创建控制台快捷方式,例如:
var con = console;
然后在整个代码中使用 con.log("message") 或 con.error("error message") ,在生产中,您可以简单地将核心位置中的 con 重新连接到:
var con = {
log: function() {},
error: function() {},
debug: function() {}
}
任何函数调用都会略微降低性能。但是一些console.log
's 应该没有任何明显的效果。
但是它会在不支持的旧浏览器中抛出未定义的错误console
性能损失将是最小的,但是在旧浏览器中,如果用户浏览器控制台未打开,则会导致 JavaScript 错误log is not a function of undefined
。这意味着 console.log 调用之后的所有 JavaScript 代码都不会执行。
您可以创建一个包装器来检查是否window.console
是一个有效的对象,然后在包装器中调用 console.log。像这样简单的东西会起作用:
window.log = (function(console) {
var canLog = !!console;
return function(txt) {
if(canLog) console.log('log: ' + txt);
};
})(window.console);
log('my message'); //log: my message
这是一个小提琴:http: //jsfiddle.net/enDDV/
我做了这个 jsPerf 测试:http: //jsperf.com/console-log1337
它似乎不会比其他函数调用花费更长的时间。
没有控制台 API 的浏览器呢?如果您需要使用 console.log 进行调试,您可能会在生产部署中包含一个脚本来覆盖控制台 API,就像 Paul 在他的回答中建议的那样。
I do it this way to maintain original signature of console methods. In a common location, loaded before any other JS:
var DEBUG = false; // or true
Then throughout code
if (DEBUG) console.log("message", obj, "etc");
if (DEBUG) console.warn("something is not right", obj, "etc");