Palistor: декларативный MVVM-фреймворк для React, дружелюбный к ИИ
Почти каждый React-экран в корпоративных приложениях смешивает внутри компонентов три разные заботы: как экран себя ведёт (валидация, условные поля, кросс-полевые правила), откуда он берёт данные (загрузка, кэш, мутации) и как он выглядит (JSX). Пока экран маленький, это терпимо. Но по мере роста три части сплетаются так, что любое изменение задевает всё сразу: разрастается дерево из useEffect'ов, кастомных хуков и контекстов, и экран становится монолитным, непредсказуемым и трудным для тестирования.
Раньше эту сложность мы декомпозировали руками: одной кнопке порой требовалось три компонента и пара хуков, но у нас было время и навык, чтобы держать всё под контролем. Сегодня всё больше кода пишет ИИ — и вместе с этим мы теряем контроль над архитектурой. Идея Palistor строится ровно на этом наблюдении: ИИ плохо проектирует, но отлично заполняет декларативные слоты. Значит, нужно убрать саму задачу архитектуры и оставить только заполнение конфига по правилам. Сгенерированный код тогда нельзя развалить: ошибаться негде, а ревьюить нужно один плоский объект, а не дерево эффектов.
Palistor — это декларативный MVVM-подобный фреймворк для stateful, data-driven интерфейсов на React. Он разделяет фронтенд на три слоя, которые по потоку данных читаются как конвейер Model → ViewModel → View.
Три слоя: View, ViewModel и Model
Слой отображения (View) — это чистый JSX, из которого изъято всё, кроме вёрстки, рендеринга и стилей. Компонент просто читает поля формы и раскладывает их по инпутам. Ошибиться тут практически негде: примитивнее слоя не бывает.
Слой конфигурации (декларация ViewModel) — обычный объект с поведением. В одном дереве живут значения полей, их видимость, обязательность, валидация и lifecycle-колбэки. Именно сюда стянута вся необходимая сложность приложения — больше ей нигде нет.
Слой данных (Model) — вне ответственности Palistor. Это может быть простой fetch-резолвер или сложный кэширующий либо офлайн-слой. Фреймворк задаёт только интерфейс к нему через resolve, но не навязывает реализацию. При этом состояние Palistor само кэширует загруженные данные, чтобы не тянуть их из источника повторно.
Что это даёт на практике
Когда сложность декомпозирована таким образом, фронтенд можно генерировать по правилам, не теряя контроль. Бонусом к этому идёт целый ряд преимуществ:
- Гранулярные ре-рендеры: компонент подписывается только на те поля, которые реально прочитал. Состояние считается в сторе, вне рендер-цикла React, а ре-рендеры точечные вместо каскадных.
- Мгновенная конфигурация под разные режимы: регионы, законы и правила меняются правкой конфига, а не переписыванием компонентов.
- Простой дебаг: все связи между данными видны наглядно в одном месте, запутаться просто негде.
- React становится тонким отображающим слоем: никаких useEffect и сложных тонкостей рендер-цикла.
- Схема-управляемые формы: раз конфиг — это данные, его можно генерировать или отдавать с сервера.
Возможности
- Гранулярные ре-рендеры — компонент триггерит перерисовку только по полям, которые читал.
- Computed field state — видимость, обязательность, label и ошибки валидации пересчитываются автоматически по конфигу.
- Proxy API — нативный синтаксис записи значения вместо диспатча экшенов.
- Submit pipeline — beforeSubmit, validate, onSubmit и afterSubmit с показом ошибок после первого неудачного сабмита.
- Dirty tracking — флаги изменений на уровне поля и группы с обновлением baseline после resolve и reset.
- Async-резолверы — загрузка данных с авто-трекингом зависимостей, retry, optimistic updates и поддержкой React Suspense.
- Списки и сущности — нормализованный реестр сущностей, list-proxy с add/remove/setItems и per-entity шаблоны.
- Flows — пошаговые мастера через defineFlow и defineStep: навигация, ветвление и валидация по шагам.
- Field mapping — переименование пропсов поля под конвенцию вашего UI-кита (MUI, Ant Design и др.).
- Persist — автосохранение в localStorage, sessionStorage или любой кастомный драйвер вместе с навигацией флоу.
- i18n — одна регистрация транслятора, и label, placeholder и description переводятся везде.
- Тестируемость — framework-agnostic ядро полностью тестируется без React.
Проект в стадии прототипа — ждём ваших отзывов
Palistor пока находится в стадии прототипа и активно развивается. Нам важно ваше мнение: расскажите, какие сценарии вам близки, чего не хватает и что стоит улучшить. Ознакомиться с кодом, документацией и примерами можно на GitHub: https://github.com/ProjectINT/palistor