我有这段代码,从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。安德烈斯!
答案 0 :(得分:1)
某些属性不会重命名,因为它们是在externs file中声明的。如果编译器无法确定属性是否属于外部依赖项,则不会重命名。
在您的具体情况下,我可以看到有一个名为connect
的方法是externs/browser/w3c_audio.js(AudioNode.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
是命名空间,您可以获得所寻求的优化。