Вложенные модули плохи в Angular?

Есть кое-что, что меня интересует в модулях. Я начал Angular 2 некоторое время назад, поэтому искал слишком много тем, но пока не нашел удовлетворительного ответа.

Когда мы создаем приложение angular 2, обязательно используя модули. Конечно, также используйте вложенные модули. Сколько вложенных модулей мы можем использовать? Это выполнимо или есть ограничение для вложенных модулей?

Например, скажем, у меня есть приложение панели администратора. Можем ли мы так построить

app.module.ts
|
 --dashboard
    |
    --dashboard.module.ts
      |
      --login
        |
        --login.module.ts
        .
        .
        .

Мы точно можем структурировать таким образом. Но допустим, у нас есть 5 или более вложенных модулей, это нормально для приложения angular? Может вызвать какие-либо проблемы или вызвать проблемы с производительностью? Или мы должны сделать это простым (максимум 3 вложенных и т. Д.) Для практики?

Также как tsc ведет себя при увеличении вложенных модулей и компонентов?

Чтобы подвести итог, каковы плюсы, минусы вложенных модулей и т. Д., И что является наилучшей практикой для структурирования вложенных модулей?


person orhun.begendi    schedule 26.03.2017    source источник
comment
Звучит неправильно. Модуль предназначен для полного разделения вещей (например, внутренняя панель управления и общедоступный сайт).   -  person Tatsuyuki Ishi    schedule 26.03.2017
comment
но в какой-то момент мы используем модули бок о бок. На github так много проектов, в которых используются вложенные модули. просто интересно, почему и какой в ​​этом смысл?   -  person orhun.begendi    schedule 26.03.2017
comment
Их вложение допускается и запускается браузером как обычно; однако, с точки зрения ухода, вы должны сделать дерево более плоским. Пожалуйста, отредактируйте свое сообщение, чтобы показать более подробный пример ваших вложенных вопросов.   -  person Tatsuyuki Ishi    schedule 26.03.2017
comment
Я думаю, вы имеете в виду компонент, а не модуль?   -  person pixelbits    schedule 26.03.2017
comment
Нет, я не хотел составлять компоненты. Мы можем вызывать модули из модулей, если мы так используем, какой для нас эффект? Это просто плохой код или что?   -  person orhun.begendi    schedule 26.03.2017
comment
В руководстве по стилю angular рассказывается о функциональных модулях и о том, зачем их использовать. Возможно, это уместно здесь: angular.io/guide/styleguide#feature-modules   -  person eflat    schedule 30.08.2017


Ответы (2)


Вложенные или не вложенные - это не черно-белая ситуация. К сожалению, как и в большинстве случаев разработки программного обеспечения, «это зависит от обстоятельств».

Тем не менее, я призываю вас обдумать это - суть NgModule (помимо технической мотивации для разрешения AOT) состоит в том, чтобы предоставить «единицу» более высокого уровня для вашего приложения. Другими словами, вы можете сгруппировать отдельные компоненты / службы / каналы в дискретные группы, которые позволят вам рассматривать эту группировку как единое целое, обеспечивающее определенную функциональность. В большинстве случаев это используется для обеспечения функций в вашем приложении (так называемых «функциональных модулей»), но система NgModule также используется для решения других типов сквозных проблем. Фактически, авторам библиотек становится легко распространять свою библиотеку как единый модуль NgModule, инкапсулирующий все предоставляемые ими функциональные возможности. (Примеры включают встроенные библиотеки, такие как HttpModule и FormsModule, а также MaterialModule, FlexLayoutModule и т. Д.)

Этот пример использования NgModule как контейнера распространения помогает мне подумать о том, как я должен сгруппировать свои компоненты / службы / каналы - это не всегда возможно, но я стараюсь думать, что могу взять папку, содержащую определение модуля и его различные части. и должен иметь возможность перетащить эту папку в любое другое приложение, и оно должно в основном работать (при условии наличия его внешних зависимостей). Такой подход помогает мне сосредоточиться на том, насколько детально сделать NgModule. Это не значит, что я не вкладываю папки в этот NgModule, но то, что есть вложенная папка, не означает, что я автоматически создаю NgModule - если эти элементы не имеют смысла в качестве какого-либо контейнера распространения, я не буду беспокоиться для создания вложенных модулей NgModules в соответствии со структурой папок.

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

