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
函数的名称并未重命名为 a
或 b
.
之类的名称
如何告诉编译器缩小 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
是一个命名空间,您可以获得您寻求的优化。
我有这段代码,从 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
函数的名称并未重命名为 a
或 b
.
如何告诉编译器缩小 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
是一个命名空间,您可以获得您寻求的优化。