gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:10:38 25 4
gpt4 key购买 nike

我有一个相当复杂的类,它使用旧式的创建类的方式。类不是使用 class 关键字,而是使用 function 关键字定义。要创建公共(public)属性,您可以分配 this.publicProperty。我的代码运行良好。

但是,当我尝试使用 Closure Compiler (一种 JS 缩小工具)在高级模式下,我遇到了无数错误,首先是关于对 this 的“危险”引用。这是一个简单的例子,它说明了我的问题。我尝试压缩这个简单的 JS 代码:

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

Compiled Code 输出为空,并且有警告:

JSC_USED_GLOBAL_THIS: dangerous use of the global this object at line 2 character 2
this.publicProperty = null;
^

为什么这是“危险的”?

我看过 other posts在这里清楚地表明我的代码似乎没问题。为什么 Closure minifier 会提示这个?

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

最佳答案

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

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

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

窗口['myClass'] = myClass;

====

要解决您的问题,您必须正确注释您的代码。听起来好像情况并非如此。这是一个相关的片段 from the docs :

@constructor

Marks a function as a constructor. The compiler requires a @constructor annotation for any function that is used with the new keyword. @constructor should be omitted from EcmaScript class constructor methods and goog.defineClass constructor methods.

使用此代码示例:

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

所以用你的示例代码试试这个:

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

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

关于javascript - 老式 JavaScript 类和高级 JS 缩小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49055483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com