在生产代码中删除console.assert

11

我正在使用 console.assert 进行测试/调试,但我希望在生产代码中删除它。目前,我基本上是将 console.assert 覆盖为一个 noop 函数,但想知道是否有更好的方法。如果有一些 JavaScript 预处理器可以删除这个函数,那就太理想了。


@wukong 不过这是 JavaScript :-) - user166390
4
使用测试框架和调试器怎么样?:-) 甚至不要让console.assert进来! - user166390
4
我也这么做,但我发现asserts非常有用,通过在尽可能多的地方强制预期状态来尽早捕获错误。 - jhchen
3个回答

5

UglifyJS2 能够轻松实现此功能: 运行 uglifyjs 命令时,启用压缩器并告诉它丢弃 console.* 调用:

uglifyjs [input files] --compress drop_console

快速示例:

function doSomething() {
    console.log("This is just a debug message.");
    process.stdout.write("This is actual app code.\n");
}
doSomething();

使用上述命令编译后,

...会得到以下结果:

function doSomething(){process.stdout.write("This is actual app code.\n")}doSomething();

这可能是UglifyJS2的一个bug,但在这些调用中要小心副作用!
function doSomething() {
    var i = 0;
    console.log("This is just a debug message." + (++i));
    process.stdout.write("This is actual app code." + i + "\n");
}
doSomething();

...编译为

function doSomething(){var i=0;process.stdout.write("This is actual app code."+i+"\n")}doSomething();

...它将i写成0而不是1


我猜断言中可能会有一些严格的检查。如果您只替换对“nothing”的调用,那么重要的检查仍将被处理。因此,仅删除一个断言只有在您同时删除调用和括号内所有JavaScript代码时才有意义。当然,在“console”调用中,不应该有任何副作用!无论是使用还是不使用整个断言/日志,程序都应该能正常工作。 - André Caldas

3

试试闭包编译器,在高级模式下它可以删除空函数(以及更多内容)。


我尝试编译console.assert(1, "It works");,但是闭包将其转换为console.a(1,"It works");。 - jhchen
1
同时,如果我使用参数调用那些空函数,闭包也不会删除它们。例如,尝试编译console.log = function() {};console.log(1, Math.random()); - jhchen
也许“console”对编译器来说是一些特殊的东西(或者只是未知的),但如果你在使用它之前声明一个变量,编译器会删除所有内容(正如预期和应该的那样):对象、函数和调用,什么都不剩下。我测试了var console = {}; console.log = function(x,y) {}; console.log(1, Math.random()); - 编辑:没有警告foo(1,Math.random());,并且这行代码没有被编译器触及,所以我猜它被认为是在其他地方定义的,因此不应该过于激进地进行优化(就像console一样)。 - kapex
请参考此帖子 https://dev59.com/93A85IYBdhLWcg3wHvs0 - Indolering

1

另一个工具是UglifyJS,它与nodejs一起使用。它快速且有很多选项供您查看。


UglifyJS也会删除空函数吗? - jhchen
@jcmoney:我不这么认为,但是请在链接中查看函数列表。你想在非生产代码中保留空函数,还是也想在那里检测它(以便删除)? - chelmertz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接