【问题标题】:Remove console.assert in production code删除生产代码中的 console.assert
【发布时间】:2011-11-15 21:30:06
【问题描述】:

我正在使用 console.assert 进行测试/调试,但我想在生产代码中删除它。我现在基本上将 console.assert 覆盖为 noop 函数,但想知道是否有更好的方法。如果有一些 javascript 预处理器来删除它,那将是理想的。

【问题讨论】:

  • @wukong 除了它是... JavaScript :-)
  • 使用测试框架和调试器怎么样? :-) 甚至不要让console.assert 进入那里!
  • 我也这样做了,但发现断言非常有用,可以通过尽可能地强制执行预期状态来尽早捕获错误

标签: javascript


【解决方案1】:

试试Closure Compiler,在高级模式下它会删除空函数(等等)。

【讨论】:

  • 我尝试编译 console.assert(1, "It works");并且关闭将其变成 console.a(1,"It works");
  • 如果我用参数调用那些空函数,闭包也不会删除空函数。前任。尝试编译 console.log = function() {};console.log(1, Math.random());
  • 也许console 对编译器来说是特别的东西(或者只是未知),但是如果你在使用它之前声明一个变量,编译器会删除所有的东西(正如它所期望的那样):对象、函数和调用,什么都没有留下。我测试了var console = {}; console.log = function(x,y) {}; console.log(1, Math.random()); - 编辑:foo(1,Math.random()); 没有警告并且编译器没有触及该行,所以我猜它被假定在其他地方定义,因此不应该积极优化(就像console )。
【解决方案2】:

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

【讨论】:

  • UglifyJS 是否也删除了空函数?
  • @jcmoney:我不这么认为,但请查看链接中的函数列表。你想在你的非生产代码中保留空函数还是想在那里检测它(以便删除)?
【解决方案3】:

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 错误,但要小心这些调用中的副作用

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();

...其中writes i0 而不是1

【讨论】:

  • 我想,可以在断言中进行一些繁重的检查。如果您只是将调用替换为“无”,则仍将处理繁重的检查。因此,仅当您删除括号内的调用和所有 javascript 时,删除断言才有意义。当然,在“控制台”调用中,应该没有副作用!无论有没有整个断言/日志,程序都应该同样工作。
猜你喜欢
  • 2012-05-05
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
  • 2020-12-24
  • 1970-01-01
  • 2010-09-07
相关资源
最近更新 更多