Shared Module - любимый антипаттерн angular разработчиков. Как он влияет на размер бандла?

  Рет қаралды 3,303

Максим Гром

Максим Гром

Күн бұрын

Пікірлер: 39
@ArtyomManokhin
@ArtyomManokhin Жыл бұрын
Единственное, о чём жалею, это о том, что это видео не вышло раньше. Спасибо
@Користувач-в4ъ
@Користувач-в4ъ Жыл бұрын
Всё очень круто! Но хотелось би какой-то проект с регистрацией, сохранением состояния, типа магазина или какой-то админки, чтобы посмотреть как в работе всё выглядит, на реакте таких видео полно, а вот с ангуляром проблемы(! Спасибо за уроки
@konstantinkuksov914
@konstantinkuksov914 Жыл бұрын
с помощью standalone и lazy loading уменьшили бандл на проекте с 58 Мб до 4 Мб, цифра не финальная, еще работаем :) Спасибо за видео, за это и за все другие по Ангуляру :) Контент уникальный и полезный :)
@grommaks
@grommaks Жыл бұрын
😮 шикарный результат, если гугл рейтинги важны, то я думаю сайт позеленел знатно 😄
@konstantinkuksov914
@konstantinkuksov914 Жыл бұрын
@@grommaks важны, но пока релиза еще не было :)
@trash2trash
@trash2trash Жыл бұрын
ВОобще тема об анализе размера бандла, интересная.
@VictorKorovin-s9q
@VictorKorovin-s9q Жыл бұрын
Очень круто, не думал что так можно. Контент супер, продолжай в том же духе)
@antoniochili2545
@antoniochili2545 11 ай бұрын
Хорошее объяснение, спасибо!
@mikhailp3088
@mikhailp3088 Жыл бұрын
Красавчик, раскидал по полочкам, как надо
@unknownunknown-p3n
@unknownunknown-p3n Жыл бұрын
Интересное видео. Не совсем понятно какой смысл измерять размер бандла в dev режиме. В prod сборке Ivy и tree shaking решает все проблемы кроме взаимодействия с командой по поводу обновления shared компонентов.
@СергейКорнев-э5у
@СергейКорнев-э5у 8 ай бұрын
Спасибо)
@polosatyj777
@polosatyj777 11 ай бұрын
показал бы результаты оптимизации после три-шейкинга в прод моде.
@mtvspec
@mtvspec Жыл бұрын
Все shared компоненты собираются в отдельный бандл 'common.js', который подгружается при переходе в lazy компоненты, при этом, не lazy shared компоненты идут в 'main.js' бандл.
@grommaks
@grommaks Жыл бұрын
Интересно) Когда буду ковырять роутинг сделаю пример чтобы увидеть своими глазами :) Есть мысль что если подключить в AppComponent SharedModule то бандл пойдет в main а не в common
@mtvspec
@mtvspec Жыл бұрын
@@grommaks Если под SharedModule подразумевается компонент, то да, он пойдет в main.js, если используется в разметке или классе, и подключается как eager, а те, которые подключаются как lazy пойдут в common.js. Другими словами, shared ComponentA пойдет в main.js, импортированный в eager модуль, a shared ComponentB пойдет в common.js, если используется в LazyModuleA, при этом shared ComponentC (допустим, он испортирован в LazyModuleB), тоже будет в common.js. Common.js с компонентами B и C, один раз подтянется при переходе в любой из Lazy модулей, в которые они импортированы. Получается из main.js можно все "перенести" в common.js, а дальше пойдут lazy чанки.
@grommaks
@grommaks Жыл бұрын
@@mtvspec до ivy это вроде работало не так, надо проверить:)
@MihailGrib
@MihailGrib Жыл бұрын
Сделал шаред модуль с двумя компонентами A и B, подключил его в app и в lazy, из шареда в app A компонент использую, B в компоненте задекларированной в Lazy, common.js не появился, при переходе на lazy роут, грузится только этот модуль. class SharedModule вкомпилился в main, в src_app_layzy_module_ts только ссылки на него вида _shared_module__WEBPACK_IMPORTED_MODULE_0__.SharedModule
@mtvspec
@mtvspec Жыл бұрын
@@MihailGribЯ делал все standalone компонентами, не использовал классические модули.
@EtoBARAKUDAvasa
@EtoBARAKUDAvasa Жыл бұрын
Все, що не використовується не повинно бути імпортоване в той чи інший модуль - це очевидні речі. Я теж проти цього патерну, особливо коли туди засунуть якийсь MaterialUI за всіми його модулями компонентів...
@eugenenovikov671
@eugenenovikov671 Жыл бұрын
Честно ни разу в работе не видел такого, мы всегда импортировали из своей шаред либы только то, что нужно. А почему три шейкинг не отсеивает незаюзанные молули при сборке?
@grommaks
@grommaks Жыл бұрын
До ivy не откидывали, с ivy нужно мне поэкспериментировать, не думаю что во всех сценариях будет хорошо работать На текущем проекте shared и NX monorepo сильно замедляет скорость деплоя
@user-san-chous
@user-san-chous Жыл бұрын
Интересно, а при создании модуля для каждого компонента вместо standalone, насколько строк изменится бандл. Видел такую рекомендацию, мол это норм подход (но видимо сейчас уже не очень актуально). А по поводу lazy loadinga никогда не тестил, но верил почему-то, что второй раз при роутинге ранее загруженные модули (тот же shared, родные модули) второй раз грузится не будут...
@grommaks
@grommaks Жыл бұрын
Angular собирает общие модули в бандл и грузит их один раз, по этому это точно :) Stand-alone придумали чтобы такие модули убрать, и возможно скоро еще больше можно будет делать, но пока я вижу такое вот применение 🫣
@PavelIshmukov
@PavelIshmukov 8 ай бұрын
объясните пожалуйста а зачем в таком случае делать все компоненты standalone, если можно их сделать обычными компонентами и записывать их в папку declarations а не imports, в чем разница?
@grommaks
@grommaks 8 ай бұрын
Во первых это модно :) Во вторых можно потом удалять не используемый компонент с папки и все его зависимости автоматически будут убраны, так как он сам себя описывает. С 10 компонентов уже не понятно зачем столько импортов и какие можно удалить В третьих, это новый подход и команда ангулар работает над новыми возможностями, например host directive доступна если она standalone
@PavelIshmukov
@PavelIshmukov 8 ай бұрын
@@grommaks спасибо, очень ждем новые выпуски!)
@diatm1506
@diatm1506 Жыл бұрын
Я испоьзовал shared один раз и уже тогда понял что это не к чему хорошему не приведет. У меня структура папок почти как в nestjs. Но на хабре говорили что бандл или билд не помню может разростись)Но у меня lazy load в routinge
@grommaks
@grommaks Жыл бұрын
Мне не сильно везет на новые проекты А на легаси shared есть почти везде, даже презентации делать приходится, чтобы обосновать что shared это плохо)
@diatm1506
@diatm1506 Жыл бұрын
@@grommaks хм интересно если использовать Webpack Bundle Analyzer будет ли существенная разница в размере бандла до и после? Components vs module vs module + предзагрузка модулей
@grommaks
@grommaks Жыл бұрын
@@diatm1506 в комментах пишут что ivy в ангулар в прод билд много чего оптимизирует Возможно ivy будет достаточно для работы, но я планирую потестить
@MihailGrib
@MihailGrib Жыл бұрын
ну допусти для lazy роутов не использовать Shared Module обосновано. А если их нет, и в большинстве компонент используются модули допустим с материала, что тогда будет в бандле? Или например как ведет себя шаред с библиотеками, когда у нас есть много энтри поитов и в каждом есть зависимость на шаред, если я не ошибаюсь в конечной js ки для энтри поита вкомплилится только то что импортировалось из шареда, а не весь шаред, если я не прав, поправите плиз. Не заводить шаред обосновано если в проекте все лезийно грузится, либо по какой то причине много зависимостей из него не используется.
@grommaks
@grommaks Жыл бұрын
Если нет ленивых модулей, то проект реально маленький Из примера в видео, даже если я не пользовался компонентом ни где, он попал в бандл Получается, модуль shared который подключает много всего из Material, а также подключает свои модули и компоненты затянет все это в конечный размер бандла Если в проекте условно matTable больше не используется, а он подключен в shared, то он попадет в бандл, аналогично будет с устаревшими компонентами и модулями в проекте Это называется treeShaking, на примере сервисов, которые providenIn root, если этот сервис удалить со всех компонентов, то он удалится из бандла, потому что его отдельно в shared не надо было регистрировать, и подчищать не нужно его Надеюсь не запутал)
@MihailGrib
@MihailGrib Жыл бұрын
@@grommaks Вообще не приятно что treeShaking не удаляет с шареда модули или еще что, компоненты которых или что то еще не используется( Если в разных стендалон компонентах используйся одинаковые зависимости сборщик вкомпилит их только один раз в общий банл, если компоненты не лейзи? Если лейзи то наверное тогда в каждом будет по вкомпиленой зависмости что не айс, в идеале бы взять вынесли все зависимости компонент в отдельный чанк и загрузить его вначале, а на него уже пусть ссылаются компоненты , иначе получается каждая компонента будет много весить если у нее много импортов, конечно это проблема решается прелоадам лейзи модулей или компонент, но все равно не айс если каждая стендэлон компонента будет тянуть в себе пол ui либы
@grommaks
@grommaks Жыл бұрын
@@MihailGrib не не, ангулар соберет common бандл для всего что общее, не будет много раз грузить одно и то же Говорят tree shaking есть если выключен ivy, и shared уже не такая большая проблема, но это надо проверить :)
@malyna
@malyna Жыл бұрын
До Ivy це була проблема і ліпили таку штуку як SCAM паттерн, але це уже не актуально, тому розберіть для себе добре як працює tree shaking The Angular Ivy renderer, that replaces the now deprecated View Engine, has good support for tree-shaking and lazy loading components. It will not include unused components even if they are imported and exported in your SharedModule. In addition, it will move components into lazy loaded chunks even if other components of the same module are used in your main bundle.
@grommaks
@grommaks Жыл бұрын
Дякую за доповнення, треба спробувати увімкнути ivy
@grommaks
@grommaks Жыл бұрын
Але я тут не договорив у відео, ще е така штука як NX monorepo, так ось shared module там дуже сильно сповільнює білд Тому ivy гарна штука, але не вирішує усіх проблем з shared
iPhone or Chocolate??
00:16
Hungry FAM
Рет қаралды 46 МЛН
How To Get Married:   #short
00:22
Jin and Hattie
Рет қаралды 25 МЛН
Как подписать? 😂 #shorts
00:10
Денис Кукояка
Рет қаралды 8 МЛН
Брутфорс пароля на python
10:31
IT DIGITAL PROGRESS
Рет қаралды 661
iPhone or Chocolate??
00:16
Hungry FAM
Рет қаралды 46 МЛН