如何使闭包编译器在大型项目中通过高级优化来删除所有死代码?

问题描述 投票:0回答:1

以下代码:

function f(a) { a.a = 5; return a; }
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});

由闭包编译器优化为:

function a(){return function(){}}function b(c){c.a=5}b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a()); 

(它留下了死代码。)

但是,如果我删除最后一行(仅重复调用 24 次),它就会删除死代码。结果是空的。

如何强制闭包编译器删除大型项目中的所有无效代码?

javascript google-closure-compiler dead-code
1个回答
4
投票

区别在于编译器是否决定内联“f”。 一旦内联,“(function(){}).a = 5”就是一个死表达式。在此之前,“f”是一个具有副作用的函数(它会修改其参数)并且无法自行删除。

内联的决定基于对内联是否会导致更小的代码大小的估计。 在这种情况下,从 24 到 25 的变化是估计内联成本超过删除函数定义所节省的成本的临界点。

© www.soinside.com 2019 - 2024. All rights reserved.