【问题标题】:How to have asserts removed in release build?如何在发布版本中删除断言?
【发布时间】:2015-07-08 21:51:46
【问题描述】:

我使用 babelify + watchify + envify + uglify 并设置 node_env watchify ... -g [envify --NODE_ENV development]

所以我想到了这样的断言:

import assert from 'assert';

function debug_assert(actual, expected, message = 'AssertionError'){
    if(process.env.NODE_ENV !== 'production'){
        assert.equal(actual, expected, message);
    }
}

uglify 足够聪明,可以删除 debug_assert 的主体,但不会删除代码中对 debug_assert 的实际调用。

如果没有太多额外的代码,是否可以从发布版本中正确删除断言调用?

【问题讨论】:

    标签: javascript assert babeljs watchify


    【解决方案1】:

    您可以使用jsfmt 及其代码重写功能:

    jsfmt --rewrite "assert.equal(a, b, c) -> ''" file.js
    

    尚未测试,但它可能会发挥作用。它将所有出现的assert.equal 替换为空字符串。

    【讨论】:

      【解决方案2】:

      通常您会使用多种工具的组合。正如你所说,envify 将转换

      if(process.env.NODE_ENV !== 'production'){
      

      if('production' !== 'production'){
      

      意味着if 的主体永远不会执行。

      之后您可以做的最简单的事情是使用uglifyify,因为它将执行死代码消除并删除if

      【讨论】:

      • 抱歉,我不清楚 - 我已经在这样做了。 uglify-js 删除了 debug_assert 函数的主体,但是代码库中对 debug_assert 的调用仍然存在
      • 哦,好吧。您实际上是否看到了任何性能优势?像 V8 这样的 JS 引擎只会看到该函数是空的并对其进行优化。您这样做是为了提高性能还是为了构建大小?
      • 只是在寻找一个干净的解决方案:)
      • 我的意思是这完全是主观的,哈哈。对我来说,有断言但什么都不做并不是什么大不了的事。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2014-12-24
      • 2012-09-29
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      相关资源
      最近更新 更多