Цель: быстрый DX без боли. Один набор инструментов для всех команд. Контекст: standards, repo-structure, ci-cd, гейты: quality-gates, наблюдаемость: observability, контракты: backend-contracts, дизайн‑система: anyui.
- Монорепа:
pnpm+ Turborepo с кэшом (локально и удалённо). - Сборка: Vite для приложений, tsup/rollup для библиотек.
- Шаблоны и генераторы:
packages/config/templates/*+ Plop/Hygen. - Кодоген: OpenAPI → SDK (см. backend-contracts).
- Тест‑набор: Vitest/RTL, Playwright, Storybook.
- SBOM/лицензии: CycloneDX + license‑checker — в CI как гейты.
- Node: LTS (фиксируем в
.nvmrcили Volta). - pnpm: 9.x (workspace в корне).
- TypeScript: strict (см. standards).
- Vite: для
apps/*. - tsup/rollup: для
packages/*(AnyUI, utils, SDK). - Vitest + React Testing Library, Playwright, Storybook.
Всё лежит в
packages/config/. Подключаем черезextends/алиасы.
eslint-config: единые правила (см. standards).tsconfig:tsconfig.base.json+ профили дляapps/packages.vite-config: функция‑фабрика для Vite с алиасами и SBOM баннером.jest/vitestпресеты,playwrightбазовый конфиг,storybookпресет.
Пример использования Vite-конфига:
// apps/web/vite.config.ts
import { defineAppViteConfig } from "@fsf/config/vite";
export default defineAppViteConfig({ appName: "web" });turbo.json (расширение):
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"lint": { "outputs": [] },
"typecheck": { "outputs": [] },
"test": { "outputs": ["coverage/**"] },
"build": { "dependsOn": ["^build", "typecheck"], "outputs": ["dist/**", ".next/**", "build/**"] },
"storybook": { "outputs": ["storybook-static/**"] }
},
"globalDependencies": ["tsconfig.base.json", "packages/config/**"]
}Удалённый кэш (по желанию):
# в CI/локально (env)
export TURBO_TOKEN=...
export TURBO_TEAM=fsfЭкономит минуты на сборках. Решение — через ADR, см. rfc-adr.
{
"scripts": {
"dev": "turbo run dev --parallel",
"lint": "turbo run lint",
"typecheck": "turbo run typecheck",
"test": "turbo run test",
"build": "turbo run build",
"storybook": "turbo run storybook",
"sbom": "cyclonedx-bom -o sbom.json",
"licenses": "license-checker-rseidelsohn --summary"
}
}Эти команды должны работать одинаково в любом приложении/пакете.
Где лежат: packages/config/templates/*
Чем генерим: Plop (просто) или Hygen (гибко). Выбираем и фиксируем в ADR.
Примеры заготовок:
feature: каркасfeatures/foo(ui/, model/, index.ts, stories, tests).entity: каркасentities/user.page: страница вpages/*+ роут + сторисы.widget: блок интерфейса (состояние/композиция).
Команды:
pnpm plop feature --name user-auth
pnpm plop page --name settingsШаблоны учитывают правила слоёв (см. arch-principles).
Билд‑правила:
- Код‑сплиты по роутам, динамические импорты для тяжёлых зон.
build.target = 'es2022',sourcemap: true(в staging),brotliSize: false(ускорение).optimizeDeps— списком (скорость dev).
Разделение чанков (пример):
// vite.config.ts (фрагмент)
build: {
rollupOptions: {
output: {
manualChunks: {
vendor: ["react", "react-dom"],
sentry: ["@sentry/react"],
}
}
}
}Порог бандла и Web Vitals — см. perf-budgets.
- AnyUI/utls/SDK публикуем как ESM + types.
- tsup для простоты; rollup если нужны финт‑настройки (external, объявления стилей).
tsup.config.ts (минимум):
import { defineConfig } from "tsup";
export default defineConfig({
entry: ["src/index.ts"],
format: ["esm"],
dts: true,
clean: true,
treeshake: true
});- Vitest: быстрые unit/component.
- Playwright: критические E2E (см. гейты в quality-gates).
- Storybook: MDX‑доки и визуальные тесты (Chromatic/скриншоты).
vitest.config.ts (фрагмент):
test: { globals: true, environment: "jsdom", setupFiles: ["./test/setup.ts"] }storybook/main.ts (фрагмент):
addons: ["@storybook/addon-essentials"],
framework: { name: "@storybook/react-vite", options: {} }- Генерим SDK из OpenAPI спеком в
packages/api-sdk(см. backend-contracts). - Локально используем MSW (mock‑server) с теми же контрактами.
- Контракт‑тесты (PACT) — опционально, через ADR.
- SBOM:
cyclonedx-bomгенеритsbom.jsonдля репы/приложения. - Лицензии:
license-checker-rseidelsohn→ отчёт об OSS лицензиях. - Эти шаги — обязательные в CI и гейтах (см. quality-gates).
Пример CI шага (псевдо):
- name: SBOM
run: pnpm sbom
- name: Licenses
run: pnpm licenses# Приложение
pnpm create app web # или скрипт Platform: pnpm -w plop app --name web
# Пакет
pnpm -w plop package --name anyui
# Запуск
pnpm i
pnpm devПосле генерации: проверь алиасы/кодоген/Storybook. Готово к работе, гейты и наблюдаемость подключаются из коробки.
- Инкрементальная проверка типов (
tsc --build). - Быстрые проверка/формат
eslint --cache+ Prettier. - Remote cache Turbo для тяжёлых сборок.
- Анализ бандла:
@bundle-stats/cliилиrollup-plugin-visualizer(репорты кидаем в артефакты CI).
- Никаких секретов в
.env.example(см. security-a11y). - Скан зависимостей и лицензий — в PR (SBOM/OSS отчёты — часть гейтов).
- Генераторы добавляют безопасные дефолты (aria‑атрибуты, токены AnyUI).
Ready: понятный сценарий (кому/зачем), измеримая метрика выигрыша (время сборки/регрессии). Done: шаблон/генератор опубликован, документация в этом файле обновлена, шаги в CI добавлены, метрика улучшилась.
- Основа: standards · repo-structure
- Платформа: ci-cd · observability · anyui · backend-contracts
- Процессы: quality-gates · rfc-adr