老派JavaScript类和高级JS缩小问题

时间:2018-03-01 17:30:29

标签: javascript google-closure-compiler uglifier

我有一个相当精细的类,它使用旧式的创建类的方式。不是使用关键字,而是使用函数关键字定义类。要创建公共属性,请指定 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输出,这只是一行代码。

1 个答案:

答案 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;
    };

那应该解决这个问题。您可能必须使用命名函数而不是函数表达式。