Перейти к содержимому

Структура пакета

lh-ui-share/
├── src/
│ ├── core/ Слой чистых функций компонентов (без импорта фреймворков, гейт CI grep)
│ │ ├── <компонент>/ Тройка logic.ts / types.ts / index.ts
│ │ └── shared/ Общее ядро для компонентов (12 модулей, унифицированы в виде <name>/index.ts)
│ ├── theme/ TS-сторона темы: types + 5 пресетов + runtime-примитивы
│ ├── constants/ Константы LH_* (LH_SIZE_DEFAULT / LH_LANGUAGE_DEFAULT …)
│ ├── locales/ LhLocale (чистый emitter) + lang/ — скелеты шести языков
│ ├── types/ Публичные типы (locale / components)
│ ├── utils/ Чистые утилиты (createNamespace / deepMerge …)
│ └── index.ts Полный агрегированный вход
├── styles/ Единственный источник BEM-стиилей компонентов
│ ├── <компонент>/index.scss 58 наборов компонентных стилей
│ └── theme/
│ ├── common/
│ │ ├── var.scss Светлые токены (:root, 185 переменных --lh-*)
│ │ ├── var-dark.scss Тёмное переопределение ([data-theme='dark'], .dark, 118 записей)
│ │ ├── variables.scss 183 SCSS-переменные $lh-* (!default)
│ │ ├── patterns.scss 6 mixin-ов узоров в китайском стиле
│ │ ├── transition.scss Три mixin-а переходных классов (собирают различия двух платформ)
│ │ └── a11y.scss Вспомогательные стили доступности
│ └── index.scss Агрегация темы
│ └── index.scss Полная агрегация (токены + все компоненты; генерируется скриптом, не править руками)
├── tests/unit/ Единственный экземпляр unit-тестов core (используется тремя библиотеками, копировать не нужно)
├── scripts/ Скрипты сборки и проверки
├── docs/ Этот сайт документации (Astro Starlight)
└── .changeset/ Готовые к публикации changeset-ы
Каталог Ответственность Красная линия
src/core/<name>/ Чистые функции компонента: вычисление классов / конечные автоматы / набор aria-атрибутов Запрещены import 'vue' | 'react' | '@dcloudio/*'
src/core/shared/ Ядро, общее для компонентов; напрямую используется на всех платформах То же; унифицировано в виде <name>/index.ts
styles/ Единый источник BEM-стиилей компонентов Запрещено копировать стили в UI-библиотеку и править их там; классы lh-*; цвета — только через var(--lh-*, fallback)
tests/unit/ Единственная копия unit-тестов core UI-библиотеки не должны копировать
scripts/ extract-from-plus (одноразовый) / build-styles / verify-* / release —

Оба числа верны — просто измеряется разное:

Методика Число Источник
Компоненты с чистыми функциями core 56 Каталоги компонентов в src/core/ (без shared/)
Наборы компонентных стилей 58 Каталоги компонентов в styles/ (без theme/)

Разница возникает из-за трёх случаев:

Имя core styles Причина
layout — ✅ Контейнер разметки, логика полностью в слое UI (реактивная разводка брейкпоинтов row/col)
tree-select — ✅ Клей селектора на стороне фреймворка; логика древовидных данных переиспользуется из core/tree
config ↔ config-provider config config-provider Одно и то же под двумя именами каталогов

pnpm build создаёт четыре каталога, и files публикует только их:

Артефакт Структура Описание
es/ preserveModules, зеркально повторяет src/ ESM, пофайловый импорт по подпутям
lib/ То же CJS (условие require)
dist/ dist/theme/*.css dist/styles/index.css Агрегированные стилевые артефакты
styles/ Публикуется как есть SCSS-исходники для самостоятельной компиляции в проектах

Артефакты остаются независимыми от фреймворков: verify:dts сканирует es/**/*.d.ts, и появление любого импорта фреймворка приводит к неудаче.

Как выглядит артефакт одного компонента (на примере button)

Заголовок раздела «Как выглядит артефакт одного компонента (на примере button)»
es/button/
├── index.d.ts Типы
├── index.js ESM
├── logic.d.ts
├── logic.js
├── types.d.ts
└── style/
├── index.css Скомпилированные стили компонента (форма, как на платформе plus)
└── index.scss Исходники (@use переписан в bare specifier, распространяется вместе с артефактами)

lib/button/ имеет ту же структуру. UI-библиотеки двух платформ оборачивают это ещё одним слоем es/components/<name>/style/index.css (платформа vue2 публикует только css, без scss).

Copyright © 2024-2026 FengMo WenXue