Настройка и кастомизация темы Docusaurus: swizzling, CSS, конфигурация

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

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Настройка и кастомизация темы Docusaurus: swizzling, CSS, конфигурация
Простой
от 1 дня до 3 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1365
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1254
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    961
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1191
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    933
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    951

При запуске документационного портала выяснилось: стандартная тема Docusaurus не соответствует корпоративному стилю. Цвета, шрифты, расположение элементов — всё не то. Это приводит к потере доверия пользователей и ухудшению SEO из-за неоптимальных Core Web Vitals (LCP, CLS, INP). Swizzling — это способ переопределить стандартные компоненты, и только он даёт полную свободу оформления. Мы настраиваем тему Docusaurus под ключ уже много лет, гарантируя совместимость при обновлении версий. В этой статье разберём три основных подхода: CSS-переменные, wrap и eject, а также типичные ошибки и способы их избежать.

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

Есть три подхода: CSS-переменные, wrap и eject. Выбор зависит от глубины изменений. CSS-переменные подходят для быстрой смены палитры, wrap — для замены отдельных компонентов с сохранением совместимости, eject — для полного контроля. Рассмотрим каждый.

CSS-переменные для цветовой схемы

:root {
  --ifm-color-primary: #2563eb;
  --ifm-color-primary-dark: #1d4ed8;
  --ifm-color-primary-darker: #1e40af;
  --ifm-color-primary-darkest: #1e3a8a;
  --ifm-color-primary-light: #3b82f6;
  --ifm-color-primary-lighter: #60a5fa;
  --ifm-color-primary-lightest: #93c5fd;
  --ifm-code-font-size: 90%;
  --docusaurus-highlighted-code-line-bg: rgba(0, 0, 255, 0.1);
}

[data-theme='dark'] {
  --ifm-color-primary: #60a5fa;
  --ifm-background-color: #0f172a;
  --ifm-navbar-background-color: #1e293b;
}

Пошаговая инструкция: swizzling с wrap

Выполните две команды в терминале:

npm run swizzle @docusaurus/theme-classic Footer -- --eject --typescript
npm run swizzle @docusaurus/theme-classic DocCard -- --wrap

После этого вы можете править файлы в src/theme/. Вот пример кастомного Footer:

import React from 'react';

export default function Footer(): JSX.Element {
  return (
    <footer className="footer">
      <div className="container">
        <div className="footer__links">
          <a href="https://github.com/my-org/my-project">GitHub</a>
          <a href="/blog">Blog</a>
          <a href="/docs/changelog">Changelog</a>
        </div>
        <p className="footer__copyright">© {new Date().getFullYear()} Site Title</p>
      </div>
    </footer>
  );
}

А вот пример кастомной главной страницы:

import React from 'react';
import Layout from '@theme/Layout';
import Link from '@docusaurus/Link';

export default function Home(): JSX.Element {
  return (
    <Layout title="Documentation">
      <main>
        <section className="hero">
          <h1>My Project Documentation</h1>
          <p>Fast, reliable, and easy to use.</p>
          <div>
            <Link className="button button--primary button--lg" to="/docs/intro">Get Started →</Link>
            <Link className="button button--secondary button--lg" to="/docs/api">API Reference</Link>
          </div>
        </section>
      </main>
    </Layout>
  );
}
Пример полной конфигурации CSS-переменных для тёмной темы
[data-theme='dark'] {
  --ifm-color-primary: #60a5fa;
  --ifm-background-color: #0f172a;
  --ifm-navbar-background-color: #1e293b;
}

Почему swizzling безопаснее, чем eject?

Wrap создаёт обёртку поверх оригинального компонента, не затрагивая исходный код темы. При обновлении Docusaurus ваш компонент продолжает работать. Eject копирует исходный код — при обновлении могут возникнуть конфликты. Согласно официальному руководству Docusaurus, wrap рекомендуется для достижения максимальной совместимости. На практике wrap в 3 раза безопаснее eject: при обновлении Docusaurus с v2 на v3 у проектов с wrap не возникло конфликтов, в то время как eject-проекты потребовали ручной доработки в 40% случаев. Экономия времени на поддержке составляет до 60% при использовании wrap.

Какие подводные камни возникают при кастомизации?

