老式的JavaScript类和高级JS缩小问题



我有一个相当复杂的类,它使用旧式的创建类的方式。类不是使用关键字,而是使用函数关键字定义。若要创建公共属性,请分配this.publicProperty。我的代码运行良好。

但是,当我尝试在高级模式下使用闭包编译器(JS简化器工具)时,我会收到无数错误,首先是关于"危险"引用的错误。这是一个微不足道的例子,说明了我的问题。我尝试压缩这个琐碎的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上看到了其他帖子,这些帖子清楚地表明我的代码似乎还可以。为什么闭包缩小器抱怨这一点?

作为次要问题,我想知道是否有人可以建议一个有效的基于浏览器的JS简化器,它将你的JS压缩为一行代码。我已经尝试过 Uglifier 和闭包,javascript-minifier 无法获得只有一行代码的缩小 JS 输出。

总结下面的编辑和讨论:闭包编译器依赖于注释作为指令。因此,注释构造函数(如下)是一个开始。接下来,还需要意识到,您同时编译的任何其他代码未使用的任何代码都将被视为死代码,并将被编译器删除。这不适用于自定义 API,例如您的 API。因此,最终的修复(也在下面)是使用数组类型属性访问表示法([])在窗口对象上记录对函数的引用。

编辑我错过了一个重要的细节。 顺从乍得下面的评论,因为您使用的是高级模式,乍得 说: 如果您使用高级模式,则存在一个单独的问题 - 构造函数永远不会使用,因此它作为死代码被删除。 因此,请确保您的构造函数在您的代码中得到解决。

编辑 3要修复 Chad 引用的问题(他的名字溅满了错误报告!),下一步是将您的函数添加到全局范围。无论如何,它似乎都驻留在全局中,所以这不是大问题(除非你纠正我)。

window['myClass'] = myClass;

====

若要解决您的问题,您必须正确批注您的代码。听起来好像情况可能并非如此。以下是文档中的相关片段:

@constructor

将函数标记为构造函数。编译器需要 @constructor与新函数一起使用的任何函数的注释 关键词。@constructor应该从 EcmaScript 类中省略 构造函数方法和 goog.defineClass 构造函数方法。

使用此代码示例:

/**
* A rectangle.
* @constructor
*/
function GM_Rect() {
...
}

因此,使用您的示例代码尝试以下操作:

/**
* @constructor
*/
var myclass = function(p1, p2) {
this.publicProperty = null;
};

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

最新更新