Hyperapp — это минималистичный JavaScript-фреймворк для построения реактивных пользовательских интерфейсов. Основная цель его архитектуры — обеспечить простую и прозрачную организацию приложения при минимальном количестве кода. Структура Hyperapp строится вокруг состояния (state), действий (actions) и представления (view).
State (состояние) Состояние представляет собой объект, который хранит все данные приложения. В отличие от классических подходов, Hyperapp использует единый источник истины, где все данные сосредоточены в одном объекте.
const state = {
count: 0,
user: {
name: "Alice",
loggedIn: false
}
};
Состояние должно оставаться предсказуемым и чистым, без побочных эффектов при изменении. Любые изменения выполняются только через действия.
Actions (действия) Действия — это функции, которые изменяют состояние. Они принимают текущее состояние и возвращают новый объект состояния или часть состояния.
const actions = {
increment: (state) => ({ count: state.count + 1 }),
login: (state, payload) => ({ user: { ...state.user, loggedIn: true, name: payload.name } })
};
Важно: действия должны быть чистыми функциями и не изменять объект состояния напрямую. Используется иммутабельность, что обеспечивает корректное обновление интерфейса.
View (представление) Представление формируется с
помощью JSX или гипер-функции h. Оно зависит только от
состояния и не должно иметь собственной логики изменения состояния.
import { h } from "hyperapp";
const view = (state, actions) => (
h("div", {}, [
h("h1", {}, `Счётчик: ${state.count}`),
h("button", { onclick: actions.increment }, "Увеличить")
])
);
Каждый ререндер происходит автоматически при изменении состояния, что упрощает синхронизацию данных с интерфейсом.
Для запуска Hyperapp используется функция app, которая
связывает состояние, действия и представление. Стандартная инициализация
выглядит так:
import { app, h } from "hyperapp";
app({
init: state,
view: view,
node: document.getElementById("app"),
actions: actions
});
Пояснения к ключевым параметрам:
init — начальное состояние приложения.view — функция, формирующая DOM-структуру на основе
состояния.node — корневой элемент в DOM, куда будет рендериться
приложение.actions — объект действий для управления
состоянием.Функция app возвращает объект с теми же действиями, что
позволяет вызывать их извне или тестировать отдельные функции.
Hyperapp поддерживает разбиение приложения на компоненты, что повышает читаемость и масштабируемость. Компоненты — это функции, которые принимают состояние и действия и возвращают виртуальный DOM.
const Counter = ({ count }, { increment }) => (
h("div", {}, [
h("h2", {}, `Счёт: ${count}`),
h("button", { onclick: increment }, "Увеличить")
])
);
const view = (state, actions) => (
h("div", {}, [
h(Counter, { count: state.count }, { increment: actions.increment })
])
);
Компоненты могут быть чистыми функциями, не зависящими от глобального состояния, что облегчает их повторное использование и тестирование.
Для обработки асинхронных операций (запросы к API, таймеры) Hyperapp использует концепцию effects. Эффект — это объект или функция, которая вызывается после выполнения действия.
const fetchUser = (state, actions) => ({
type: "fetch",
url: "/api/user",
success: (data) => actions.setUser(data)
});
Эффекты позволяют сохранять чистоту действий, делая их предсказуемыми и управляемыми.
app.Такое разделение упрощает поддержку больших приложений и делает код более читаемым.
Эта структура формирует классический каркас приложения Hyperapp, который позволяет создавать как небольшие виджеты, так и масштабные одностраничные приложения с предсказуемой реактивностью и прозрачным управлением состоянием.