Статьи в категории "Веб-технологии"

Показаны статьи из категории "Веб-технологии".

Фильтры статей

Структура для разных частей стека & Фундаментальные принципы организации

Структура для разных частей стека & Фундаментальные принципы организации

9 0 0.0 0
1
Категории: Технологии IT и программирование Языки программирования Веб-технологии

🧱 Фундаментальные принципы организации

Прежде чем перейти к папкам, важно понять ключевые идеи, лежащие в основе любой хорошей структуры:

  • Разделение ответственности (Separation of Concerns): Код разбивается на слои с четкими задачами. Например, слой представления (UI) не должен знать, как работает слой доступа к данным (DB). Это делает систему гибкой и тестируемой.

  • Feature-First (Предметно-ориентированная) vs. Type-First (Тип-ориентированная) структура: Вместо группировки файлов по их технической роли (components/hooks/utils/), feature-first подход группирует все файлы, относящиеся к одной бизнес-функции (например, profile/checkout/), в одном месте. Это значительно упрощает навигацию и поддержку в больших проектах.

  • Масштабируемость (Scalability): Структура должна легко позволять добавлять новые функции, не ломая старые, и быть понятной для новых членов команды.

 

📁 Структура для разных частей стека

1. Backend: Express.js, Hono, Fastify

Для серверной части (API) хорошо зарекомендовала себя многослойная архитектура. Вот как она выглядит на практике.

Общая идея (Layered Architecture):

text
src/
├── config/           # Конфигурации (env, БД, логирование)
├── modules/          # Фичи/модули (feature-first подход)
│   └── users/        # Пример модуля "Пользователи"
│       ├── controllers/   # Обработка HTTP запросов
│       ├── services/      # Бизнес-логика
│       ├── repositories/  # Работа с БД
│       ├── schemas/       # Валидация (Zod, TypeBox)
│       ├── types/         # TypeScript типы для модуля
│       └── index.ts       # Точка входа модуля
├── shared/           # Общие утилиты, middleware, ошибки
│   ├── middleware/
│   ├── errors/
│   └── utils/
├── app.ts            # Инициализация приложения (роуты, middleware)
└── server.ts         # Запуск сервера
  • Express.js: Классический пример — server/ с src/, где лежат resolvers/models/prisma/. В более продвинутых шаблонах используют controllers/services/routes/.

  • Hono: Так как Hono не навязывает структуру, в сообществе предлагают гибкие подходы. Можно использовать feature-first структуру с папкой features/, где каждый модуль содержит свои api/ (эндпоинты), services/ (бизнес-логику), repositories/ (доступ к данным) и validation/. Общие части выносятся в core/ и shared/.

  • Fastify: Рекомендуется структура с routes/ (группировка по ресурсам), plugins/ (для регистрации функциональности), services/ и repositories/.

2. Frontend: React / Next.js

Здесь ключевой выбор — между App Router (рекомендуемый) и Pages Router.

Структура для Next.js (App Router):

text
my-nextjs-app/
├── app/                    # Маршруты и страницы (App Router)
│   ├── (auth)/             # Группа маршрутов для аутентификации
│   ├── (dashboard)/        # Группа для защищенных страниц
│   ├── api/                # API Routes (serverless функции)
│   ├── layout.tsx          # Корневой layout
│   └── page.tsx            # Домашняя страница
├── src/                    # Исходный код приложения (опционально)
│   ├── components/         # Переиспользуемые UI компоненты
│   │   ├── ui/             # Базовые (Button, Input)
│   │   └── layout/         # Структурные (Header, Sidebar)
│   ├── features/           # Фичи (самодостаточные модули)
│   │   └── profile/        # Пример фичи "Профиль"
│   │       ├── components/
│   │       ├── hooks/
│   │       ├── services/   # API вызовы для фичи
│   │       └── types/
│   ├── lib/                # Утилиты, конфигурация клиентов (API, React Query)
│   ├── hooks/              # Кастомные React хуки (глобальные)
│   ├── types/              # Общие TypeScript типы
│   └── context/            # React Context провайдеры
├── public/                 # Статические файлы
└── package.json

Ключевые моменты:

  • Используйте app/ для новых проектов.

  • Для изоляции кода применяйте Route Groups (groupName).

  • Код, относящийся к одной функции, группируйте в features/.

  • Общие компоненты храните в components/.

  • Серверную логику (работа с БД, сервисы) выносите в папку server/ или lib/server/.

 

🏗️ Архитектура на уровне решения (Monorepo)

Если вы разрабатываете фронтенд и бэкенд в одном репозитории, используйте монорепозиторий (monorepo). Это стандарт для полного цикла разработки.

