Как изолировать модуль администратора от всего сайта на Angular?
У меня сейчас есть общий app Module для всего проекта и lazy loading для каждого url, в том числе там есть и url администратора.
Так как приложение расширяется - я хочу как-то на самом начальном уровне отделить - обычный ли это пользователь либо администратор, и если он администратор, то не грузить ненужные модули из app Module и лишь потом идти по lazyLoad конкретно модуля для ссылки.
У меня хранится параметр в localstorage - админ это либо юзер, а на случай "взлома api" всёравно сервер не ответит на админские данные, если пользователь не будет админом.
Суть в том, что новый сайт я написать не могу, так как заказчик решил на одном сайте делать и админов и пользователей, но мне хочется изолировать вообще 2 этих сущности и сделать модули админки максимально быстрыми, без лишних данных и всяких Shared модулей из обычного функционала сайта.
Фактически сайт с нуля, но внутри текущего(Может как-то в bootstrap сразу при загрузке не грузить appModule а грузить AdminModule в котором совершенно другая инфраструктура)
Собственно вопрос- как это реализовать, что б без косяков и что б полностью изолировать 2 сайта, при этом, что б сборка была одна ?
Антон Швец Спасибо большое, очень полезная инфа- натолкнули на мысли. Начал копать в этом направлении.
Скажите, у меня вопрос- в чём отличие, если я сделаю 1 главное приложение и вложу в него приложение Admin и User(например) или если я сделаю одно приложение и appModule сделаю чистым и там сделаю роутинг по типу, если /admin/** то на роут админа, а если не подходит, то пускаю на модуль юзера, а в юзер модуль фактически кидаю текущий сайт. И все сервисы пишу не injected root, а UserModule. И в него же все Shared модули. В итоге тогда разгружается от Shared модулей и сервисов appModule и если идёт направление на админа, то чанк при загрузке будет чистым от ненужного здесь кода.
Правильно я понимаю? И вопрос тогда - в чём разница если несколько application будет либо если одно, но с промежуточным модулем для роутов и разделения?
(Суть в том, что на текущем сайте много кода, он неоптимизирован и его нужно отделить от кабинета администратора, иначе этот код будет только разростаться и будет грузиться везде где не надо.)
Спасибо за Ваш ответ.
Роман Ракзин,
1. вложенные приложухи можно запускать отдельно, а не в составе всей йолки. providedIn: root работает на уровне одного приложения, хочешь глобально надо providedIn: platform (но это не точно, я давно не проверял).
providedIn: root сервисы вшиваются в бандл, только если они используются. Если используются в нескольких лейзи, то такие выносятся в маленькие бандлы либо остаются в main, на усмотрение сборщика. Как-то руками это менеджить не надо.
2. Для одного приложения сервисы надо все в рут или в компонент, нет смысла провайдить их в модуль.
Компоненты декларируются и экспортируются в своих маленьких модулях. Эти модули импортируются по месту применения. Но не в AppModule.
3. В AppModule испортируются только forRoot от либ, которые иначе не могут. Вот они точно войдет в состав всего приложения, если оно будет одно. Плюс какие-то глобальные модули с сервисами, типа HttpClientModule. ВСЕ ОСТАЛЬНОЕ импортируется по месту и включается в бандл только там, где оно пригодится.
Вам следует начать с дробления Shared модулей на мелкие части и убирания из них сервисов, если таковые есть. Что грузить ангуляр сам разберется, только canLoad гвард вставьте, чтобы модуль не загрузился сразу при обращении, без проверки.