Построение сборки (--prod) с удалением декораторов / классов - PullRequest
0 голосов
/ 25 сентября 2019

Я работал над динамической средой Forms, которая разработана для расширения.Элементы (такие как TextElement - который расширяет ValueElement) составляют форму.Они преобразуются в угловые элементы управления (например, FormControl) с помощью «Конструкторов» и организуются в макете формы с помощью «Оркестраторов».Файлы для вышеупомянутых трех элементов хранятся в угловой библиотеке "форм" (ng g lib).

Визуальные представления / компоненты вышеупомянутого создаются "Renderers", и средства визуализации / связанные компонентыхранится в отдельной библиотеке (в зависимости от стиля - например, bootstrap-form-renderers).

ElementHandlers (конструкторы / оркестраторы / средства визуализации) задают свой обработанный элемент с помощью декоратора Typescript.

import {FormElement} from '../../elements/model/form-element';
import {Type} from '@angular/core';
import 'reflect-metadata';

export function ElementHandler<TFormElement extends FormElement>(elementType: Type<TFormElement>): ClassDecorator {
  console.log('Handling for ' + elementType);
  return target => {
    Reflect.defineMetadata('elementType', elementType.name, target.prototype);
  };
}

Например:

@ElementHandler(TextElement)
export class TextElementOrchestrator extends FormElementOrchestrator<TextElement> {
}

Обе эти библиотеки импортированы в проект приложения Angular.

При использовании "ng build" (no --prod) код работает хорошо.Каждый элемент формы создается соответствующим образом - например, элемент ввода текста представлен полем ввода, элемент тегов представлен компонентом микросхемы дизайна материала.

Код консоли выглядит так:

TextElement extends forms_core__WEBPACK_IMPORTED_MODULE_1__["ValueElement"] {
    /**
     * @param {?} id
     * @param {?} title
     * @param {?} value
     */
    constructor(id, title, value) {
        super(id, title);
        this.value = value;
    }
    /**
     * @return {?}
     */
    friendlyValue() {
        return this.value;
    }
}

Однако, когда используется «--prod», все выглядит как «TextElement», и отображается только поле ввода.

Консоль выглядит следующим образом:

class extends ValueElement{constructor(id,title,value){super(id,title),this.value=[],this.value=value}friendlyValue(){const selectedPredicate=option=>option.selected;return this.options.singleMode?this.value.find(selectedPredicate).value:this.value.filter(selectedPredicate).map(option=>option.value)}}

У меня есть подозрения, что: 1. Декораторы удаляются в процессе сборки приложения библиотеки / Angular, так как при попытке записать метаданные «elementType» в сборке --prod он отображается как «неопределенный» 2.Классы почему-то не включаются в сборку, поэтому вышеупомянутое чтение консоли не показывает подробности о классе.

Есть ли способ, которым я могу разобраться в этом / изменить это, сохраняя при этом оптимизацию сборки в-ситу?

Любые другие вещи, на которые я могу посмотреть?

Буду признателен за любой совет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...