当前位置:  开发笔记 > 编程语言 > 正文

在生产JavaScript代码中留下"console.log()"调用的好主意?

如何解决《在生产JavaScript代码中留下"console.log()"调用的好主意?》经验,为你挑选了6个好方法。

console.log()我的JavaScript中有很多调用.

在部署到生产之前,我应该对它们进行评论吗?

我想把它们留在那里,所以如果我需要做更多的调试,我不必在以后重新添加注释的麻烦.这是一个坏主意吗?



1> Jason Creigh..:

它将导致Javascript错误,终止包含错误的Javascript块的执行.

但是,您可以定义一个虚拟函数,当Firebug未激活时,它是一个无操作:

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

如果你使用除了之外的任何方法log,你也需要删除它们.


我有一个小的(单元测试的)项目,可以用最少量的代码帮助你使用各种不同的控制台方法.它位于:https://github.com/andyet/ConsoleDummy.js
大括号定义了一个对象文字:https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Literals#Object_Literals和"function(){}"位定义了一个不带参数且什么都不做的匿名函数.(它仍然可以通过参数调用"console.log(foo)",因为JS不关心你是否调用参数太多或太少的函数.)

2> Chris Nielse..:

正如其他人已经指出的那样,留下它会导致某些浏览器出错,但这些错误可以通过放入一些存根来解决.

但是,我不仅会对它们进行评论,而是直接删除这些行.这样做似乎很草率.也许我是迂腐的,但我不认为"生产"代码应该包括"调试"代码,即使是在评论的形式.如果你完全留下评论,那些评论应该描述代码正在做什么,或者背后的原因 - 不是禁用代码块.(虽然,大多数评论都应该由你的缩小过程自动删除.你正在最小化,对吧?)

此外,在使用JavaScript的几年中,我不记得曾经回到函数并说"哎呀,我希望我在这里留下那些console.logs!" 一般来说,当我"完成"一个函数,然后必须回到它,我回来修复一些其他问题.无论新问题是什么,如果上一轮工作中的console.logs可能有所帮助,那么我第一次就发现了这个问题.换句话说,如果我回过头来看,我可能不需要在以前的场合使用完全相同的调试信息.

我的两分钱......祝你好运!


永久调试线非常棒.它们意味着您通常不必四处寻找bug的来源,但可以立即看到发生的事情.有许多代码段,其中日志语句不会产生任何显着的性能差异.
简而言之:记录主要(高级)决策和事件处理,因此可以遵循业务,高级UI和主要事件处理流程.这些对于工程应用程序的永久性是有价值的.记录'进入方法A','离开方法A','param1 77'是OTOH不好的记录.
良好的日志记录应该可用于各种目的.说log()语句只对调试一个问题有用,让我想起那些不知道如何编写正确日志的人的Java日志记录.

3> Nosredna..:

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

在您使用它时,您可以通过JSLint抛出JS并记录违规以进行检查(或阻止部署).

这是您希望自动部署的一个很好的示例.如果您的进程允许您在其中发布带有console.logs的js文件,那么您在某个时刻执行此操作.



4> Henrik Joret..:

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

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

这是3个不同版本中的第一个,取决于你想要存根的所有控制台方法都很小,并且都已经在IE6 +和现代浏览器中进行了测试.

其他两个版本涵盖了不同的其他控制台方法.一个涵盖了四个基础知识,另一个涵盖了firebug和webkit的所有已知控制台方法.同样,在最小的文件大小可能.

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

如果你能想出任何方法来进一步减少代码,欢迎贡献.

- 编辑 - 2012年5月16日

我已经改进了这段代码.它仍然很小,但增加了打开和关闭控制台输出的能力:https://github.com/HenrikJoreteg/andlog

它在The Changelog Show上有特色



5> Christoph..:

console.log如果对象不存在,您至少应该创建一个虚拟对象,这样您的代码就不会在没有安装firebug的情况下在用户的机器上抛出错误.

另一种可能性是仅在"调试模式"下触发日志记录,即如果设置了某个标志:

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



6> Dimitar Chri..:

希望它有所帮助 - 我曾经为它写了一个包装器,它比公认的解决方案稍微灵活一些.

显然,如果你使用其他方法,如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");

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有