Closure Compiler 不会缩小匿名函数中的函数

Closure Compiler doesn't minify functions inside anonymous function

我有这段代码,从 TypeScript 编译成 JavaScript,我想用 Google Closure Compiler 缩小它:

var api;
(function (api) {
    function connect() {
        console.log("connected!");
    }
    api.connect = connect;
})(api || (api = {}));
api.connect();

编译为:

var a;
(function(b) {
  b.connect = function() {
    console.log("connected!");
  };
})(a || (a = {}));
a.connect();

如您所见,匿名函数中的 connect 函数的名称并未重命名为 ab.

之类的名称

如何告诉编译器缩小 connect 函数的名称?

编辑:

好像是因为connect是保留字。当我将 connect 替换为 connectt 时,问题就消失了。

var api;
(function (api) {
    function connectt() {
        console.log("connected!");
    }
    api.connectt = connectt;
})(api || (api = {}));
api.connectt();

编译为:

var a;
(function(b) {
  b.a = function() {
    console.log("connected!");
  };
})(a || (a = {}));
a.a();

感谢@A。安德烈斯 !

某些属性不会重命名,因为它们是在 externs file 中声明的。如果编译器无法确定 属性 是否是外部依赖项的一部分,那么它不会被重命名。

在您的具体情况下,我可以看到有一个名为 connect 的方法是 externs/browser/w3c_audio.js (AudioNode.prototype.connect) 中网络音频 API 的一部分。

属性 重命名在 Closure Compiler FAQ 和那里提到的博客文章中有详细解释。

问题在于您如何通过 IIFE 参数传递命名空间。如果你避免这种情况,你就会得到你想要的结果。

const api = {};
(function () {
  function connect() {
    console.log("connected!");
  }
  api.connect = connect;
})();
api.connect();

编译器无法将 api 识别为类型,因此没有足够的信息将属性与其他对象区分开来。通过避免由 IIFE 调用创建的别名并使用 const 告诉编译器 api 是一个命名空间,您可以获得您寻求的优化。