Архитектура

  • Оценка

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

Посчитано на сборке по @feugene/granularity 1.1.1

На этой странице
84
компонентов ядра
149
путей экспорта
0
runtime-зависимостей у ядра
12
пакетов в семействе

Почему группы каталога — не границы пакетов

Каталог делит компоненты на группы — «Действия», «Формы», «Данные», «Навигация», — и группы выглядят готовыми границами пакетов. Они ими не являются: группы отвечают на «где искать компонент», а граф зависимостей — на «кто кого рендерит», и эти два вопроса не совпадают.

92
рёбер графа рендера
61 (66%)
из них пересекают границы групп
4
глубина графа
36
компонентов без зависимостей

Рёбра, пересекающие границу групп

Из чего собрано всё остальное

Разрежьте пакет по группам, и эти компоненты окажутся в каждом куске — или за peer-зависимостью каждого куска.

  • GrIconДанныерендерят 15 раз
  • GrButtonДействиярендерят 15 раз
  • GrSkeletonОбратная связьрендерят 7 раз
  • GrInputФормырендерят 6 раз
  • GrChipДанныерендерят 4 раз

Каждое число этого раздела посчитано по установленному пакету: зависимости — из granular-провайдера, группы — из реестра. Документ библиотеки приводит тот же аргумент, снятый на более старой версии, — ровно поэтому эта страница мерит, а не цитирует.

Как импорт доходит до бандла

Гранулярность — не обещание про tree-shaking, а форма пакета: подпуть на компонент, entry на подпуть и манифест, в котором записано, какой CSS нужен каждому компоненту.

  1. Вы импортируете подпуть
  2. сборщик берёт его entry и его граф
  3. granum читает манифесты пакетов и забирает CSS перечисленных компонентов и их зависимостей
  4. движок утилит эмитит утилиты ровно для этих классов, и ни для каких других

Ядро и спутники

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

Это и есть единственное условие пересмотра решения «пакет один»: у семейства компонентов появляется тяжёлая внешняя зависимость, не нужная остальным. Ровно поэтому уехали графики, даты, редактор, медиа и дашборд.

  • @feugene/granularity-chrono
  • @feugene/granularity-media
  • @feugene/granularity-charts
  • @feugene/granularity-code
  • @feugene/granularity-dashboard
  • @feugene/granularity-editor
  • @feugene/granularity-forms-schema

Где библиотека заканчивается

Это не фреймворк приложения. Маршрутизация, загрузка данных, состояние и сборка — ваши; дизайн-система даёт компоненты, основы и конвейер, который их связывает, — и намеренно на этом останавливается.

Дальше

Полный разбор с историей решения — в репозитории библиотеки.