Пример структуры монорепозитория:

text
my-monorepo/
├── packages/ или apps/
│   ├── frontend/          # Next.js приложение
│   │   ├── app/
│   │   ├── components/
│   │   └── package.json
│   └── backend/           # Express / Hono / Fastify приложение
│       ├── src/
│       │   ├── modules/
│       │   ├── shared/
│       │   └── server.ts
│       └── package.json
├── docker-compose.yml
├── package.json           # Корневой package.json с workspaces
└── turbo.json или pnpm-workspace.yaml

Инструменты для управленияpnpm workspacesnpm workspaces, или Turborepo для более сложных сценариев.

 

🚀 Специфика для Bun

Bun — это не только рантайм, но и пакетный менеджер, и сборщик.

  • Структура: Стандартный проект на Bun выглядит так:

    text
    my-bun-app/
    ├── src/           # Исходный код
    ├── index.ts       # Точка входа
    ├── package.json
    └── tsconfig.json
  • Монорепозиторий: Bun отлично поддерживает workspaces в package.json для создания монорепозиториев.

 

📈 От простого к сложному: Эволюция структуры

Важно понимать, что структура растет вместе с проектом:

  1. Начальный уровень (Small Project)app/components/lib/types/. Просто и быстро.

  2. Средний уровень (Medium Project): Добавляются features/ для логической группировки, server/ для серверной логики, ui/ для общих компонентов.

  3. Продвинутый уровень (Enterprise): Внедряются Domain-Driven Design (DDD) с папкой entities/, четкое разделение на core/modules/shared/ и использование принципов Чистой архитектуры.

💎 Итог: Стратегия выбора

  1. Начните с малого: Для нового проекта используйте простую, но логичную структуру (например, app/ + components/ + lib/ для Next.js).

  2. Рефакторинг по мере роста: Как только проект начинает разрастаться, внедряйте feature-first подход, группируя код по функциям в папке features/.

  3. Разделяйте backend и frontend: Даже в монорепозитории четко разделяйте код клиента и сервера по разным пакетам.

  4. Следуйте соглашениям фреймворка: Используйте App Router в Next.js, роутинг по ресурсам в Fastify, и feature-based структуру в Hono.

Выбор правильной структуры — это инвестиция в будущее вашего проекта. Начните с обдуманного базового варианта и развивайте его по мере необходимости.

Вам понравилась статья?
Read more
Cовременная веб-разработка и ряд отраслевых стандартов и лучших практик!

Cовременная веб-разработка и ряд отраслевых стандартов и лучших практик!

10 0 0.0 0
1
Категории: Технологии IT и программирование Языки программирования Веб-технологии

В современной веб-разработке с использованием TypeScript, React, Next.js и Node.js сложился ряд отраслевых стандартов и лучших практик. Эти практики помогают создавать код, который легко поддерживать, масштабировать и развивать в команде.

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

📝 Единые стандарты кода и TypeScript

  • Стиль кода: Для обеспечения единообразия в команде принято использовать один из популярных стилевых гайдов, например Airbnb JavaScript Style Guide или Google Style Guide. Их легко внедрить с помощью соответствующих конфигураций для ESLint (eslint-config-airbnb-typescripteslint-config-google).

  • Строгий TypeScript: В файле tsconfig.json обязательно нужно устанавливать "strict": true. Это включает все строгие проверки типов, что является фундаментом надежности кода.

  • Инструменты линтинга и форматирования: Используйте ESLint для поиска проблем в коде и Prettier для автоматического форматирования. Это обязательный минимум для любого современного проекта.

⚛️ Стандарты для React и Next.js

  • Компоненты: Предпочтение отдается функциональным компонентам с четко описанными TypeScript-интерфейсами для props. По возможности используйте серверные компоненты (Server Components) по умолчанию.

  • Производительность: Для оптимизации используйте встроенные хуки: useCallback для мемоизации функций, useMemo для дорогих вычислений и React.memo для предотвращения лишних перерисовок компонентов.

  • Маршрутизация: В новых проектах на Next.js используйте App Router, так как это современный и рекомендуемый подход.

⚙️ Стандарты для серверных фреймворков (Express.js, Hono, Fastify)

Выбор фреймворка зависит от контекста задачи:

 
 
Фреймворк Лучшее применение
Hono Edge-окружения и serverless (например, Cloudflare Workers). Отличается нулевыми зависимостями и минимальным временем холодного старта.
Fastify Высокопроизводительные API. По скорости работы быстрее Express в 2-3 раза, имеет встроенную валидацию схем.
Express.js Легаси-проекты, стабильность и максимальная экосистема. Самый зрелый и распространенный фреймворк с огромным количеством middleware.

