جاوااسکریپت - توابع Prod در Angular 6 در دکوریتورها پشتیبانی نمیشوند اما '..Module' فراخوانی شد


من این خطا را هنگام تلاش برای استفاده از angular2-json-schema-form و ساخت در حالت تولید دارم

خطا در هنگام کامپایل قالب ماژول 'DemoModule' رخ داد. فراخوانی توابع در دکوراتورها پشتیبانی نمیشود اما 'JsonSchemaFormModule' فراخوانی شد. من متوجه شدم که خطا از اینجا میآید:

@NgModule({
  declarations: [ AceEditorDirective, DemoComponent, DemoRootComponent ],
  imports: [
    BrowserModule, BrowserAnimationsModule, FlexLayoutModule, FormsModule,
    HttpClientModule, MatButtonModule, MatCardModule, MatCheckboxModule,
    MatIconModule, MatMenuModule, MatSelectModule, MatToolbarModule,
    RouterModule.forRoot(routes),

    NoFrameworkModule, MaterialDesignFrameworkModule,
    Bootstrap3FrameworkModule, Bootstrap4FrameworkModule,

    JsonSchemaFormModule.forRoot(   // the source of the Error
      NoFrameworkModule,
      MaterialDesignFrameworkModule,
      Bootstrap3FrameworkModule,
      Bootstrap4FrameworkModule
    )
  ],
  bootstrap: [ DemoRootComponent ]
}) 

در کد منبع کتابخانه، آنها چیزی شبیه به این استفاده میکنند:

export class JsonSchemaFormModule {
  static forRoot(...frameworks): ModuleWithProviders {
    const loadFrameworks = frameworks.length ?
      frameworks.map(framework => framework.forRoot().providers[0]) :
      [{ provide: Framework, useClass: NoFramework, multi: true }];
    return {
      ngModule: JsonSchemaFormModule,
      providers: [
        JsonSchemaFormService, FrameworkLibraryService, WidgetLibraryService,
        ...loadFrameworks
      ]
    };
  }
}

وقتی متغیر loadFramworks را حذف میکنم، خطا ندارم اما به نظر نمیرسد بتوانم فریمورکها را در ویژگی providers وارد کنم

پاسخ شماره ۱

این یک مشکل با AOT است همانطور که جواب دیگر میگوید. توابعی که در یک دکوراتور مانند @NgModule فراخوانی میشوند باید به گونهای باشند که توسط کامپایلر قابل تحلیل استاتیک باشند. الزامات دقیق برای این موضوع پیچیده است زیرا به عوامل متعددی و نسخههای کتابخانهها و ابزارهای مورد استفاده بستگی دارد.

وقتی تابع مشکلساز در یک کتابخانه است که شما مالک آن هستید، امکان اقدام وجود دارد. در مورد من، به عنوان مثال، من تصمیم گرفتم همه متغیرهای محلی را از تابع حذف کنم و آن را به یک دستور بازگشتی واحد از یک عبارت پیچیده تبدیل کنم که هیچ فراخوانی تابعی جز RouterModule.forRoot ندارد که مشخص است کار میکند. به عنوان مثال میتوانید کمیّت «make withConfig AOT compatible» در پروژه Angular Flex Layout را ببینید. بازی کردن با گزینههای کامپایلر Angular در tsconfig.lib.json نیز توسط برخی از کاربران در مسائل GitHub Angular مستند شده است که کار میکند.

در مورد شما، به نظر میرسد که شما کنترل ماژول و تابع مشکلساز را در دست ندارید. شما قطعاً باید آن را به توسعهدهندگان ماژول گزارش دهید.

پاسخ شماره ۲

من همان مشکل را وقتی با aot=true ساخت داشتم، تجربه کردم. اول باید ماژول Bootstrap4FrameworkModule را بارگذاری کنید.

روش حلی که پیدا کردم:

import { JsonSchemaFormModule, Bootstrap4FrameworkModule, JsonSchemaFormService, FrameworkLibraryService, WidgetLibraryService } from 'angular2-json-schema-form';

@NgModule({
declarations: [
  testComponent
],
import:[
  testRoutingModule,
  Bootstrap4FrameworkModule.forRoot(), {
            ngModule: JsonSchemaFormModule,
            providers: [
                JsonSchemaFormService, FrameworkLibraryService,
                WidgetLibraryService,
            ]
        }

}),
export class testModule{}