person snorkpete    schedule 27.03.2017
comment
Я работаю над большим общим модулем и пытаюсь разбить некоторые компоненты на модули на основе их общих функций (например, модальные компоненты). Моя проблема заключается в импорте моего подмодуля в общий. Теперь у него больше нет доступа к другим объявленным объектам в общем доступе (например, к настраиваемому каналу). Вы говорите, что даже если эту функциональность можно сгруппировать в папке, лучше не создавать подмодуль, потому что теоретически вы не можете взять модуль и оставить его отдельно в другом проекте? (т.е. ему потребуются эти другие зависимости, такие как настраиваемый канал, которого у него не было бы) - person Esten; 11.02.2020
comment
Я не совсем понимаю контекст, окружающий ваш вопрос, но если я правильно понимаю суть, вы технически не можете создать подмодуль, который пытаетесь создать, поскольку он (потенциальный подмодуль) не будет иметь доступа к (по крайней мере, один) пользовательский канал, который ему нужен. Но я хотел сказать, что вы можете использовать структуры папок, которые имеют смысл с точки зрения организации кода, но не чувствуете себя обязанным создавать подмодули только потому, что вы помещаете свой код в подпапки. - person snorkpete; 12.02.2020

Для меня основная цель использования NgModules - это ленивая загрузка; Я не поклонник логического / функционального структурирования в angular. Если бы в angular не было ленивой загрузки, я бы, вероятно, просто структурировал код следующим образом:

components/
services/
pipes/
models/
...

С точки зрения отложенной загрузки, вложение модулей по сравнению с их отсутствием не имеет значения. И я, наверное, решаю, какой код загружается вместе, какой код находится на одной странице. Например, даже если 2 компонента кажутся принадлежащими одной и той же функции, но находятся на разных страницах, я бы хотел, чтобы они были в модулях соответствующих страниц для лучшей отложенной загрузки.

Итак, в настоящее время я структурирую свой код следующим образом:

app
|
 --services/
   |
    -- the services module called `CoreModule` in angular docs.
 --shared/
   |
    -- the shared module described in angular docs. Has models as well.
 --pages/
   |
    -- page1/
       |
        -- a module for page1/feature1 that I'll use in lazy-loaded manner (but may not do so if found unsuitable).
    -- page2/
       |
        -- a module for page2/feature2 that ...

Итак, отвечая на ваш вопрос конкретно о вложенности:

  • Вложенные модули на самом деле представляют собой просто структуру папок; нет никакого эффекта против отсутствия тестирования по углу. Вложенный модуль похож на модуль верхнего уровня. Например, вы можете импортировать login.module.ts в модуль рядом с dashboard.
  • Поскольку это структура папок, нет ограничений на уровни вложенности по углу.
  • Однако обычно во вложенных модулях у вас есть модуль X, импортирующий модуль Y, импортирующий модуль Z, ... и т.д. На данный момент я не знаю, влияет ли это на производительность или нет, но я не ожидаю, что это имеют. Тем более, что такая же ситуация существует в зависимостях библиотек: создание изображений с использованием компонента / модуля angular из некоторого пакета npm, который использует другой компонент / модуль angular в другом пакете npm и т. Д.
  • Что касается моего мнения о вложенных модулях и структуре кода в целом, я изложил его выше.

Чтобы избежать вложенности, см. Принцип «Сохраняйте плоскую структуру папок как можно дольше» в Официальное руководство по стилю Angular. В общем, Руководство по стилю кажется хорошим местом для подобных вопросов (только что открыл его!).

person Hossam El-Deen    schedule 17.05.2018