0

在构建我的 Angular 5 应用程序的生产版本ng build --prod并在本地对其进行测试后,我遇到了以下问题,请参见下图。

在此处输入图像描述

有东西在打电话,/es这肯定不是我自己写的。

我认为这与缩小/aot 编译器有关。通过点击运行以下代码的路由触发调用

  export function resolveFn(){
    return Contact.$get().then( () => MailFolder.$get());
  }

在这里,Contact.$get()转换为对/contacts. 这是由一个自定义库完成的,该库根据应用程序中使用的某些资源的类名构造路由名称。下面显示了执行此操作的代码段

 class RelationConfiguration<T extends Resource, U extends Resource> {
      private path: string;

      constructor(public HostResource: IResourceConstructor<T>, public RelatedSource: IResourceConstructor<U>, public relationIdentifierKey) {
        this.path = `${toPluralDash(this.HostResource.name)}/$hostId/${toPluralDash(this.RelatedSource.name)}/$relatedId`;
      }
      getPath(hostInstance: T, relatedInstance: U = null, noId?: boolean) {
        const related = relatedInstance.id && !noId ? '/' + relatedInstance.id : '';
        return this.path.replace('$hostId', hostInstance.id.toString()).replace('/$relatedId', related);
      }
    }

console.loging 的值时this.path,我所有的资源类都被命名为es. 所以 AOT 编译正在破坏我的代码......如何解决这个问题(除了避免使用constructor.name)?请注意,这只发生在-prod标志上。“正常”构建不会破坏它。

4

1 回答 1

0

在我看来,最简单的方法是添加一些重复。我的意思是——首先扩展你的资源接口:

interface IResourceConstructor<T extends IResource> {
    new(...args: string[]): T;
    path: string;
}

然后将新属性添加到具体类

class ConcreteResource implements IResource {
    static path = 'ConcreteResource';
}

最后,您可以在函数中使用新属性:

 this.path = `${toPluralDash(this.HostResource.path)}/$hostId/${toPluralDash(this.RelatedSource.path)}/$relatedId`;
于 2018-06-16T07:26:23.693 回答