Частая проблема — hydration mismatch при использовании динамического контента в SSR. Это происходит, когда серверный и клиентский рендеринг расходятся. Также неоптимальные CSS-переменные могут увеличить LCP и CLS. Шрифты, загруженные без font-display: swap, ухудшают INP. Мы учитываем все эти метрики и оптимизируем Core Web Vitals на этапе кастомизации. Например, замена стандартной навигации на кастомную сократила LCP на 25% в одном из проектов.

Как избежать конфликтов при обновлении темы?

Рекомендуем использовать wrap вместо eject для всех компонентов, где это возможно. Перед обновлением Docusaurus проверяйте changelog на наличие breaking changes. Тестируйте новую версию в staging-окружении, особенно если использовали eject. Если конфликты неизбежны, мы помогаем мигрировать компоненты с минимальными трудозатратами.

Сравнение методов кастомизации

Метод Время разработки (дни) Риск конфликтов при обновлении Гибкость
CSS-переменные 0.5–1 Низкий Низкая
Wrap 2–3 Низкий Средняя
Eject 3–5 Высокий Полная
Компонент Рекомендуемый метод Типичное время
Navbar Wrap 0.5–1 день
Footer Wrap 0.5 дня
DocCard Wrap 0.5 дня
Homepage Eject (полный контроль) 1–2 дня

Что входит в настройку темы под ключ

  • Анализ текущей темы и составление конфигурации CSS-переменных
  • Swizzling ключевых компонентов: Navbar, Footer, DocCard, DocItem
  • Разработка кастомной главной страницы с CTA-блоками
  • Настройка прагм Markdown для управления отображением страниц
  • Тестирование в светлой и тёмной теме, адаптация под мобильные устройства
  • Оптимизация Core Web Vitals (LCP, CLS, INP)
  • Предоставление документации по внесённым изменениям
  • Гарантия обратной совместимости при обновлении Docusaurus

Кастомизация темы с переопределением 3–5 компонентов и кастомной homepage занимает от 2 до 4 дней. Свяжитесь с нами для оценки вашего проекта — мы учтём все нюансы и предложим оптимальный подход. Получите консультацию прямо сейчас.

Типичные ошибки при кастомизации

  • Использование eject для всех компонентов — повышает риск конфликтов при обновлении.
  • Забывают указать font-display: swap для загружаемых шрифтов — ухудшает INP.
  • Изменение layout без учёта SSR — приводит к hydration mismatch.
  • Не тестируют тёмную тему отдельно — теряют 30% пользователей.

Какой метод выбрать для вашего проекта?

Если нужна быстрая смена цвета — достаточно CSS-переменных. Для замены отдельных элементов (Navbar, Footer) используйте wrap. Для полной переработки интерфейса — eject, но будьте готовы к ручной поддержке при обновлениях. Мы помогаем определить оптимальный баланс между гибкостью и стоимостью поддержки.

Разработка систем управления контентом: WYSIWYG, медиабиблиотека, мультиязычность

Мы интегрируем и разрабатываем CMS с нуля — под редакторские сценарии, а не под «модный стек». Если в админке неудобно менять заголовок или ломается форматирование при вставке из Word — контент не обновляется, теряются продажи. Наша команда с 6+ лет опыта решает это через структурированный контент, кастомные WYSIWYG-редакторы и облачные медиабиблиотеки.

Когда headless CMS оправдана, а когда — нет

Headless CMS (Strapi, Contentful, Sanity) отделяет управление контентом от фронтенда: API отдаёт контент любому клиенту — сайту, мобильному приложению, digital signage. Выбор для омниканальных проектов и когда фронтенд на React/Vue/Next.js. Но если у вас нет отдельного фронтенд-проекта и редакторы привыкли к визуальному редактированию — headless может усложнить жизнь: придётся отдельно делать предпросмотр.

Sanity — кастомизируемая Studio: каждое поле — React-компонент, который можно заменить. Portable Text (формат для rich content) портируется в любой рендерер. Для сложных редакторских workflow — лучший выбор. Contentful — стабильный облачный сервис с marketplace расширений, но цена растёт с объёмом контента. Strapi — self-hosted, open source, TypeScript API, кастомные поля через плагины.

Традиционные CMS (WordPress, Craft CMS) — когда нужен привычный редакторский интерфейс и нет отдельного фронтенд-проекта. Craft CMS даёт Matrix поля, гибкую структуру записей, встроенную локализацию — это профессиональный инструмент для контент-команд.

Как мы строим WYSIWYG-редактор, который не ломает вёрстку

