【问题标题】:Why uglifyjs doesn't remove dead code?为什么 uglifyjs 不删除死代码?
【发布时间】:2015-08-20 04:41:59
【问题描述】:

例如,我有以下代码:

if ("a" !== "a") {
    console.log('really?');
}

var a = 5;

然后我写uglifyjs code.js -o code.min.js。结果,我有以下内容:

if("a"!=="a"){console.log("really?")}var a=5;

如何启用删除 if 语句中的死代码?

【问题讨论】:

  • 什么是死代码? console.log?还是整个 if 块?前者是一个完全有效的代码,具有完全有效的目的。它与优化if(a == 1 || a == 1) 非常不同。另外,我认为 uglifier 的优化非常有限。
  • if 块内的代码永远不会运行。所以,它已经死了。
  • 你需要静态分析工具,而不仅仅是 AST 解析器。
  • @CppLearner,你肯定需要知道你在争论什么。 Stackoverflow 不是你表达想法或怀疑的地方,尤其不是你让别人相信你知道你实际上不知道的地方。 UglifyJS2 完美地去除了死代码。

标签: javascript uglifyjs


【解决方案1】:

尽管这个问题已经得到了公认的答案,但我认为值得一提的是

  1. UglifyJS2 确实删除了死代码

  2. 要打开此功能,您需要在 CLI (uglifyjs --compress unused,dead_code) 中设置适当的选项,如果您以编程方式调用 uglify (uglify(compress: { unused: true, dead_code: true });),则需要在 options 对象中设置适当的选项。

【讨论】:

  • 对我来说,我还需要将评估和条件设置为 true,并将大多数其他内容设置为 false。我只想消除死代码,而不是任何其他压缩。
  • 如果你使用带有 uglifyjs 的 webpack,你也可以在 package.json 中使用 sideEffects prop,webpack.js.org/guides/tree-shaking/…
【解决方案2】:

根据 uglifyjs 的 README,维护者已将开发工作转移到 UglifyJS2。自述文件还说它只删除:

一些无法访问的代码并发出警告(返回后的代码, throw、break 或 continue 语句,函数/变量除外 声明)。

Uglify2 做了更全面的工作。我在demo site 上测试了您的代码,它确实删除了整个 if 语句。它还支持“条件编译”(或者更准确地说是条件代码删除),允许您在 uglifying 时在命令行中定义全局变量。

【讨论】:

  • 感谢您的帮助!这就是我的问题的解决方案
猜你喜欢
  • 1970-01-01
  • 2012-03-14
  • 2016-09-26
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多