Комментарии 16
А эта статья задумывалась больше как описание подхода — так можно работать и над библиотекой UI-компонентов, и над библиотекой других сущностей, которые шарятся между проектами.
Кстати, насчет кода… мои коллеги делились некоторыми наработками, сделанными во время работы над библиотекой. Возможно вам будет интересно:
- ControlValueAccessor и contenteditable в Angular (код описанного пакета лежит на GitHub)
- Оптимизация обработки событий в Angular
По вашему опыту, насколько реально автоматизировать и поддерживать актуальным список проектов, в которых используется тот или иной компонент?
Думаю, об этом можно написать отдельную статью.
Тут на неделе Денис Колесников из Авито рассказывал, какой у них Data Science навернут для этого. Рекомендую. Интересующая тематика начинается примерно с 2:14:00.
http://longestjs.org/#talk-01
Я так понимаю, у вас только Angular компоненты. А что делаете с мажорными обновлениями фреймворка? Поддерживаете несколько версий библиотеки или обновляетесь все разом?
Если говорить о библиотеке компонентов, описанной в статье, то да, это именно Angular. Но в целом в компании есть и реализация дизайн-системы для проектов на React.
> А что делаете с мажорными обновлениями фреймворка? Поддерживаете несколько версий библиотеки или обновляетесь все разом?
Библиотеки на Angular 6/7 совместимы с приложениями на Angular 6/7/8 (более старых версий фреймворка у нас нет). Мы не поднимаем версию Angular немедленно после выхода мажорной версии фреймворка, т.к. это не требуется для приложений-пользователей на свежем Angular, но помешает приложениям на более старом.
Со временем, поднимая версию Angular в библиотеке, будем увеличивать мажорную версию самой библиотеки.
Что касается обновления всех приложений разом, мы стараемся не запускать и обновляться быстро, но когда приложений несколько десятков, и работают над ними разные команды, то обновить всё одновременно затруднительно, даем командам время.
Не думали о реализации общих компонент на одном из легковесных фреймворков типа $mol или Svelte, чтобы использовать их в приложениях на любом фреймворке, а не реализовывать их отдельно для Ангуляра, отдельно для Реакта, отдельно для <что там будет в моде через год>?
- Так можем в полную меру использовать возможности фреймворка.
- Разрабатывать проще, потому что есть экспертиза в Angular. И наоборот, работая над китом, разработчики кита еще сильнее прокачиваются Angular и дают ценные советы коллегам из других команд.
- Разработчики из команд-пользователей могут присылать пулл-реквесты. У нас есть выделенная команда для поддержки кита, но мы поддерживаем и «внутренний open source». Для других ребят это возможность быстрее занести свои изменения и попробовать новый вид задач, не похожий на то, что делают в своем проекте.
Если бы кит внутри был основан на другом легковесном фреймворке или даже написан на чистом JS, развивать и поддерживать его было бы сложнее. Да и легковесный фреймворк так же может выйти из моды через год.
Перед нашей командой сейчас стоит похожая проблема: как донести до потребителей (разработчиков из других команд) подробную информацию обо всех имеющихся в библиотеке компонентах, их свойствах, примерах использования, и так далее.
- Примеры, которые уж точно не автоматизировать. Там мы показываем несколько особенных примеров использования, покрывающие основные нужды пользователей. Часто, разработчик копирует оттуда код, как отправную точку, близкую к тому, что ему нужно.
- Интерактивная документация. Тут лежит компонент и показаны все его инпуты, значения которых можно покрутить и сразу увидеть эффект.
- Инструкция по подключению. Тут для большинства страниц примерно одно и то же, подключаем модуль, вставляем в шаблон.
У разработчиков такая витрина пользуется большой популярностью. В ней есть разделы и поиск, кроме того «натыканные» входные данные со страницы документации сохраняются в URL так что можно передавать друг другу ссылки сразу на готовое состояние компонентов. Кроме разработчиков, витрина полезна технологам и дизайнерам проектов, чтобы видеть что уже можно переиспользовать и какие возможности уже есть у тех или иных компонентов.
То есть без ручной работы всё же не обойтись.
Мы когда-то использовали ExtJS и у нас было своё подобие Sencha Kitchen Sink как раз для этих целей, но её приходилось пополнять и поддерживать вручную одному человеку.
Теперь пишем на Lightning Web Components и возникла необходимость собрать нечто подобное Lightning Strike от Appiphony, однако на этот раз хочется заавтоматизировать всё это донельзя. Поэтому интересно знать как это сделано у других, чтобы не наступать на те же грабли.
Статистику использования собираем полностью автоматически с помощью самописного решения, которое анализирует код шаблонов продуктовых проектов.
В первой версии получали только сам факт использования компонента. Сейчас дорабатываем новую версию, которая дополнительно сохраняет и какие параметры компонентов (inputs, outputs) используются, какие значения в них обычно передаются, умеет выявлять некоторые неправильные использования параметров (например,
someInput="true"
вместо [someInput]="true"
).Подробности технической реализации, кажется, тянут на еще одну статью.
Дополнительно из package.json и package-lock.json берем информацию о версии библиотеки, TypeScript и Angular. Это вообще реализуется элементарно, а планировать обновления и следить за состоянием фронтенда в целом помогает очень и очень сильно.
Вы главное скажите: вы до сих пор разделяете поля в форме не отступами в стилях, а с помощью <br>
, как на одной из первых картинок поста?
Как организовать работу над библиотекой общих компонентов