如何在发布构建中删除断言

How to have asserts removed in release build?

本文关键字:构建 删除 断言 布构建      更新时间:2023-09-26

我使用babelify + watchify + envify + uglify并设置node_envwatchify ... -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。

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

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

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

还没有测试,但它可能会起作用。它将所有出现的assert.equal替换为一个空字符串。

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

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

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

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

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