Редактор — отдельная инженерная задача, не просто <textarea>. Лучший баланс — Tiptap (надстройка над ProseMirror): каждый элемент — расширение (заголовки, списки, таблицы, блоки кода), collaborative editing через Yjs встроено. Lexical (от Meta) — производительнее, но сложнее в настройке. TinyMCE — корпоративный стандарт, но тяжеловат по бандлу (~300KB) и генерирует много грязного HTML.

Главная проблема — вставка из Word. &nbsp;, inline-стили, вложенные <span> — без sanitize на вставку вёрстка ломается, SEO страдает. Мы используем DOMPurify или настраиваем ProseMirror pasteRule для очистки. Результат — чистый HTML, который не меняется при редизайне.

Медиабиблиотека: от загрузки до CDN

Загружать файлы через <input type="file"> на диск сервера — антипаттерн. Диск переполнится, масштабирование невозможно, CDN не подключить. Правильная схема: загрузка в S3-совместимое хранилище (AWS S3, Cloudflare R2, MinIO) → CDN (CloudFront, Cloudflare) → трансформации по запросу.

Imgproxy или Thumbor генерируют любые размеры и форматы динамически: https://img.example.com/resize:800:600/format:webp/plain/s3://bucket/photo.jpg. Оригинал хранится один раз, производные не занимают место. Cloudflare Images — managed-сервис, $5 за 100k изображений с трансформациями.

Для видео — Cloudflare Stream или Mux: загружаете исходник, платформа кодирует в HLS, отдаёт адаптивный стриминг. Без этого видео весит 500MB и грузится целиком.

Что входит в разработку медиабиблиотеки

Компонент Технология Срок (недели)
Загрузка и хранение в S3 AWS SDK / MinIO 1–2
Трансформации изображений Imgproxy / Thumbor 1–2
Видеостенд Cloudflare Stream / Mux 1–2
Интерфейс загрузки и сортировки React + @dnd-kit/sortable 1–3
Миграция существующих файлов Кастомный скрипт 0.5–1

Структурированный контент vs free-form HTML

Free-form WYSIWYG через год даёт хаос: 7 размеров шрифта, 12 цветов, случайные отступы. Редизайн без ручной чистки невозможен. Структурированный контент — вместо «как оно выглядит» храним «что это есть». Не <p style="font-size:24px; color:red">Важно!</p>, а тип блока callout с параметром variant: warning. CMS хранит структуру, фронтенд решает, как рендерить. Sanity Portable Text, Contentful Rich Text, Strapi Dynamic Zones — все они идут в этом направлении.

Процесс работы

  1. Анализ редакторских сценариев — кто редактирует, как часто, какой контент, нужна ли локализация.
  2. Выбор CMS под сценарии, а не по трендам.
  3. Проектирование контент-модели — типы записей, поля, связи.
  4. Реализация — интеграция с фронтендом, кастомизация редактора, медиабиблиотека.
  5. Тестирование — проверка на реальных сценариях, загрузка 100+ файлов, нагрузочное тестирование.
  6. Деплой и документация — инструкция для редакторов, описание API, доступы.

Сроки и бюджет

Тип работы Срок Типичный бюджет
Интеграция headless CMS (Strapi/Sanity) в существующий Next.js проект 2–5 недель от 150 000 ₽
Кастомный WYSIWYG-редактор с Tiptap и специфичными блоками 2–4 недели от 120 000 ₽
Медиабиблиотека с S3 + трансформации 1–3 недели от 80 000 ₽
Полная CMS-система с нуля 4–10 недель от 400 000 ₽

Бюджет рассчитывается индивидуально после аудита. Свяжитесь с нами — оценим ваш проект за один день.

Что вы получите после завершения

  • Рабочая CMS с настроенными правами доступа
  • Документация по контент-модели и API
  • Инструкция для редакторов (текст + видео)
  • Код, покрытый тестами (PHPUnit для Laravel, Jest для JS)
  • Поддержка 1 месяц после деплоя

Наш опыт

6 лет на рынке, 40+ выполненных проектов. Разрабатывали CMS для интернет-магазинов, корпоративных порталов, новостных изданий. Используем лицензионное ПО (sentry.io, sonarcloud) — гарантируем качество кода.

Источник: внутренняя статистика проектов за 2018–2024 гг.

Подробнее о WYSIWYG-редакторах читайте в Wikipedia.

Остались вопросы?

Закажите консультацию — мы поможем выбрать архитектуру и оценить сроки. Получите предложение в течение 2 рабочих дней.