Atomico — это современная библиотека для создания веб-компонентов на базе реактивной модели данных, которая делает управление состоянием компонентов эффективным и предсказуемым. Одной из ключевых возможностей является батчинг обновлений, позволяющий минимизировать количество перерисовок и оптимизировать производительность приложения.
Каждый компонент Atomico строится вокруг реактивных
сигналов (signal). Сигналы позволяют хранить
состояние и автоматически отслеживать зависимости между состоянием и
представлением:
import { c, useSignal } from "atomico";
function Counter() {
const count = useSignal(0);
return () => (
<host>
<button oncl ick={() => count.value++}>Increment</button>
<p>{count.value}</p>
</host>
);
}
customElements.define("x-counter", c(Counter));
Здесь useSignal создаёт реактивное состояние
count. Любое изменение count.value
автоматически инициирует обновление DOM.
Если несколько сигналов обновляются в одном цикле событий, каждый вызов изменения триггерит отдельную перерисовку. В крупных приложениях это может привести к неоправданно большому количеству перерисовок, снижая производительность.
Пример:
const a = useSignal(1);
const b = useSignal(2);
function updateValues() {
a.value++;
b.value++;
}
Без батчинга a и b будут инициировать
отдельные обновления DOM.
Atomico использует встроенный механизм батчинга, который собирает все изменения сигналов, произошедшие в рамках одного цикла микротасков, и применяет их одним обновлением. Это обеспечивает:
Пример использования батчинга:
import { batch } from "atomico";
const countA = useSignal(0);
const countB = useSignal(0);
function updateBoth() {
batch(() => {
countA.value++;
countB.value++;
});
}
Вызов batch гарантирует, что обе переменные изменятся
одним обновлением, а DOM перерисуется только один
раз.
Atomico использует очередь обновлений, которая запускается после завершения синхронного кода. Когда сигнал изменяется:
Promise.resolve().then(...).Такой подход предотвращает множественные перерисовки, даже если обновления происходят в разных местах кода.
При работе с асинхронным кодом батчинг сохраняет корректность реактивного состояния:
async function fetchData() {
const data1 = await fetch("/api/data1").then(r => r.json());
const data2 = await fetch("/api/data2").then(r => r.json());
batch(() => {
signal1.value = data1;
signal2.value = data2;
});
}
Без batch каждый signal.value = data
инициировал бы отдельное обновление, что увеличивало нагрузку на
DOM.
Если один сигнал зависит от другого, батчинг обеспечивает детерминированный порядок обновлений:
const a = useSignal(1);
const b = useSignal(() => a.value * 2);
batch(() => {
a.value = 3;
// b автоматически пересчитается перед обновлением DOM
});
Atomico гарантирует, что все вычисляемые сигналы пересчитаются один раз после завершения батча.
batch при множественных
обновлениях состояния в одном событии.Батчинг обновлений — это ключевой инструмент для
масштабируемых компонентов Atomico. Он позволяет минимизировать
количество перерисовок, сохраняет консистентность состояния и
обеспечивает высокую производительность даже при интенсивных изменениях
данных. Эффективное использование batch — залог плавного и
отзывчивого интерфейса в сложных приложениях.