Javascript Class.name始终';e';丑陋之后的每一堂课/制作网页

Javascript Class.name始终';e';丑陋之后的每一堂课/制作网页,javascript,webpack,ecmascript-6,uglifyjs,es6-class,Javascript,Webpack,Ecmascript 6,Uglifyjs,Es6 Class,我有一个应用程序,它在开发环境中工作得很好,但在生产环境中却不工作,这是由丑陋造成的(我想是的) 我有一个用户构建的数据,我将其保存到文件或本地存储中(这两种情况下都是json,所以不重要) 该结构由3种类型的节点构成。我已经在基类中实现了属性(都从一个类继承):type=this.constructor.name,它在开发中工作得非常好。当我加载应用程序并读取缓存时,我会遍历JSON并使用switch(obj.type)case class1.name…等重新生成对象。它工作得很好 然而,当我

我有一个应用程序,它在开发环境中工作得很好,但在生产环境中却不工作,这是由丑陋造成的(我想是的)

我有一个用户构建的数据,我将其保存到文件或本地存储中(这两种情况下都是json,所以不重要)

该结构由3种类型的节点构成。我已经在基类中实现了属性(都从一个类继承):
type=this.constructor.name
,它在开发中工作得非常好。当我加载应用程序并读取缓存时,我会遍历JSON并使用
switch(obj.type)case class1.name…
等重新生成对象。它工作得很好

然而,当我为生产构建时,当我调用
class1.name
class2.name
class3.name
时,它都返回
e
,这使得无法恢复正确的对象

我不认为这是特定于框架的问题,但如果有人需要知道我是使用VueJS和Quasar框架构建的


有什么想法吗?

构造函数。name
或任何其他函数
name
属性在客户端JavaScript中都不应依赖,因为在生产环境中必须进行缩微,并且具有有意义的名称的函数将成为一个字母命名的函数
e
是使用UglifyJS缩小的函数的通用名称。这就是为什么uglified JS文件比未统一的文件占用空间小得多的原因

如果函数/类名不用于调试,则应将其显式指定为静态属性。由于无法在某些引擎中重新定义
name
(也可用于调试)或可以使用任何其他属性名称:

class Foo {
  static get id() { return 'Foo' }
  ...
}
或:


不管是谁

Webpack用于压缩和隐藏代码的各个方面(称为“mangle”),具体而言,它会将所有类转换为e,如果要保留类名和/或函数名,则必须在Webpack配置或cli中指定不执行此操作


您可以通过删除最小化或创建自己的优化实例来禁用此行为,如图所示

您可以让uglifyJS吐出损坏但唯一的类名吗?那会短很多,但仍然有用。不,好的。这个想法看起来很有趣,但用途有限。名称只能用于调试。即使标识符是唯一的,这也不会阻止
a
类在另一个版本中变成
b
。不一定。我使用“name”来确定用户与令牌一起使用的是哪种授权方法。当重新加载页面时,我将使用该字符串初始化正确的类。只要它们是独一无二的,就可以了。如果标识符发生变化,可能会在构建之间产生问题,这是正确的,但不是灾难性的-用户只需再次登录。您能让uglifyJS吐出损坏但唯一的类名吗?这将大大缩短,但仍然可用。
class Foo {
  ...
}
Foo.id = 'Foo';