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

时间:2017-02-01 16:18:26

标签: javascript google-closure-compiler

我有这段代码,从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。安德烈斯!

2 个答案:

答案 0 :(得分:1)

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

在您的具体情况下,我可以看到有一个名为connect的方法是externs/browser/w3c_audio.jsAudioNode.prototype.connect)中Web Audio API的一部分。

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

答案 1 :(得分:0)

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

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

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