Импорт RouterModule в библиотеку Angular 10 без Ivy

#angular #npm #ivy

#angular #npm #ivy

Вопрос:

Я создаю библиотеку Angular 10 для публикации в частном репозитории NPM. Следуя Angular.руководство по вводу-выводу, я использовал ng new my-workspace --create-application=false и ng generate library my-library использую Angular CLI.

Мне нужно импортировать RouterModule для одного из компонентов, поэтому я делаю это так:

 import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { MyLibraryComponent } from './my-library.component';

@NgModule({
  declarations: [MyLibraryComponent],
  imports: [
    RouterModule.forChild(null)
  ],
  exports: [MyLibraryComponent]
})
export class MyLibraryModule { }
 

Когда я пытаюсь собрать библиотеку, я получаю эту ошибку:

 ERROR: Error during template compile of 'MyLibraryModule'
  Function calls are not supported in decorators but 'RouterModule' was called.

An unhandled exception occurred: Error during template compile of 'MyLibraryModule'
  Function calls are not supported in decorators but 'RouterModule' was called.

See "/tmp/ng-bGhmPt/angular-errors.log" for further details.
 

Я попытался определить RouterModule.forChild() в переменной const, чтобы избежать вызова функции в декораторе, но он выдает ту же ошибку:

 import { ModuleWithProviders, NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { MyLibraryComponent } from './my-library.component';

const routerModule: ModuleWithProviders<RouterModule> = RouterModule.forChild(null);

@NgModule({
  declarations: [MyLibraryComponent],
  imports: [routerModule],
  exports: [MyLibraryComponent],
})
export class MyLibraryModule {}
 

Эта ошибка, по-видимому, связана с Ivy, поскольку для создания библиотеки, которую я использую ng build --prod , Ivy отключен для производства. Если я включу Ivy, удалив этот раздел из tsconfig.lib.prod.json

 "angularCompilerOptions": {
    "enableIvy": false
}
 

затем он успешно создается, но я не могу опубликовать его в NPM из-за следующей ошибки:

 ERROR: Trying to publish a package that has been compiled by Ivy. This is not allowed.
Please delete and rebuild the package, without compiling with Ivy, before attempting to publish.
 

Как я должен импортировать RouterModule (forChild) в библиотеку для сборки без Ivy?

Ответ №1:

Что ж, после нескольких часов тестирования и поиска я обнаружил эту угловую проблему, которая связана с этой проблемой.

Я полностью согласен с последним комментарием от @MickL; если это проблема, связанная с View Engine, прошло более 2,5 лет без решения. Если для этого никогда не будет решения, официальное обходное решение должно быть опубликовано в документации Angular, если для публикации библиотеки требуется View Engine.

На данный момент кажется, что более простое решение так же просто, как использовать константу перед декоратором и использовать это значение в декораторе, как я уже говорил ранее; все, что мне не хватало, это export .

 import { ModuleWithProviders, NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { MyLibraryComponent } from './my-library.component';

export const routerModule: ModuleWithProviders<RouterModule> = RouterModule.forChild(null);

@NgModule({
  declarations: [MyLibraryComponent],
  imports: [routerModule],
  exports: [MyLibraryComponent],
})
export class MyLibraryModule {}
 

Я действительно надеюсь, что это исправлено или, по крайней мере, описано в документах Angular.