谷歌闭包编译器(http://closure-compiler.appspot.com/home)在我使用"this."或使用揭示模块模式时保留了所有方法名称。它似乎仅在方法不在可能被其他外部方法引用的对象中时才将方法重命名为字母。我尝试包装我的(实用程序)对象和使用它的匿名方法,但这似乎没有帮助。如何创建可能相互共享的对象(和单独的脚本文件),并且仍然缩写所有方法名称?
我阅读了几篇关于 SO 的帖子,但没有看到任何解决此问题的内容,只有关于由于与外部变量冲突而未重命名的内容的帖子。
var Utility = (function () {
this.isDefined = function (v) {
/// <summary>Checks to see if a variable is defined.</summary>
return typeof v !== 'undefined';
}
this.isObj = function (v) {
/// <summary>Checks to see if a variable is an object.</summary>
return typeof v === 'object';
}
...
})();
然后我希望能够做到:
(function(u) {
u.isDefined();
})(Utility);
我也试过:
var Utility = (function () {
var utility = {};
utility.isDefined = function (v) {
/// <summary>Checks to see if a variable is defined.</summary>
return typeof v !== 'undefined';
}
utility.isObj = function (v) {
/// <summary>Checks to see if a variable is an object.</summary>
return typeof v === 'object';
}
return utility;
...
揭示对象模式不适用于闭包编译器。您使用的额外闭包也不会为窗口和文档全局变量添加别名。最后一个用例本身在闭包编译器中也是有问题的。目前,编译器不能很好地处理别名,尤其是在将命名空间作为函数参数传递时。
// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// ==/ClosureCompiler==
var Utility = {};
Utility.isDefined = function (v) {
/// <summary>Checks to see if a variable is defined.</summary>
return typeof v !== 'undefined';
};
Utility.isObj = function (v) {
/// <summary>Checks to see if a variable is an object.</summary>
return typeof v === 'object';
};
(function() {
function myPrivateFunction(x) {
}
Utility.SomeMethod = function(x) {
return myPrivateFunction(x);
};
})();
Utility.isDefined(x);
window['Utility'] = Utility;
此示例的编译和重命名可以在 http://closure-compiler.appspot.com/
您可以通过使用 output_wrapper
标志并正确导出符号来保护局部变量不渗入全局范围。
编译器还特别禁止在非构造函数、非原型函数中使用 this
关键字。应始终使用完整的命名空间。然后,编译器可以平展命名空间方法(这就是发生限制的原因)。
查看哪个编译级别适合我?