Общие для всех бэкенд-фреймворков практики:

  • Структура проекта (Layered Architecture): Следуйте четкому разделению ответственности, выделяя слои:

    • routes/ — определение эндпоинтов.

    • controllers/ — обработка HTTP-запросов и ответов.

    • services/ — бизнес-логика (не должна зависеть от HTTP).

    • repositories/ или models/ — работа с данными и базой данных.

    • middleware/ — кастомные middleware (аутентификация, валидация, логирование).

  • Валидация: Всегда проверяйте входные данные на границе приложения (в контроллере или middleware). Для этого отлично подходят библиотеки вроде Zod или TypeBox.

  • Обработка ошибок: Используйте централизованный обработчик ошибок и иерархию кастомных классов ошибок (например, ValidationErrorNotFoundError).

🚀 Стандарты для рантаймов (Bun и Node.js)

  • Node.js: Это стандарт де-факто для серверной разработки с огромной экосистемой.

  • Bun: Позиционируется как более быстрая альтернатива. Его стоит рассматривать, если важна производительность, а встроенный бандлер и тест-раннер могут упростить тулинг.

    • Ключевая практика для Bun: Bun нативно поддерживает TypeScript, поэтому для запуска .ts файлов не нужны дополнительные инструменты вроде ts-node. Предпочтительно использовать встроенные Web API (fetchfspath) вместо Node.js-специфичных, где это возможно.

