Компонентные системы в современных платформах для управления сайтами и контентом

Рассмотрим как устроены компонентные системы в популярных платформах управления сайтами на примере Astro, Next.js, Laravel (Blade), WordPress (Gutenberg) и Bitrix. Сравним на одном сценарии, сходства и отличия в том как в них устроено переиспользование UI компонентов и сборка страниц.

За последние 10–12 лет веб-разработка радикально изменилась. Если раньше страница собиралась из разрозненных HTML-блоков и CSS-классов, то сегодня почти все серьёзные проекты строятся вокруг компонентов — переиспользуемых, изолированных и предсказуемых единиц интерфейса.

Компонентная система — это не просто «удобный способ писать код». Это архитектурный подход, который влияет на скорость разработки, поддерживаемость, масштабируемость и даже на то, как контент-менеджеры работают с сайтом.

В этой статье разберём:

  • как эволюционировали подходы к компонентам;
  • как устроены компонентные системы в популярных платформах;
  • на конкретном примере покажем разницу между ними.

От BEM к современным системам

BEM (Block, Element, Modifier) был одним из первых системных ответов на хаос в CSS. Он дал чёткие правила именования:

<button class="button button--primary button--large">
  <span class="button__icon">→</span>
  Купить
</button>

BEM хорошо решал проблему конфликтов стилей и позволял создавать относительно независимые блоки. Но у него были ограничения:

  • многословный HTML;
  • сложность создания настоящей дизайн-системы;
  • отсутствие логики и состояния внутри «компонента».

Сегодня на смену пришли два основных направления:

  1. Utility-first + семантические обёртки Tailwind CSS + DaisyUI / Flowbite / Shadcn/ui. Стили пишутся через утилиты, а поверх них появляются готовые компоненты.
  2. Настоящие компоненты с логикой React/Vue/Svelte-компоненты, Blade-компоненты, Astro-компоненты, Gutenberg-блоки, Bitrix-компоненты.

Современная компонентная система обычно включает:

  • переиспользование;
  • изоляцию стилей и логики;
  • возможность передачи параметров (props);
  • слоты / области контента;
  • единый источник правды для дизайн-системы.

Как устроены компонентные системы на разных платформах

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

Есть страница с секцией Hero.

Кнопка должна быть общей для всего сайта (единый внешний вид, единое поведение).

Сама секция Hero — просто разметка страницы, а не отдельный сложный компонент.

1. Astro JS & Daisy UI

Astro — одна из самых «чистых» компонентных систем. Компоненты по умолчанию серверные и очень лёгкие.

Компонент кнопки (Button.astro):

---
interface Props {
  href?: string;
  variant?: 'primary' | 'secondary';
  size?: 'sm' | 'md' | 'lg';
}
const { href, variant = 'primary', size = 'md' } = Astro.props;
---
<a href={href} class:list={['btn', `btn-${variant}`, `btn-${size}`]}>
  <slot />
</a>

Страница с Hero:

---
import Button from '../components/Button.astro';
---
<section class="hero">
  <h1>Современный сайт</h1>
  <p>Компонентная архитектура</p>
  <Button href="/catalog" variant="primary" size="lg">
    Перейти в каталог
  </Button>
</section>

Сильные стороны: простота, производительность, отличная композиция.

Слабые: меньше «магии» для сложных интерактивных интерфейсов (хотя острова решают эту задачу).

2. Next JS (React + Shadcn/UI)

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

Кнопка обычно берётся из Shadcn/ui (или пишется своя):

import { Button } from "@/components/ui/button"
import Link from "next/link"

export function SiteButton({ href, children, ...props }) {
  return href ? (
    <Button asChild {...props}>
      <Link href={href}>{children}</Link>
    </Button>
  ) : (
    <Button {...props}>{children}</Button>
  )
}

На странице:

<section className="hero">
  <h1>Современный сайт</h1>
  <p>Компонентная архитектура</p>
  <SiteButton href="/catalog" size="lg">
    Перейти в каталог
  </SiteButton>
</section>

Здесь компонент — полноценный React-элемент с типизацией, возможностью клиентской логики и отличной интеграцией с дизайн-системой.

3. Laravel (Blade Components)

Один из самых элегантных серверных подходов на PHP.

Компонент (resources/views/components/button.blade.php):

@props(['href' => null, 'variant' => 'primary', 'size' => 'md'])

<a href="{{ $href }}" {{ $attributes->merge(['class' => "btn btn-{$variant} btn-{$size}"]) }}>
  {{ $slot }}
</a>

В шаблоне страницы:

<section class="hero">
  <h1>Современный сайт</h1>
  <p>Компонентная архитектура</p>
  <x-button href="/catalog" variant="primary" size="lg">
    Перейти в каталог
  </x-button>
