Перейти к основному содержимому

Пример No-Code приложения

Разработчику Аналитику Тестировщику
Архитектору Руководителю

В обзорной статье вы уже видели демо-блок с кнопками и полями. Здесь — тот же принцип в разборе — один HTML-файл имитирует no-code конструктор (панель блоков, холст, модальное редактирование, экспорт готовой страницы). Это учебная модель, чтобы понять, из чего состоят настоящие NCP — состояние (массив элементов), рендер в DOM, события, локальное хранилище.

Если вы учите JavaScript, сравните этот пример с компонентным фреймворком: вместо JSX — ручной render(), вместо Redux — массив elements и localStorage.

Как читать статью

Сначала пробегите Архитектуру и структуру данных

откройте полный код и найдите в нём класс PageBuilder. Пошаговые заголовки ниже соответствуют методам класса.


Полный код конструктора

Код ITЗагрузка примера кода…


Архитектура решения

Приложение строится на основе трех ключевых компонентов:

  • Интерфейс пользователя (UI): Панель инструментов для добавления элементов и холст для размещения контента.
  • Модель данных: Структура, хранящая информацию о каждом элементе страницы (тип, контент, стили).
  • Логика рендеринга: Механизм преобразования модели данных в визуальные элементы HTML.

Основные характеристики архитектуры

КомпонентОписаниеТехнологии
Single Page ApplicationПриложение не перезагружает страницу при действиях пользователя. Все изменения происходят динамически.Vanilla JavaScript
State ManagementСостояние приложения хранится в одном объекте и синхронизируется с интерфейсом.Класс ES6 + LocalStorage
Event DelegationОбработчики событий привязываются к контейнерам, а не к каждому элементу отдельно, что оптимизирует производительность.addEventListener
Offline FirstДанные сохраняются локально в браузере, обеспечивая работу без интернета.localStorage API

Структура данных

Центральным элементом системы является массив объектов, каждый из которых представляет один блок на странице. Объект содержит идентификатор, тип элемента и его содержимое.


Схема объекта элемента

{
id: 1, // Уникальный числовой идентификатор
type: "header", // Тип элемента: header, text, image, button, divider
content: { // Контейнер для специфичных параметров
text: "Заголовок",
level: "h2",
align: "center"
}
}

Типы поддерживаемых элементов

Система поддерживает пять базовых типов блоков, которые покрывают большинство сценариев создания простых лендингов:

  1. Заголовок (header)

    • Параметры — текст, уровень вложенности (H1-H3), выравнивание.
    • Назначение: создание иерархии заголовков.
  2. Текст (text)

    • Параметры: текстовый контент, выравнивание.
    • Назначение: размещение основного описания или статейного текста.
  3. Изображение (image)

    • Параметры — URL источника, альтернативный текст, ширина.
    • Назначение: вставка графического контента.
  4. Кнопка (button)

    • Параметры — текст, ссылка назначения, стиль оформления.
    • Назначение: создание интерактивных элементов навигации или призыва к действию.
  5. Разделитель (divider)

    • Параметры: цвет линии.
    • Назначение: визуальное разделение секций контента.

Поэтапная реализация функционала

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


Шаг 1 — Инициализация и настройка окружения

Процесс начинается с создания класса PageBuilder, который инкапсулирует всю логику приложения. Конструктор класса выполняет следующие действия:

  • Инициализирует пустой массив для хранения элементов.
  • Задает начальный счетчик уникальных ID.
  • Загружает сохраненные данные из localStorage, если они существуют.
  • Вызывает метод отрисовки холста.

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


Шаг 2 — Генерация дефолтного контента

При выборе типа элемента система автоматически заполняет объект данными по умолчанию. Это обеспечивает мгновенную обратную связь и готовность элемента к редактированию.

Пример алгоритма генерации контента:

  • Для заголовка устанавливается текст "Новый заголовок" и уровень H2.
  • Для изображения используется заглушка с плейсхолдером и шириной 100%.
  • Для кнопки задается стандартный текст и ссылка-заглушка.

Такой подход упрощает пользовательский опыт, исключая необходимость ручного ввода базовых значений перед началом работы.


Шаг 3 — Рендеринг интерфейса

Метод render отвечает за полное обновление видимой части страницы на основе текущего состояния данных. Алгоритм работы метода:

  1. Очистка внутреннего HTML контейнера холста.
  2. Проход по массиву элементов.
  3. Создание DOM-элемента div для каждого блока.
  4. Добавление стилей для выделения выбранного элемента.
  5. Вставка контента внутрь элемента через вызов специализированного метода рендеринга.
  6. Добавление панели управления (кнопки редактирования и удаления) поверх блока.
  7. Привязка событий перетаскивания (Drag and Drop) для каждого блока.