🏗️ Общие принципы архитектуры

  • Чистая архитектура: Стремитесь к тому, чтобы ваша бизнес-логика (сервисы) не зависела от внешних фреймворков и баз данных. Это делает код более тестируемым и гибким.

  • Single Responsibility (SRP): Каждый модуль, класс или функция должны иметь одну четкую зону ответственности.

  • DRY (Don't Repeat Yourself): Избегайте дублирования кода, выносите повторяющуюся логику в утилиты или переиспользуемые хуки/компоненты.

🛠️ Рекомендованный инструментарий

  • Линтерeslint с плагинами для TypeScript, React и Next.js.

  • Форматтерprettier.

  • Типыtypescript (строгий режим).

  • Валидацияzod (отлично работает с TypeScript для вывода типов).

  • Управление состояниями (React)Redux Toolkit или Zustand (более легковесный).

В целом, ключ к успеху — это строгая типизация, четкая структура проекта и автоматизированные инструменты для поддержания качества кода. Выбор между конкретными фреймворками (Express vs Fastify vs Hono) и рантаймами (Node vs Bun) зависит от конкретных требований вашего проекта к производительности, среде запуска и опыту команды.

Вам понравилась статья?
Read more
Три уровня современной веб-разработки и бэкенд-разработки

Три уровня современной веб-разработки и бэкенд-разработки

8 0 0.0 0
1
Категории: IT и программирование Языки программирования Веб-технологии
Вся эта путаница легко раскладывается по трём уровням (этажам) бэкенд-разработки. Представьте, что мы строим дом.

Этаж 1: Фундамент (Рантаймы — Где код выполняется)

Node.js, Bun, Deno
Браузер (например, Chrome) умеет запускать JavaScript, чтобы работали сайты. Но на компьютере или сервере браузера нет. Рантайм — это специальная программа, которую вы устанавливаете на компьютер, чтобы запускать JavaScript-код без браузера (напрямую на железе).
 
  • Node.js — это «дедушка» и абсолютный стандарт. Самый старый, супер-стабильный, на нем написан бэкенд 90% компаний в мире.
  • Deno — попытка создателя Node.js исправить свои старые ошибки. Он безопаснее и сразу поддерживает TypeScript, но большой популярности на рынке не сыскал.
  • Bun — самый новый и «модный» рантайт (хит последних лет). Он делает всё то же самое, что Node.js, но работает в разы быстрее, сразу понимает TypeScript и не требует сложной настройки.
Аналогия: Это марка операционной системы вашего сервера (как Windows, Linux или macOS). Вы выбираете один фундамент, на котором будет крутиться проект. В 2026 году чаще всего выбирают проверенный Node.js или ультрабыстрый Bun.

Этаж 2: Стены (Классические Бэкенд-фреймворки)

Express.js, Fastify, Hono, NestJS
Вы выбрали рантайт (например, Node.js). Теперь вам нужно написать сервер, который принимает запросы. Писать его на «голом» Node.js — это долго и мучительно. Поэтому поверх рантайма ставят бэкенд-фреймворк. Он дает удобные инструменты для создания маршрутов (типа создать пользователя по адресу /регистрация).
 
  • Express.js — старый, простой, как топор. На нем написаны миллионы уроков в интернете. Отличный, чтобы поучиться, но устаревает.
  • Fastify — современная замена Express. Работает намного быстрее и лучше дружит с TypeScript.
  • Hono — самый легкий и современный микробэкенд. Он одинаково круто работает и на Node.js, и на Bun, и в облачных сервисах. Идеален для быстрых, небольших API.
  • NestJS — это «тяжелая артиллерия». Если Express, Fastify и Hono — это свобода (пиши код как хочешь, хоть в одном файле), то NestJS — это строгая дисциплина для огромных проектов. Он заставляет раскладывать код по строгим папкам и правилам, чтобы проект не превратился в помойку через год разработки.
Аналогия: Это каркас вашего здания. Вы выбираете один бэкенд-фреймворк. Для простых вещей берете Hono/Fastify, для огромного корпоративного банка — NestJS.

Этаж 3: Крыша и Фасад (Fullstack-фреймворк)

Next.js
Все технологии выше (из Этажей 1 и 2) умеют работать только со скрытой логикой и базами данных. Они не умеют показывать пользователю красивые кнопки, картинки, шрифты и анимации. Для этого нужен фронтенд (библиотека React).
 
  • Next.js — это полноценная экосистема (Fullstack) на базе React. Он отвечает за то, чтобы пользователь увидел красивый сайт, чтобы этот сайт мгновенно открывался и правильно считывался поисковиками (Яндекс, Google) для SEO.
  • При этом у Next.js есть «мини-бэкенд» внутри. Для несложного сайта Next.js может сам сходить в базу данных и забрать информацию, поэтому Этаж 2 (типа NestJS или Express) ему часто просто не нужен.

🗺 Карта «Что с чем дружит» (Как собрать свой первый конструктор)

Вы не можете смешать всё в одну кучу, вы выбираете комбинацию. Вот 3 самых частых сценария в реальной жизни:

Сценарий А: Простой современный сайт (интернет-магазин, блог)

Вам не нужно плодить кучу серверов. Вы берете один инструмент, который делает всё:
 
  • Next.js (он и за внешний вид отвечает, и простенький бэкенд внутри себя содержит).

Сценарий Б: Современное мощное API (например, для мобильного приложения)

Вам вообще не нужен внешний вид сайта (фронтенд), нужна чистая скорость и логика:
 
  • Фундамент: Bun (или Node.js)
  • Бэкенд-фреймворк: Hono (или Fastify)

Сценарий В: Крупный и сложный IT-продукт (онлайн-банк, огромная соцсеть)

Здесь роли жестко разделяют между командами:
 
  • За бэкенд, безопасность и базы данных отвечает: Рантайм Node.js + Фреймворк NestJS.
  • За красивый интерфейс сайта, который обращается к этому бэкенду, отвечает: Next.js.

 


 
Вам понравилась статья?
Read more

Практическое руководство по настройке ESLint v9+ (Flat Config) для стека React + TypeScript, по методологии Feature-Sliced Design (FSD)

14 0 0.0 0
Категории: IT и программирование Языки программирования Веб-технологии
Вот готовое практическое руководство по настройке ESLint v9+ (Flat Config) для стека React + TypeScript и созданию структуры папок по методологии Feature-Sliced Design (FSD).

1. Настройка ESLint (для React + TS)

Современный ESLint (начиная с версии 9) использует новый формат конфигурации eslint.config.js (Flat Config).

Шаг 1: Установка зависимостей

Выполните команду в терминале проекта:
npm install -D eslint @eslint/js typescript-eslint eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-react-refresh

Шаг 2: Создание файла eslint.config.js

Создайте этот файл в корневом каталоге проекта:
import js from '@eslint/js';
import tseslint from 'typescript-eslint';
import reactPlugin from 'eslint-plugin-react';
import reactHooks from 'eslint-plugin-react-hooks';
import reactRefresh from 'eslint-plugin-react-refresh';

export default tseslint.config(
  // Игнорируемые папки (замена старого .eslintignore)
  { ignores: ['dist', 'node_modules', 'build'] },
  
  // Базовые настройки для JavaScript и TypeScript
  js.configs.recommended,
  ...tseslint.configs.recommended,
  
  // Настройки для React-компонентов
  {
    files: ['**/*.{ts,tsx}'],
    plugins: {
      'react': reactPlugin,
      'react-hooks': reactHooks,
      'react-refresh': reactRefresh,
    },
    languageOptions: {
      parserOptions: {
        ecmaFeatures: { jsx: true },
      },
    },
    settings: {
      react: { version: 'detect' }, // Автоопределение версии React
    },
    rules: {
      // Правила React Hooks
      ...reactHooks.configs.recommended.rules,
      
      // Специфичные правила для React
      'react/react-in-jsx-scope': 'off', // Отключено для React 17+
      'react/jsx-no-target-blank': 'warn',
      
      // Правила для React Fast Refresh (полезно для Vite)
      'react-refresh/only-export-components': [
        'warn',
        { allowConstantExport: true },
      ],
      
      // Кастомные правила TypeScript
      '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
      '@typescript-eslint/no-explicit-any': 'warn',
    },
  }
);

2. Структура папок по стандарту Feature-Sliced Design (FSD)

Методология FSD делит проект на слои (Layers), внутри которых находятся слайсы (Slices), разбитые на сегменты (Segments). Главное правило: верхние слои могут импортировать код только из нижних, но не наоборот.
Вот как выглядит правильная структура каталога src для типичного React-приложения:
src/
├── 1_app/                  # Слои (Layers) пишутся строчными буквами, цифры — для визуального порядка
│   ├── providers/          # Провайдеры (Redux Store, RouterProvider, ThemeProvider)
│   ├── styles/             # Глобальные стили (index.css, variables.scss)
│   └── App.tsx             # Инициализация приложения
│
├── 2_pages/                # Страницы приложения
│   ├── home/               # Слайс страницы (Slice)
│   │   ├── ui/             # Сегменты (Segments): UI-компоненты страницы
│   │   └── index.ts        # Публичное API (только отсюда можно делать импорт наружу!)
│   └── profile/
│       ├── ui/
│       └── index.ts
│
├── 3_widgets/              # Крупные самостоятельные блоки (из фич и сущностей)
│   ├── header/
│   │   ├── ui/             # Header.tsx
│   │   └── index.ts
│   └── sidebar/
│
├── 4_features/             # Действия пользователя, несущие бизнес-ценность
│   ├── auth-by-username/   # Авторизация
│   │   ├── model/          # Стейт, экшены, селекторы (Redux/Zustand)
│   │   ├── ui/             # Форма логина, кнопка
│   │   └── index.ts
│   └── add-to-cart/        # Добавление в корзину
│
├── 5_entities/             # Бизнес-сущности (без привязки к конкретным действиям)
│   ├── user/
│   │   ├── model/          # Типы пользователя, стейт авторизации
│   │   └── index.ts
│   └── product/
│       ├── ui/             # Карточка продукта (ProductCard)
│       └── index.ts
│
└── 6_shared/               # Переиспользуемый код (инфраструктура, утилиты)
    ├── api/                # Базовые запросы (axios, fetch)
    ├── assets/             # Иконки, картинки, шрифты
    ├── lib/                # Хелперы, кастомные хуки (useDebounce и др.)
    └── ui/                 # Атомарные UI-компоненты (Button, Input, Modal)
        ├── button/
        │   ├── Button.tsx
        │   └── index.ts
        └── input/

Важные правила FSD для вашей команды:

 
  1. Индексные файлы (index.ts) — это «ворота» слайса. Извне разрешено импортировать код только через них (например: import { Button } from '@/shared/ui/button'). Импорты вида .../button/Button.tsx строго запрещены.
  2. Иерархия импортов — widgets может импортировать из features, entities и shared. Но shared не может импортировать ничего из слоев выше.


 
Настроить специальный плагин для ESLint, который запретит некорректные импорты между слоями. 
Для автоматического контроля архитектуры Feature-Sliced Design (FSD) в ESLint используется официальный плагин eslint-plugin-boundaries или специализированный eslint-plugin-fsd (также известный как eslint-plugin-feature-sliced).
Наиболее гибким, поддерживаемым и совместимым с ESLint v9+ (Flat Config) является eslint-plugin-boundaries. Он позволяет жестко заблокировать импорты снизу вверх (например, из shared в features).
Вот пошаговое руководство по его интеграции.

Шаг 1: Установка плагина

Установите плагин контроля границ в dev-зависимости:
npm install -D eslint-plugin-boundaries

Шаг 2: Обновление конфигурации eslint.config.js

Вам нужно импортировать плагин, разметить папки вашего проекта на «типы» (слои) и задать правила их взаимодействия.
Добавьте этот код в ваш существующий файл eslint.config.js:
import js from '@eslint/js';
import tseslint from 'typescript-eslint';
import reactPlugin from 'eslint-plugin-react';
import reactHooks from 'eslint-plugin-react-hooks';
import reactRefresh from 'eslint-plugin-react-refresh';
// 1. Импортируем плагин границ
import boundaries from 'eslint-plugin-boundaries';

export default tseslint.config(
  { ignores: ['dist', 'node_modules', 'build'] },
  js.configs.recommended,
  ...tseslint.configs.recommended,
  
  {
    files: ['**/*.{ts,tsx,js,jsx}'],
    plugins: {
      'react': reactPlugin,
      'react-hooks': reactHooks,
      'react-refresh': reactRefresh,
      // 2. Регистрируем плагин
      'boundaries': boundaries,
    },
    languageOptions: {
      parserOptions: {
        ecmaFeatures: { jsx: true },
      },
    },
    settings: {
      react: { version: 'detect' },
      // 3. Настраиваем распознавание путей (поддерживает относительные импорты и алиасы вроде @/*)
      'boundaries/elements': [
        { type: 'app', pattern: 'src/1_app/**/*' },
        { type: 'pages', pattern: 'src/2_pages/**/*' },
        { type: 'widgets', pattern: 'src/3_widgets/**/*' },
        { type: 'features', pattern: 'src/4_features/**/*' },
        { type: 'entities', pattern: 'src/5_entities/**/*' },
        { type: 'shared', pattern: 'src/6_shared/**/*' },
      ],
    },
    rules: {
      ...reactHooks.configs.recommended.rules,
      'react/react-in-jsx-scope': 'off',
      
      // 4. Включаем правила FSD
      'boundaries/entry-point': 'error', // Запрещает глубокие импорты в обход index.ts
      'boundaries/element-types': [
        'error',
        {
          default: 'disallow', // По умолчанию всё запрещено, кроме явных разрешений ниже
          message: 'Архитектурная ошибка FSD: импорт из слоев выше или чужих слайсов запрещен (${file.type} <- ${dependency.type})',
          rules: [
            // Слою App доступно всё
            { from: 'app', allow: ['pages', 'widgets', 'features', 'entities', 'shared'] },
            // Слою Pages доступны все нижележащие слои
            { from: 'pages', allow: ['widgets', 'features', 'entities', 'shared'] },
            // Слою Widgets доступны фичи, сущности и shared
            { from: 'widgets', allow: ['features', 'entities', 'shared'] },
            // Слою Features доступны сущности и shared
            { from: 'features', allow: ['entities', 'shared'] },
            // Слою Entities доступен только shared
            { from: 'entities', allow: ['shared'] },
            // Слою Shared запрещено импортировать из любых других слоев FSD
            { from: 'shared', allow: [] },
          ],
        },
      ],
    },
  }
);

Как это работает на практике (Примеры)

Если линтер настроен правильно, вы сразу получите сообщения об ошибках в редакторе (VS Code / WebStorm) или при сборке проекта:
 
  • Ошибка ❌: Попытка импортировать хук авторизации из features внутрь кнопки в shared:
    // Внутри src/6_shared/ui/button/Button.tsx
    import { useAuth } from '@/features/auth-by-username'; 
    // ESLint выведет: "Архитектурная ошибка FSD: импорт из слоев выше или чужих слайсов запрещен (shared <- features)"
    
  • Ошибка ❌: Нарушение принципа Public API (глубокий импорт в обход index.ts слайса):
    // Внутри src/2_pages/home/ui/HomePage.tsx
    import { LoginForm } from '@/features/auth-by-username/ui/LoginForm'; 
    // ESLint выдаст ошибку правила boundaries/entry-point. Нужно импортировать строго из '@/features/auth-by-username'
    
  • **Корректно Запрос из виджета в фичу через Public API:
    // Внутри src/3_widgets/header/ui/Header.tsx
    import { LoginButton } from '@/features/auth-by-username'; 
    


 
Настройка алиасов путей (Path Aliases) в tsconfig.json и Vite/Webpack, чтобы вместо длинных относительных путей ../../ использовать красивый префикс @/
Настройка Path Aliases (алиасов путей) сделает ваши импорты чистыми (вместо ../../../../shared/ui вы будете писать @/shared/ui), а также поможет плагину eslint-plugin-boundaries работать без сбоев.
Поскольку вы используете React, проект, скорее всего, собран на Vite. Нам нужно настроить алиасы в трех местах: в TypeScript (для подсказок в IDE), в Vite (для сборщика) и в ESLint (для резолва путей плагином границ).

Шаг 1: Настройка TypeScript (tsconfig.json)

Откройте файл tsconfig.json (или tsconfig.app.json, если у вас проект на свежем Vite) и добавьте секцию paths внутрь compilerOptions:
{
  "compilerOptions": {
    // ... ваши текущие настройки
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}
Что это делает: Говорит TypeScript, что символ @/ указывает на папку src/.

Шаг 2: Настройка Vite (vite.config.ts)

Чтобы Vite понимал эти пути при сборке, установим плагин vite-tsconfig-paths. Он автоматически синхронизирует настройки из tsconfig.json в Vite, избавляя от ручного дублирования.
 
  1. Установите плагин:
    npm install -D vite-tsconfig-paths
    
  2. Обновите vite.config.ts:
    import { defineConfig } from 'vite';
    import react from '@vitejs/plugin-react';
    // 1. Импортируем плагин
    import tsconfigPaths from 'vite-tsconfig-paths';
    
    export default defineConfig({
      // 2. Добавляем в массив плагинов
      plugins: [react(), tsconfigPaths()],
    });
    

Шаг 3: Корректировка ESLint для плагина границ (eslint.config.js)

Чтобы плагин eslint-plugin-boundaries правильно читал пути с префиксом @/, нам нужно добавить специальный плагин-резолвер для ESLint.
 
  1. Установите парсер путей TypeScript для ESLint:
    npm install -D eslint-import-resolver-typescript
    
  2. Обновите секцию settings в вашем eslint.config.js:
// ... ваши импорты

export default tseslint.config(
  { ignores: ['dist', 'node_modules', 'build'] },
  js.configs.recommended,
  ...tseslint.configs.recommended,
  
  {
    files: ['**/*.{ts,tsx,js,jsx}'],
    plugins: {
      'react': reactPlugin,
      'react-hooks': reactHooks,
      'react-refresh': reactRefresh,
      'boundaries': boundaries,
    },
    // ОБНОВЛЕННАЯ СЕКЦИЯ SETTINGS
    settings: {
      react: { version: 'detect' },
      
      // Настройка для распознавания алиаса @/* парсером ESLint
      'import/resolver': {
        typescript: {}, 
      },
      
      // Шаблоны теперь учитывают как относительные пути, так и алиас @/
      'boundaries/elements': [
        { type: 'app', pattern: ['src/1_app/**/*', '@/1_app/**/*'] },
        { type: 'pages', pattern: ['src/2_pages/**/*', '@/2_pages/**/*'] },
        { type: 'widgets', pattern: ['src/3_widgets/**/*', '@/3_widgets/**/*'] },
        { type: 'features', pattern: ['src/4_features/**/*', '@/4_features/**/*'] },
        { type: 'entities', pattern: ['src/5_entities/**/*', '@/5_entities/**/*'] },
        { type: 'shared', pattern: ['src/6_shared/**/*', '@/6_shared/**/*'] },
      ],
    },
    rules: {
      // ... правила, которые мы настроили на прошлом шаге
    }
  }
);

Проверка результата 🚀

После перезапуска IDE (иногда VS Code нужно перезапустить через Ctrl+Shift+P -> Developer: Reload Window), вы сможете писать импорты в стиле FSD:
// Внутри src/2_pages/home/ui/HomePage.tsx

// Отлично: импорт виджета через красивый алиас
import { Header } from '@/3_widgets/header'; 

// Отлично: импорт кнопки из shared
import { Button } from '@/6_shared/ui/button'; 

// ESLint выдаст ошибку ❌ (импорт сверху вниз):
// import { ProfilePage } from '@/2_pages/profile'; 
Если вы планируете использовать менеджер состояния (например, Zustand или Redux Toolkit), я могу показать, как правильно разложить стейт по слоям features и entities, чтобы не нарушить правила линтера. Рассказать об этом подробнее?

 
Вам понравилась статья?
Read more
Принципы и парадигмы (Clean Code)

Принципы и парадигмы (Clean Code)

13 0 5.0 0
4
Категории: IT и программирование Веб-технологии
🌟 Принципы и парадигмы (Clean Code)
SOLID — пять базовых принципов объектно-ориентированного программирования и проектирования (Single responsibility, Open/closed, Liskov substitution, Interface segregation, Dependency inversion).
DRY (Don't Repeat Yourself) — принцип недопущения дублирования кода.
KISS (Keep It Simple, Stupid) — принцип проектирования, при котором простота системы является главным приоритетом.
YAGNI (You Aren't Gonna Need It) — принцип, согласно которому не стоит добавлять функциональность, пока она не понадобится.
📜 Оформление и соглашения (Code Style)
PSR (PHP Standards Recommendations) — общепринятые стандарты кодирования для PHP (например, PSR-1, PSR-4 для автозагрузки).
PEP (Python Enhancement Proposals) — предложения по развитию Python. Самый известный — PEP 8, стандарт оформления кода.
Airbnb Style Guide — строгие и популярные руководства по стилю для JavaScript, React, CSS и других технологий. [1, 2]
📚 Национальные и системные стандарты
ГОСТ ЕСПД (Единая система программной документации) — комплекс государственных стандартов РФ, устанавливающий правила разработки, оформления и обращения программ.
ISO/IEC/IEEE 12207 — международный стандарт, описывающий процессы жизненного цикла программного обеспечения (ЖЦ ПО). [1]
⚙️ Процессы и методологии (DevOps)
SDLC (Software Development Life Cycle) — жизненный цикл разработки ПО (этапы от анализа требований до поддержки).
CI/CD (Continuous Integration / Continuous Delivery) — практики непрерывной интеграции и доставки кода.
TDD (Test-Driven Development) — разработка через тестирование.


💻 Стандарты для TS, React и Express
В экосистеме JavaScript/TypeScript стандарты чаще всего внедряются через конфигурации инструментов автоматической проверки (ESLint, Prettier) и архитектурные паттерны.
TypeScript (TS)
  • TSConfig Strict — официальный стандарт строгого режима компилятора ("strict": true), запрещающий неявные типы any и потенциальные ошибки с null/undefined.
  • TypeScript Style Guide (by Google / Microsoft) — внутренние стандарты ИТ-гигантов, ставшие публичными ориентирами для именования интерфейсов, типов и модулей.
React
  • Airbnb JavaScript/React Style Guide — самый популярный в мире стандарт оформления React-компонентов (правила деструктуризации, использования хуков, JSX-синтаксиса).
  • FSD (Feature-Sliced Design) — современный архитектурный стандарт проектирования фронтенд-приложений. Он делит код на слои (layers), слайсы (slices) и сегменты (segments) для высокой масштабируемости.
Express (Node.js)
  • Node.js Best Practices — крупнейший открытый стандарт (GitHub-репозиторий) по архитектуре бэкенда. Включает правила обработки ошибок, структуры папок и безопасности Express-приложений.
  • REST API Conventions — стандарт проектирования сетевых интерфейсов (правильное использование HTTP-методов, статус-кодов и структуры URL).

 
📋 Методологии управления проектами
В управлении разработкой ПО используются гибкие (Agile) и классические стандарты.
  • Scrum — фреймворк гибкой разработки, основанный на спринтах (1–4 недели), ежедневных созвонах (Daily) и регулярных поставках работающего инкремента продукта.
  • Kanban — метод визуализации работы с помощью досок (To Do, In Progress, Done) для оптимизации потока задач и ограничения незавершенного производства (WIP limits).
  • Agile — общий манифест гибкой разработки программного обеспечения, провозглашающий приоритет людей и работающего продукта над процессами и документацией.
  • Waterfall (Каскадная модель) — традиционная методология с жесткой последовательностью фаз (Анализ → Проектирование → Разработка → Тестирование → Внедрение).
  • PMBOK (Project Management Body of Knowledge) — всемирный стандарт и свод знаний по управлению проектами от института PMI.
  • PRINCE2 (Projects in Controlled Environments) — структурированный британский стандарт управления проектами, сфокусированный на продуктах и контроле стадий.

 
Вам понравилась статья?
Read more
Cовременный фронтенд

Cовременный фронтенд

22 0 5.0 0
1
Категории: IT и программирование Веб-технологии
Чтобы писать современный фронтенд стильно, быстро и качественно, сфокусируйтесь на связке TypeScript, React / Next.js, и компонентной сборке с использованием Tailwind CSS и Shadcn UI. Это золотой стандарт индустрии, который избавит вас от рутины и позволит сосредоточиться на логике.
🛠 Главный стек и подходы
  • Язык: TypeScript — строгая типизация, которая предотвращает 80% ошибок еще до запуска кода.
  • Фреймворк: Next.js (на базе React) — Next.js стал стандартом для создания мощных приложений благодаря встроенному серверному рендерингу (SSR), который ускоряет загрузку и оптимизирует сайт для SEO.
  • Стилизация: Tailwind CSSTailwind CSS позволяет писать стили прямо внутри HTML-разметки через служебные классы. Вы не переключаетесь между файлами и быстрее создаете уникальный дизайн.
  • Компоненты: Shadcn UIShadcn UI — это не готовая библиотека, а коллекция переиспользуемых компонентов, которые копируются в ваш проект. Они дают полный контроль над кодом и стильный внешний вид без эффекта «шаблонности».
🚀 Современный инструментарий
  • Менеджер пакетов: Используйте быстрый pnpm вместо npm.
  • Сборщик: В новых проектах доминирует ViteVite для SPA (одностраничных приложений), так как он компилирует код практически мгновенно.
  • Линтинг: ESLint + PrettierPrettier автоматически отформатирует код при сохранении, чтобы он всегда выглядел аккуратно.
 
Вам понравилась статья?
Read more