我有一个相当精细的类,它使用旧式的创建类的方式。不是使用类关键字,而是使用函数关键字定义类。要创建公共属性,请指定 this.publicProperty 。我的代码工作得很好。
但是,当我尝试在高级模式下使用Closure Compiler(JS minifier工具)时,我会收到大量错误,首先是关于此即可。这是一个简单的例子,说明了我的问题。我尝试压缩这个简单的JS代码:
var myclass = function(p1, p2) {
this.publicProperty = null;
};
编译代码输出为空,并出现警告:
JSC_USED_GLOBAL_THIS: dangerous use of the global this object at line 2 character 2
this.publicProperty = null;
^
这为何“危险”?
我在SO上看过other posts这清楚地表明我的代码似乎没问题。为什么Closure minifier会抱怨这个?
作为第二个问题,我想知道是否有人可以建议一个有效的基于浏览器的JS minifier,它将你的JS压缩成一行代码。我已经尝试过Uglifier和Closure,javascript-minifier无法获得缩小的JS输出,这只是一行代码。
答案 0 :(得分:2)
总结下面的编辑和讨论: Closure编译器依赖于注释作为指令。因此,对构造函数进行注释(如下所示)是一个开始。接下来,还必须意识到,您正在同时编译的任何其他代码未使用的任何代码将被视为死代码,并将被编译器删除。这对于您的自定义API不起作用。所以最后的修复(也在下面)是使用数组类型属性访问表示法([]
)记录对窗口对象的函数的引用。
修改强> 我错过了一个重要的细节。由于你正在使用高级模式,因此你推迟使用高级模式,Chad说:如果使用ADVANCED模式,则有一个单独的问题 - 构造函数从未被使用,因此它被删除为死代码。因此,请确保您的代码中已经解决了构造函数。
编辑3 要修复Chad引用的问题(他的名字遍布错误报告!),下一步是将您的函数添加到全局范围。无论如何它似乎都存在于全球,所以这不是大问题(除非你纠正我)。
window ['myClass'] = myClass;
====
要解决您的问题,您必须正确注释您的代码。听起来似乎并非如此。以下是相关摘录from the docs:
@constructor
将函数标记为构造函数。编译器需要一个 @constructor注释用于与new一起使用的任何函数 关键词。应该从EcmaScript类中省略@constructor 构造函数方法和goog.defineClass构造函数方法。
使用此代码示例:
/**
* A rectangle.
* @constructor
*/
function GM_Rect() {
...
}
所以使用你的示例代码试试这个:
/**
* @constructor
*/
var myclass = function(p1, p2) {
this.publicProperty = null;
};
那应该解决这个问题。您可能必须使用命名函数而不是函数表达式。