Важным аспектом является использование атрибутов data-id для связывания DOM-элементов с объектами данных. В браузере к ним обращаются через element.dataset (кнопки панели — data-type). Так no-code платформы хранят связь "блок на экране ↔ запись в модели".

В продакшене вместо localStorage будет API бэкенда, вместо одного HTML — сборка и хостинг; паттерн модель → render → событие → сохранение остаётся тем же. См. веб на Python и REST для следующего шага после конструктора.


Шаг 4 — Редактирование свойств

Редактирование реализуется через модальное окно, которое открывается при клике на кнопку карандаша. Логика процесса включает:

  • Определение типа текущего редактируемого элемента.
  • Динамическая генерация формы ввода на основе типа элемента.
    • Для заголовка создаются поля для текста, уровня заголовка и выравнивания.
    • Для изображения — поля для URL, alt-текста и ширины.
  • Сохранение введенных данных обратно в объект модели.
  • Перерисовка холста для отображения изменений.

Форма редактирования адаптируется под контекст, предоставляя только необходимые параметры для конкретного типа контента.


Шаг 5 — Управление порядком элементов

Перемещение блоков осуществляется методом Drag and Drop. Система обрабатывает события начала перетаскивания, наведения и завершения операции.

Алгоритм перемещения:

  1. При событии dragstart сохраняется ID перетаскиваемого элемента.
  2. При событии drop определяется ID целевого элемента.
  3. Выполняется изменение порядка элементов в массиве данных: исходный элемент удаляется со своего места и вставляется перед целевым.
  4. Происходит сохранение нового порядка в localStorage.
  5. Холст перерисовывается с учетом новой последовательности.

Данный механизм позволяет пользователю свободно структурировать контент страницы интуитивно понятным способом.


Шаг 6 — Экспорт и предпросмотр

Приложение предоставляет два способа вывода результата:

Предпросмотр: Открывает новое окно браузера, куда копируется чистый HTML-код текущей структуры. Код включает минимальные стили для корректного отображения контента. Это позволяет оценить внешний вид страницы до финального сохранения.

Экспорт HTML: Генерирует полный файл .html, содержащий структуру и встроенные стили. Файл скачивается на устройство пользователя как автономная страница. Экспортированный код не зависит от скрипта редактора и может быть размещен на любом хостинге.

Процесс экспорта использует Blob API для создания бинарного объекта из строки кода и инициирует скачивание через временную ссылку.


Работа с данными и сохранение

Для обеспечения непрерывности работы между сеансами браузеров применяется технология localStorage.


Механизм сохранения

После любого изменения данных (добавление, удаление, редактирование, перемещение) вызывается метод saveToLocalStorage. Он сериализует массив элементов и текущее значение счетчика ID в JSON-строку и сохраняет их в хранилище браузера.


Механизм загрузки

При инициализации приложения метод loadFromLocalStorage проверяет наличие сохраненных данных. Если данные найдены, они десериализуются обратно в объекты JavaScript, восстанавливая состояние предыдущего сеанса.

Это решение гарантирует, что пользователь не потеряет прогресс при закрытии вкладки или обновлении страницы.


Безопасность и валидация

При работе с пользовательским вводом критически важна защита от инъекций вредоносного кода.


Экранирование HTML

Все текстовые данные, поступающие от пользователя, проходят процедуру экранирования перед вставкой в DOM. Специальный метод escapeHtml заменяет специальные символы (<, >, &, ", ') на их HTML-сущности.

Это предотвращает выполнение скриптов, внедренных через поле ввода текста, и гарантирует, что пользовательские данные будут отображены исключительно как текст, а не как исполняемый код. В коммерческих no-code платформах ту же роль играют санитайзеры и ограниченный набор виджетов; при экспорте "чистого HTML" ответственность за XSS переходит на вас — см. основы ИБ.


Ограничения функционала

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


Расширение возможностей

Базовая архитектура проекта допускает масштабирование и добавление новых функций без переписывания ядра системы.


Возможные направления развития

  • Стили CSS: Добавление возможности выбора шрифтов, цветов фона и отступов через глобальные настройки темы.
  • Сложные компоненты: Внедрение сеток, форм обратной связи и галерей изображений.
  • Интеграция: Подключение внешних API для загрузки изображений из облачных хранилищ.
  • Мультиязычность: Реализация поддержки различных языков интерфейса и контента.
  • Версионирование: Возможность отката к предыдущим версиям страницы или сравнения изменений.

Что читать дальше

ТемаСтатья
Зачем low-code бизнесу, риски платформLow-code и No-code платформы
Этапы внедрения в компанииВнедрение в бизнес
Язык, на котором написан примерJavaScript — о разделе