Модули библиотеки Angular экспортируют компоненты, службы и другие компоненты из модуля

Я создал библиотеку Angular. Я бы хотел, чтобы в моей библиотеке было чисто, если внутри были функциональные модули:

Пример:

Library
  NavigationModule
    NavigationSideBarComponent
    NavigationTopComponent
    Navigation Service
    etc

  GraphModule
    BarGraphComponent
    PieGraphComponent

Мой модуль навигации сейчас выглядит так:

@NgModule({
  declarations: [
    NavigationSidebarComponent
  ],
  imports: [
    CommonModule,
    MatSidenavModule
  ],
  exports: [
    NavigationSidebarComponent
  ]
})
export class NavigationModule { }

Мой модуль библиотеки в настоящее время выглядит так:

@NgModule({
  declarations: [LibraryComponent],
    imports: [
      NavigationModule
    ],
    exports: [
      LibraryComponent
      //NavigationSidebarComponent  <-- Did not work
    ]
 })
 export class LibraryModule { }

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

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

Я буду продолжать изучать это со своей стороны.


person L1ghtk3ira    schedule 02.01.2019    source источник
comment
Я никогда не создавал и не публиковал библиотеки, но заметил, что некоторые поставщики пользовательского интерфейса публикуют отдельные модули в npm отдельно. Вот пример модуля выпадающих компонентов стороннего поставщика. npmjs.com/package/@progress/kendo-angular-dropdowns   -  person Keenan Diggs    schedule 03.01.2019
comment
Спасибо, Кинан, я думаю, может быть, это невозможно. Только те, которые импортируют модуль, имеют доступ к своим компонентам и т. Д. Я надеялся сделать это так, потому что тогда у меня могла бы быть одна библиотека, в которой каждый модуль был бы функцией.   -  person L1ghtk3ira    schedule 03.01.2019
comment
Это начинает выглядеть так, как будто мне нужно сделать библиотеку для каждой, которой было бы ужасно управлять. Или поместите все компоненты, независимо от типа, такие как верхний колонтитул, нижний колонтитул, таблицы, в модуль библиотеки.   -  person L1ghtk3ira    schedule 03.01.2019
comment
Моя основная мысль заключается в том, что Angular поддерживает его, поэтому я предполагаю, что это можно сделать   -  person L1ghtk3ira    schedule 03.01.2019
comment
Если у вас есть зависимость одного модуля от другого (например, с использованием BarGraphComponent в вашей реализации NavigationTopComponent), это может быть нормально. Пока зависимость односторонняя.   -  person Keenan Diggs    schedule 03.01.2019
comment
Посмотрите на зависимости, которые имеет сетка @progress kendo: telerik .com / kendo-angular-ui / components / grid / # toc-dependencies И на самом деле, похоже, что npm поддерживает одноранговые зависимости, так что забудьте мой односторонний комментарий.   -  person Keenan Diggs    schedule 03.01.2019
comment
Таким образом, навигация и график - это отдельные модули. Я хочу, чтобы appModule, импортирующий библиотеку, мог использовать оба. Я посмотрю   -  person L1ghtk3ira    schedule 03.01.2019
comment
Я могу ошибаться, но я думаю, что все по-другому. Я думаю, что их кендо использует все эти разные модули для себя. Я пытаюсь создать много разных модулей в библиотеке, а затем импортировать эту библиотеку в приложение и иметь возможность вызывать компоненты и службы для обоих модулей.   -  person L1ghtk3ira    schedule 03.01.2019


Ответы (2)


Вы должны экспортировать NavigationModule в LibraryModule, а не NavigationSidebarComponent

person Christian    schedule 03.01.2019
comment
Спасибо модульному подходу, который я считаю лучшим для библиотеки. - person L1ghtk3ira; 03.01.2019

Я думаю, вам вообще не нужен модуль библиотеки верхнего уровня. Посмотрите исходное дерево для @angular/material: я думаю, что раньше у них a material.module и избавился от него, и теперь в корне остался только полностью пустой index.ts. Каждый компонент имеет свой собственный модуль и такие модули, как тот, который используется для импорта модулей MatAutocomplete, от которых они зависят (например, MatOptionModule), и реэкспортирует их.

Я конвертировал свой проект в аналогичную модель и проводил исследования, чтобы выяснить текущие передовые практики для структуры модулей. Я считаю, что Материал преобразован из подхода с монолитной библиотекой, где вам было рекомендовано import { MatAutocompleteModule } from "@angular/material" использовать один модуль на компонент (или группу связанных компонентов), потому что этот подход позволяет вам распространять библиотеку как единый пакет, но все же получать выгоду от встряхивания дерева , поэтому в вашу сборку будут включены только фактически используемые модули.

person Coderer    schedule 24.09.2020