Пример 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"
}
}
Типы поддерживаемых элементов
Система поддерживает пять базовых типов блоков, которые покрывают большинство сценариев создания простых лендингов:
-
Заголовок (
header)- Параметры — текст, уровень вложенности (H1-H3), выравнивание.
- Назначение: создание иерархии заголовков.
-
Текст (
text)- Параметры: текстовый контент, выравнивание.
- Назначение: размещение основного описания или статейного текста.
-
Изображение (
image)- Параметры — URL источника, альтернативный текст, ширина.
- Назначение: вставка графического контента.
-
Кнопка (
button)- Параметры — текст, ссылка назначения, стиль оформления.
- Назначение: создание интерактивных элементов навигации или призыва к действию.
-
Разделитель (
divider)- Параметры: цвет линии.
- Назначение: визуальное разделение секций контента.
Поэтапная реализация функционала
Создание приложения происходит последовательно через реализацию классов и методов обработки данных.
Шаг 1 — Инициализация и настройка окружения
Процесс начинается с создания класса PageBuilder, который инкапсулирует всю логику приложения. Конструктор класса выполняет следующие действия:
- Инициализирует пустой массив для хранения элементов.
- Задает начальный счетчик уникальных ID.
- Загружает сохраненные данные из
localStorage, если они существуют. - Вызывает метод отрисовки холста.
Этапы настройки включают привязку обработчиков событий к кнопкам панели инструментов. Каждый клик по кнопке типа элемента вызывает метод добавления нового блока в массив данных.
Шаг 2 — Генерация дефолтного контента
При выборе типа элемента система автоматически заполняет объект данными по умолчанию. Это обеспечивает мгновенную обратную связь и готовность элемента к редактированию.
Пример алгоритма генерации контента:
- Для заголовка устанавливается текст "Новый заголовок" и уровень H2.
- Для изображения используется заглушка с плейсхолдером и шириной 100%.
- Для кнопки задается стандартный текст и ссылка-заглушка.
Такой подход упрощает пользовательский опыт, исключая необходимость ручного ввода базовых значений перед началом работы.
Шаг 3 — Рендеринг интерфейса
Метод render отвечает за полное обновление видимой части страницы на основе текущего состояния данных. Алгоритм работы метода:
- Очистка внутреннего HTML контейнера холста.
- Проход по массиву элементов.
- Создание DOM-элемента
divдля каждого блока. - Добавление стилей для выделения выбранного элемента.
- Вставка контента внутрь элемента через вызов специализированного метода рендеринга.
- Добавление панели управления (кнопки редактирования и удаления) поверх блока.
- Привязка событий перетаскивания (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. Система обрабатывает события начала перетаскивания, наведения и завершения операции.
Алгоритм перемещения:
- При событии
dragstartсохраняется ID перетаскиваемого элемента. - При событии
dropопределяется ID целевого элемента. - Выполняется изменение порядка элементов в массиве данных: исходный элемент удаляется со своего места и вставляется перед целевым.
- Происходит сохранение нового порядка в
localStorage. - Холст перерисовывается с учетом новой последовательности.
Данный механизм позволяет пользователю свободно структурировать контент страницы интуитивно понятным способом.
Шаг 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 — о разделе |