#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.