PassFront
  1. PassFront
  2. База знаний
  3. Компоненты

Как вынести компоненты чтобы использовать их в другом проекте?

Компоненты

Чтобы компоненты жили в нескольких проектах, их выносят в отдельную библиотеку — вопрос в упаковке, сборке и дистрибуции.

Шаг 1: подготовить компоненты к выносу

  • Убрать привязки к проекту: никаких импортов из его сторов, роутера, конфигов — всё внешнее приходит через props (данные, колбэки) или контекст-провайдеры библиотеки.
  • Изолировать стили (CSS Modules, vanilla-extract, tailwind-пресет) и токены темы.
  • Определить публичный API: один entry point (index.ts) с явными экспортами.

Шаг 2: оформить пакет

{
  "name": "@company/ui",
  "exports": { ".": { "import": "./dist/index.js", "types": "./dist/index.d.ts" } },
  "peerDependencies": { "react": ">=18" },
  "sideEffects": false
}
  • Сборка в library mode (Vite lib mode / tsup): ESM (+CJS при необходимости), без бандлинга React — он в peerDependencies, иначе у потребителя окажется два React (ломаются хуки).
  • Генерация типов (d.ts), tree-shaking-дружелюбность.
  • Документация — Storybook; тесты — Vitest + Testing Library.

Шаг 3: способ дистрибуции

  • Монорепо (pnpm workspaces + Turborepo/Nx) — если проекты в одном репозитории: мгновенные изменения без публикации. Лучший DX.
  • npm-пакет в приватном registry (GitHub Packages, Verdaccio) — для независимых репозиториев: версионирование (semver + changesets), CI-публикация.
  • Быстрый вариант — установка из git по тегу; осознанное копирование исходников — путь shadcn/ui (кастомизация важнее синхронизации).

Коротко для собеседования

Вынести в пакет: очистить компоненты от проектных зависимостей (всё через props/провайдеры), собрать в lib mode с типами и react в peerDependencies (иначе два React), документировать Storybook'ом; распространять через монорепо-workspace (если репо общее) или приватный npm с semver-версионированием.

Другие вопросы раздела