</section>

Синтаксис <x-button> очень близок к React/Vue, но всё выполняется на сервере.

4. WordPress (Gutenberg / Block Themes)

В современном WordPress компонент = блок. Однако в отличие от компонентов выше, тут блок может не только вставляться в код, но и использоваться в редакторе контента и конструкторе страниц сайта без кода.

Образуется магия интеграции Code-driven + Content-driven. Хотите пишите кодом, хотите редактируйте контент прямо на сайте без кода. Это ключевое преимущество WordPress.

Кнопку можно сделать:

  • кастомным блоком;
  • переиспользуемым блоком (Reusable Block / Pattern);
  • через theme.json + стили.

Пример вызова кастомного блока в шаблоне:

<!-- wp:group {"className":"hero"} -->
<div class="hero">
  <!-- wp:heading -->
  <h1>Современный сайт</h1>
  <!-- /wp:heading -->

  <!-- wp:paragraph -->
  <p>Компонентная архитектура</p>
  <!-- /wp:paragraph -->

  <!-- wp:mytheme/button {"text":"Перейти в каталог","url":"/catalog/","variant":"primary"} /-->
</div>
<!-- /wp:group -->

Плюс WordPress — пользователи и контент-менеджеры могут собирать страницы сайта из блоков без участия разработчика.

Минус — более высокий порог входа при создании сложных переиспользуемых компонентов для разработчиков.

5. Bitrix CMS

Bitrix имеет собственную, довольно «тяжёлую», но мощную компонентную систему.

Компонент кнопки (local/components/my/button/):

// component.php
$arResult["TEXT"]    = $arParams["TEXT"] ?? "Кнопка";
$arResult["URL"]     = $arParams["URL"] ?? "#";
$arResult["VARIANT"] = $arParams["VARIANT"] ?? "primary";
$arResult["SIZE"]    = $arParams["SIZE"] ?? "md";

$this->IncludeComponentTemplate();
// template.php
<a href="<?= htmlspecialcharsbx($arResult["URL"]) ?>"
   class="btn btn-<?= htmlspecialcharsbx($arResult["VARIANT"]) ?> btn-<?= htmlspecialcharsbx($arResult["SIZE"]) ?>">
  <?= htmlspecialcharsbx($arResult["TEXT"]) ?>
</a>

Шаблон страницы (Hero — обычная секция):

<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Главная");
?>

<section class="hero">
  <div class="container">
    <h1 class="hero__title">Современный сайт на Bitrix</h1>
    <p class="hero__subtitle">Компонентная архитектура с общей кнопкой</p>

    <div class="hero__actions">
      <?$APPLICATION->IncludeComponent(
        "my:button",
        "",
        [
          "TEXT"    => "Перейти в каталог",
          "URL"     => "/catalog/",
          "VARIANT" => "primary",
          "SIZE"    => "lg",
        ]
      );?>
    </div>
  </div>
</section>

<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); ?>

В Bitrix компонент — это полноценный PHP-модуль с параметрами, шаблонами и кэшированием. Секции страниц при этом чаще всего остаются обычной разметкой.

Сравнительная таблица

ПлатформаТип компонентаСинтаксис вставкиУровень изоляцииУдобство для контент-менеджераПроизводительность
Astro.astro-файл<Button />ВысокийСреднийОтличная
Next.jsReact-компонент<Button />МаксимальныйНизкий (нужен код)Высокая
LaravelBlade-компонент<x-button>ВысокийНизкийВысокая
WordPressGutenberg-блок / Pattern<!-- wp:... -->СреднийВысокийСредняя
BitrixPHP-компонентIncludeComponent()СреднийСреднийСредняя

Выводы и рекомендации

Главный принцип современной компонентной архитектуры остаётся одним:

Общие элементы интерфейса (кнопки, поля, карточки, модалки) должны существовать в одном месте.

Секции страниц могут быть простой разметкой, которая эти компоненты использует.

Именно такой подход — разделение на переиспользуемые компоненты и секции страниц — позволяет проектам оставаться поддерживаемыми годами, а не превращаться в монолитный спагетти-код.

Рекомендации:

  1. Если нужна максимальная производительность и современный DX — Astro или Next.js.
  2. Если проект на PHP и важна чистота серверного кода — Laravel Blade Components.
  3. Если сайт активно наполняется редакторами — WordPress с block-темой.
  4. Если уже есть экосистема Bitrix — используйте её компонентную систему, но выносите общие элементы (кнопки, карточки, формы) в отдельные компоненты.
Фото аватара

Antony I

Веб разработчик, специализация на лучших мировых практиках: WordPress, WooCommerce, NextJS, Strapi, JAMStack ...

Основные типы проектов: CMS, eCommerce, SEO, LMS, ECM, BPM

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *