Web Components with Angular

Web Components with Angular

А вот и Ангуляр подоспел со своими Web Компонентами. Как мне этого не хватало. Именно из-за отсутствия возможности пилить маленькие компоненты для html а не монолитное монструозное Web Приложение делало ангуляр непригодным для использования на простых сайтах. Но не прошло и 10 лет как дошли у разрабов руки и до простых web компонентов. С удовольствием буду следить и по возможности пробовать эту фичу.

Вот интересная статья
https://medium.com/@IMM9O/web-components-with-angular-d0205c9db08f
и видосики

Открытым остается вопрос взаимодействия между компонентами на странице и доступ извне к компоненту.
А также интересно как будут уживаться такие отдельные компоненты если их будет много. Насколько я понимаю сейчас такой отдельный компонент тянет с собой полностью ангуляр.
Интересен также процесс разработки. Насколько я понял ng cli позволяет вести разработку одного компонента, а если необходимо разрабатывать и дебажить компоненты во взаимодействии?
Буду разбираться с этими вопросами!

Сегодняшний день один из немногих который прошел не зря!

Покопался я с этим вопросом и как всегда Ангуляр оказался на высоте. Не устаю повторять что он просто читает мои мысли и делает то о чем я только собираюсь подумать (в отличии от того же Vue, который просто тупой как валенок и всегда "моя-твоя не понимать").

В общем замутил небольшой тестовый проектик в котором даже немного вышел за рамки разумного

Сделал стандартный проект с двумя отдельными компонентами, и общим сервисом через который шарятся переменные и функции. Добавил инструкции для выноса компонентов как отдельные элементы и раскидал их на странице. Так же просто выкинул саму аппу как раньше хотя по инструкции ее следовало убрать (это из неразумного).

Получился вот такой зверь

<!doctype html>

<html lang="en">
<head>
<meta charset="utf-8">
<title>Demo1</title>
<base href="/">

<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
<p>------------------------</p>
<app-message name="dj" answer="yes"></app-message>
<app-box></app-box>
<app-message name="djdsdd" answer="yes"></app-message>
</body>
</html>

где
app-root - это обычное ангуляр приложение как мы привыкли использовать
app-message и app-box компоненты проброшенные во вне как custom elements.
Видно что их можно использовать в любой последовательность и количестве.
Так же заработало и само приложение, ХОТЯ наши компоненты начали рендериться 2 раза что в принципе логично.
НО что самое приятное - расшаренный сервис остался общим для всех (и для приложения и для компонентов).

Из нюансов - приложение по умолчанию собирается в один бандл и чтобы использовать один из вынесенных компонентов придется подкдючать на страницу весь бандл. Но теперь это не проблема так как продакшен версии бандла уже давно упаковываются в сотни килобайт. Так же есть методики делать отдельные бандлы под каждый компонент, но я пока не постиг этот дзен и не уверен пока что это мне надо. То что показал Ангуляр сегодня я ДАВНО ждал и это выглядит именно так как я себе представлял!!!!

Dmitry Shnyrev
Покопался я с этим вопросом и как всегда Ангуляр оказался на высоте.

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

Но в целом, если бы я работал не на force.com платформе, angular бы оставался #1 фреймворком

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

Тебя, Маским, учить не собираюсь , но вот пара моих наблюдений:
- никакой логики в процессе отображения! Если нужно показывать какие-то динамические данные, то все рассчитывать заранее в отдельные структуры, или лучше даже непосредственно в самом объекте. К примеру надо показать лист контактов в которых будет какое-то вычисленное значение. Вычисляем это значение сразу после получения из бэкенда и сохраняем в специальное поле сразу в том же контакте.
- никаких ng-show. Благо во втором ангуляре их убрали, оставив только [hidden] как бы все равно намекает что это зло.
- никаких огромных таблиц. Пагинация везде и во всем. Даже на фронтенде. Работаем с небольшими пачками для отображения.
- везде где есть асинхронные задачи показываем спинер, чтобы у пользователя не создавалось непряитного чувства что что-то тормозит.

А на счет первого ангуляра. Да, с ним разработка удобнее! И даже еще удобнее если применить кое какие техники, но вот я стал замечать что пара месяцев на новом ангуляре и возвращение к первому становится болезненным и долгим. Нах тогда себя мучить!?

На счет Lightning! Как не обидно но стоит признать что для SF он номер один для сегодняшней разработки. Но я уже долго не работаю с Salesforce и писал скорее про Out-of-Salesforce разработку.

Dmitry Shnyrev
никакой логики в процессе отображения! Если нужно показывать какие-то динамические данные, то все рассчитывать заранее в отдельные структуры, или лучше даже непосредственно в самом объекте. К примеру надо показать лист контактов в которых будет какое-то вычисленное значение. Вычисляем это значение сразу после получения из бэкенда и сохраняем в специальное поле сразу в том же контакте.

ну это же нереально. эта часть может работать только в каком либо ооооочень простом варианте. в больших приложухах - врядли ты сможешь обойтись без ifelse для определнных кусков.
Dmitry Shnyrev
никаких огромных таблиц. Пагинация везде и во всем. Даже на фронтенде. Работаем с небольшими пачками для отображения.

с этим я полностью согласен, только вот заказчики не согласны)
Dmitry Shnyrev
- везде где есть асинхронные задачи показываем спинер, чтобы у пользователя не создавалось непряитного чувства что что-то тормозит.

ну и тут это не сработает, потому что при рендере чего-то очень большого подвешивался браузер

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

но как я и говорил раньше
ангуляр(и первый и второй, без разницы особо) для меня #1 для разработки вне SF

Maxim Elets
ну это же нереально. эта часть может работать только в каком либо ооооочень простом варианте. в больших приложухах - врядли ты сможешь обойтись без ifelse для определнных кусков.

Про if/else понятно что без них никак. Но я немного другое имел в виду - бывают вот такие случаи:
<div *ngFor="let contact of contacts">

<div>{{calculateMeSomethingBig(contact)}}</div>
<div>

где calculateMeSomethingBig() - метод который вычисляет что-то из контакта.
Вот это зло про которое я писал - логика в отображении.
Если немного подебажить то можно заметить что при перерисовке ангуляр может по нескольку раз пройтись в этом цикле и ресурсы на вычисления будут увеличиваться в разы.
Я просто предлагаю делать эти расчеты заранее в коде один раз где точно понятно сколько раз будут пройден цикл и заменить вывод вот так
<div *ngFor="let contact of contacts">

<div>{{contact._alreadyCalculatedValue}}</div>
<div>

Вывод статического значение займет существенно меньше времени чем использование функции.

Соглашусь что предварительная калькуляция усложняет структуру и понимание проекта, но чем то придется жертвовать.

Интересная информация? Помогите сайту, разместите ссылку в социальных сетях..