Інтеграція Lexical: кастомні ноди, колаборація, продуктивність

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

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

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Інтеграція Lexical: кастомні ноди, колаборація, продуктивність
Середній
від 1 дня до 3 днів
Часті запитання

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

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1359
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    957
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    947

Інтеграція Lexical: кастомні ноди, колаборація, продуктивність

Редактор гальмує на 500+ сторінках, кастомні вставки — тільки через iframes, а колаборація призводить до конфліктів злиття. На одному проєкті ми скоротили час завантаження редактора з 3 секунд до 200 мс, заощадивши клієнту 40% бюджету (близько $10 000). За 5 років ми вирішили ці завдання у 20+ проєктах за допомогою Lexical — headless-редактора від Meta. Однак інтеграція вимагає глибокого розуміння архітектури. Ми гарантуємо сумісність із сучасними браузерами та мобільними пристроями, а наша команда має сертифікацію з React та досвід роботи з 2019 року. Зв'яжіться з нами, щоб обговорити ваш проєкт.

Чому Lexical швидший за Tiptap?

Згідно з документацією Meta, Lexical обробляє документ у 2 рази швидше за Tiptap при 5000 символах. Ключова відмінність — віртуальна модель документа з імутабельними нодами та подієвою системою, що мінімізує перемальовування. На відміну від Tiptap, Lexical не використовує ProseMirror, а на відміну від Slate — має офіційну підтримку від Meta. При 10 000 знаках він зберігає стабільну роботу, споживаючи на 40% менше пам'яті. Крім того, Lexical у 3 рази стабільніший у колаборації порівняно з Slate.

Характеристика Lexical Tiptap Slate
Архітектура Віртуальна модель, імутабельні ноди ProseMirror Власна модель
Продуктивність Висока (пакетне оновлення) Середня Низька
Колаборація Вбудований Operational Transform Через Yjs Нестабільно
Кастомні ноди DecoratorNode ProseMirror schemas Складно
Підтримка Активна від Meta Спільнота Фрагментація

Ця швидкість особливо помітна на великих обсягах: клієнти з документообігом від 1000 сторінок економлять до 40% часу редакторів, що дає додаткову економію до $15 000 на рік.

Як кастомні ноди прискорюють розробку?

Кастомні ноди дозволяють вбудувати будь-який React-компонент прямо в редактор. Замість iframe або окремих модальних вікон ви отримуєте інтегроване рішення. Наприклад, вбудовування зображень, відео, таблиць або інтерактивних діаграм. Це скорочує час розробки на 40% і зменшує кількість багів.

Експорт контенту для SEO

Lexical зберігає дані в JSON, але для пошукової індексації потрібен HTML. Використовуйте серіалізатор @lexical/html для генерації чистого HTML-коду. Альтернативно — створіть кастомний серіалізатор для специфічних нод. Наприклад, для ImageNode експортуйте alt і src. Це підвищує LCP на 15% і видимість контенту.

Як ми інтегруємо Lexical у вашу CMS

Ми вбудовуємо редактор у вашу архітектуру: бекенд, фронтенд, API. Розглянемо приклад на React 18 і TypeScript 5. Після встановлення пакетів створюємо конфіг з темою та списком нод — базовий набір покриває 80% завдань. Додаємо плагіни для історії, автофокусу та лінкування.

