Skip to main content

Система сборки

Цель и область применения

Этот документ описывает систему сборки, которая компилирует исходный код TypeScript в распространяемые JavaScript-модули для публикации в NPM. Он объясняет процесс компиляции, скрипты сборки, конфигурацию TypeScript, структуру выходных данных и настройку распространения. Информацию о структуре пакета и экспорте модулей см. в разделе Структура пакета. Подробности о системе реестра компонентов, которая обеспечивает установку отдельных компонентов, см. в разделе Реестр компонентов. Для деталей, специфичных для TypeScript, включая псевдонимы путей и генерацию типов, см. Конфигурация TypeScript.

Обзор конвейера сборки

Система сборки преобразует исходный код TypeScript в src/ в JavaScript-модули ES2022 с файлами объявлений в dist/, а также в генерируемые артефакты, которые поддерживают Tailwind CSS и инструменты сборки.
Источники: package.json21-28 tsconfig.json1-26 scripts/cva-extractor.ts1-339

Команды сборки

Система сборки предоставляет несколько npm-скриптов, определенных в package.json, для различных аспектов сборки и рабочего процесса разработки.

Основные команды сборки

Команды инструментов

Ручные скрипты сборки

Источники: package.json21-28

Процесс компиляции TypeScript

Компилятор TypeScript (tsc) преобразует исходные файлы из src/ в скомпилированные JavaScript-модули и файлы объявлений в dist/, используя конфигурацию, определенную в tsconfig.json.

Конфигурация компиляции

Компилятор TypeScript настроен в tsconfig.json1-26 со следующими ключевыми параметрами:

Псевдонимы путей

Компилятор разрешает псевдонимы путей во время компиляции:
Эти псевдонимы используются в исходном коде, но разрешаются в относительные пути в скомпилированном выводе. Источники: tsconfig.json4-24 Диаграмма 2 из высокоуровневой архитектуры

Структура вывода

Процесс компиляции генерирует структурированный вывод в каталоге dist/, который отражает структуру исходного кода.

Схема каталога распространения

Структура точки входа

Главная точка входа в src/index.ts1-32 определяет публичный API через серию экспортов:
Эта структура сохраняется в скомпилированном dist/index.js со всеми импортами, разрешенными в относительные пути.

Генерируемые типы файлов

Источники: src/index.ts1-32 tsconfig.json13-19 package.json31-37

Конфигурация распространения

Пакет настроен для распространения через NPM с помощью параметров в package.json, которые определяют, как скомпилированный код предоставляется потребителям.

Конфигурация экспорта модулей

Пакет определяет свои экспорты, используя современное поле exports:
Эта конфигурация:
  • main: Точка входа по умолчанию для CommonJS и старых инструментов
  • types: Расположение файла объявлений TypeScript
  • exports["."]: Современные условные экспорты для ESM и типов

Файлы распространения пакета

Поле files в package.json39-43 указывает, какие файлы включены в опубликованный пакет:

Метаданные пакета

Источники: package.json1-43 package.json67-69

Инструменты времени сборки

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

Экстрактор классов CVA

Скрипт scripts/cva-extractor.ts1-339 анализирует определения вариантов для извлечения CSS-классов, используемых библиотекой.

Реализация экстрактора

Класс SimpleCVAExtractor обрабатывает файлы вариантов:
  1. Обнаружение файлов: Рекурсивно сканирует src/core/variants/ для файлов .ts и .tsx
  2. Парсинг AST: Использует @babel/parser для парсинга синтаксиса TypeScript
  3. Обнаружение CVA: Находит вызовы функции cva() через обход AST
  4. Извлечение классов: Извлекает все строковые литералы из:
    • Базовых классов (первый аргумент)
    • Объектов вариантов (свойства второго аргумента)
    • Вложенных определений вариантов
  5. Дедупликация: Использует Set<string> для обеспечения уникальности
  6. Генерация вывода: Записывает JSON-массив из 618 классов

Генерируемый белый список классов

Экстрактор создает src/lib/core-classes.json1-624 со следующей структурой:
Этот белый список служит двум целям:
  1. Safelist Tailwind: Предотвращает удаление классов, генерируемых вариантами, при очистке CSS
  2. Конфигурация tw-merge: Обеспечивает безопасное слияние классов, генерируемых вариантами

Сканер реестра компонентов

Команда buildy-ui scan генерирует src/registry.json анализируя файлы компонентов на предмет метаданных, используемых системой установки отдельных компонентов. Подробности см. в разделе Реестр компонентов. Источники: scripts/cva-extractor.ts11-279 src/lib/core-classes.json1-624 Диаграмма 2 и Диаграмма 5 из высокоуровневой архитектуры

Артефакты сборки

Процесс сборки генерирует несколько зафиксированных артефактов, которые соединяют системы времени сборки и времени выполнения.

Сводка артефактов

Детали артефактов

Почему артефакты зафиксированы

Артефакты сборки зафиксированы в репозитории (в отличие от типичных проектов Node.js) по нескольким причинам:
  1. Готовность к NPM: Каталог dist/ может быть опубликован напрямую без необходимости выполнения шагов сборки потребителями
  2. Совместимость с подмодулями: Установки подмодулей Git могут использовать скомпилированный вывод без инструментов сборки
  3. Стабильность белого списка: Файл core-classes.json служит версионированным контрактом для конфигураций Tailwind
  4. Доступность реестра: registry.json обеспечивает установку отдельных компонентов без необходимости полной установки пакета
Источники: package.json39-43 src/lib/core-classes.json1-624 Диаграмма 5 из высокоуровневой архитектуры

Пример рабочего процесса сборки

Типичный рабочий процесс разработки включает последовательное выполнение команд сборки:

Полная последовательность сборки

Сборка для разработки

Для итеративной разработки выполните минимальную сборку:

Непрерывная интеграция

Конвейер CI/CD обычно выполняет:
Источники: package.json21-28

Зависимости и требования

Система сборки требует определенных инструментов и зависимостей для корректной работы.

Зависимости времени сборки

Зависимости времени выполнения

Они включены в пакет:

Одноранговые зависимости

Приложения-потребители должны предоставить: Источники: package.json48-66

Решение проблем сборки

Распространенные проблемы сборки

Шаги проверки

Для проверки успешной сборки:
Источники: package.json21-28 tsconfig.json1-26