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