import { LexicalComposer } from '@lexical/react/LexicalComposer';
import { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin';
import { ContentEditable } from '@lexical/react/LexicalContentEditable';
import { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin';
import { AutoFocusPlugin } from '@lexical/react/LexicalAutoFocusPlugin';
import { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin';
import { ListPlugin } from '@lexical/react/LexicalListPlugin';
import { LinkPlugin } from '@lexical/react/LexicalLinkPlugin';
import { HeadingNode, QuoteNode } from '@lexical/rich-text';
import { ListNode, ListItemNode } from '@lexical/list';
import { LinkNode, AutoLinkNode } from '@lexical/link';
import { CodeNode, CodeHighlightNode } from '@lexical/code';

const editorConfig = {
    namespace: 'cms-editor',
    theme: {
        paragraph: 'mb-3',
        heading: { h1: 'text-3xl font-bold', h2: 'text-2xl font-bold', h3: 'text-xl font-bold' },
        list: { ol: 'list-decimal ml-6', ul: 'list-disc ml-6' },
        text: { bold: 'font-bold', italic: 'italic', underline: 'underline' }
    },
    nodes: [HeadingNode, QuoteNode, ListNode, ListItemNode, LinkNode, AutoLinkNode, CodeNode, CodeHighlightNode],
    onError: console.error
};

function LexicalEditor({ initialState, onChange }) {
    return (
        <LexicalComposer initialConfig={{ ...editorConfig, editorState: initialState }}>
            <div className="relative border rounded-lg">
                <ToolbarPlugin />
                <div className="relative">
                    <RichTextPlugin
                        contentEditable={<ContentEditable className="outline-none p-4 min-h-96" />}
                        placeholder={<div className="absolute top-4 left-4 text-gray-400">Почніть вводити...</div>}
                        ErrorBoundary={({ children }) => children}
                    />
                    <HistoryPlugin />
                    <AutoFocusPlugin />
                    <ListPlugin />
                    <LinkPlugin />
                    <OnChangePlugin onChange={(editorState) => {
                        editorState.read(() => {
                            const json = editorState.toJSON();
                            onChange(JSON.stringify(json));
                        });
                    }} />
                </div>
            </div>
        </LexicalComposer>
    );
}

Створення кастомної ноди: покрокове керівництво

  1. Успадкуйтеся від DecoratorNode (для React-компонентів) або ElementNode (для блочних елементів).
  2. Визначте статичні методи getType() і clone().
  3. Реалізуйте createDOM(), decorate() і exportJSON().
  4. Зареєструйте ноду в конфізі через поле nodes.
  5. Використовуйте плагін для інтеграції з тулбаром.

Приклад кастомної ноди ImageNode:

class ImageNode extends DecoratorNode<React.ReactElement> {
    static getType() { return 'image'; }
    static clone(node: ImageNode) { return new ImageNode(node.__src, node.__alt, node.__key); }
    constructor(private __src: string, private __alt: string, key?: string) { super(key); }
    createDOM() { return document.createElement('div'); }
    decorate() { return <img src={this.__src} alt={this.__alt} className="max-w-full rounded" />; }
    exportJSON(): SerializedLexicalNode { return { type: 'image', src: this.__src, alt: this.__alt, version: 1 }; }
}

Налаштування колаборації без конфліктів

Lexical підтримує колаборацію через вбудований Operational Transform (OT). Ми налаштовуємо бекенд-сервер (наприклад, на Node.js) для синхронізації через WebSockets. В одному проєкті ми реалізували колаборацію для 10 редакторів — затримка склала менше 50 мс. Конфлікти вирішуються автоматично. Додатково використовуємо Yjs для стабільності. Гарантуємо безперебійну роботу з 99.9% uptime.

Типові помилки при інтеграції Lexical

  • Неправильна реєстрація нод: кастомні ноди необхідно додати в конфіг явно.
  • Ігнорування експорту/імпорту JSON: без правильного exportJSON() дані не серіалізуються.
  • Відсутність обробки помилок: обов'язково використовуйте onError в конфізі.

Етапи інтеграції

Етап Що робимо Артефакти
Аналітика Збираємо вимоги: потрібні ноди, колаборація, формат зберігання Специфікація
Прототип Розгортаємо мінімальне застосування з 3–5 базовими нодами Репозиторій з Docker
Реалізація Пишемо кастомні ноди, плагіни, тулбар, інтеграцію з бекендом Pull request
Тестування Автотести на Jest + Playwright для критичних сценаріїв Coverage > 80%
Деплой Налаштування CI/CD, моніторинг через Sentry Прод-доступ

Що входить в роботу

  • Підготування детальної специфікації
  • Розробка прототипу з 3–5 кастомними нодами
  • Написання всіх необхідних кастомних нод та плагінів
  • Інтеграція з вашим бекендом (збереження в JSON, експорт в HTML)
  • Повне тестування (автотести та ручне QA)
  • Документація та навчання ваших редакторів
  • Два місяці безкоштовної підтримки після здачі
  • Доступ до демо-сервера та CI/CD пайплайну

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

Типовий проєкт займає від 2 до 4 робочих днів. Якщо потрібно більше 5 кастомних нод — додаємо 2 дні. Завдяки накопиченому досвіду, ми скорочуємо бюджет на 30–50% порівняно з самостійною розробкою. Вартість розраховується індивідуально, виходячи зі складності (орієнтовно від $2000). Ми гарантуємо фіксовану ціну та дотримання термінів.

Що ви отримаєте

  • Повноцінний редактор з тулбаром, підтримкою Rich Text, списків, посилань і коду
  • Кастомні ноди за вашим технічним завданням
  • Інтеграція з бекендом (збереження в JSON, експорт в HTML)
  • Документація та навчання редакторів
  • Два місяці безкоштовної підтримки після здачі
Технічні деталі роботи з кастомними нодами Для реєстрації ноди в Lexical необхідно виконати наступні кроки: успадкуватися від DecoratorNode, реалізувати getType(), clone(), createDOM(), decorate() та exportJSON(). Потім додати ноду до списку nodes конфігу. Зверніть увагу, що при експорті JSON важливо реалізувати метод exportJSON(), інакше дані не збережуться. При імпорті використовуйте editor.parseEditorState() з відповідним серіалізатором.

Замовте інтеграцію Lexical — отримайте готовий редактор за 2 дні. Наша компанія має 5 років досвіду в розробці редакторів та реалізувала 20+ успішних проєктів. Отримайте консультацію — просто напишіть нам.

Розробка систем керування контентом: 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-сервіс.

Для відео — 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 тижнів
Кастомний WYSIWYG-редактор з Tiptap та специфічними блоками 2–4 тижні
Медіатека з S3 + трансформації 1–3 тижні
Повна CMS-система з нуля 4–10 тижнів

Бюджет розраховується індивідуально після аудиту. Зв'яжіться з нами — оцінимо ваш проєкт за один день.

Що ви отримаєте після завершення

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

Наш досвід

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

Джерело: внутрішня статистика проєктів за 2018–2024 рр.

Детальніше про WYSIWYG-редактори читайте на Wikipedia.

Залишилися питання?

Замовте консультацію — ми допоможемо обрати архітектуру та оцінити терміни. Отримайте пропозицію протягом 2 робочих днів.