Kepler.gl строится вокруг Redux-архитектуры и React-компонентов,
поэтому жизненный цикл начинается не внутри самой библиотеки, а на
уровне интеграции контейнера KeplerGl. Первичный этап —
создание Redux-store с подключением редьюсера Kepler:
import keplerGlReducer from 'kepler.gl/reducers';
const store = createStore(
combineReducers({
keplerGl: keplerGlReducer
}),
{},
applyMiddleware(...)
);
На этом уровне формируется базовая структура состояния:
visState, mapState, uiState. Уже
здесь определяется фундамент жизненного цикла визуализации — любые
дальнейшие изменения проходят через dispatch-цепочку.
Ключевой момент: Kepler.gl не управляет состоянием напрямую, он реагирует на изменения Redux-store, что делает lifecycle предсказуемым и детерминированным.
При первом рендере React-компонента KeplerGl запускается
стандартный lifecycle React:
constructorrendercomponentDidMountИменно componentDidMount становится точкой инициализации
карты и WebGL-контекста.
Внутри KeplerGl происходит:
Пример использования:
<KeplerGl
id="map"
width={width}
height={height}
mapboxApiAccessToken={token}
/>
После монтирования компонент диспатчит внутренние экшены:
INIT — создание инстанса картыADD_DATA_TO_MAP — загрузка стартовых данных (если
переданы)LAYER_CONFIG_CHANGE — применение конфигурации
слоёвНа этом этапе формируется первая визуальная сцена.
Одним из ключевых lifecycle-процессов является добавление данных в карту. Это не просто загрузка массива, а многоступенчатый процесс трансформации:
dispatch(addDataToMap({
datasets: {
info: { label: 'Data' },
data: rawData
},
options: {
centerMap: true,
readOnly: false
}
}));
После dispatch происходит цепочка событий:
Парсинг данных
Обновление visState
Пересборка визуализации
Этот процесс является асинхронным с точки зрения визуального обновления, но синхронным внутри Redux-потока.
При изменении props у KeplerGl запускается
componentDidUpdate. Это один из наиболее важных
lifecycle-этапов, так как Kepler.gl реагирует на внешние изменения:
Внутренний механизм сравнивает предыдущие и новые props:
componentDidUpdate(prevProps) {
if (prevProps.datasets !== this.props.datasets) {
dispatch(addDataToMap(...));
}
if (prevProps.config !== this.props.config) {
dispatch(loadConfig(this.props.config));
}
}
1. Изменение данных
2. Изменение конфигурации
3. Изменение viewport
Kepler.gl активно использует оптимизации, связанные с предотвращением
лишних перерисовок. shouldComponentUpdate контролирует,
когда компонент должен реагировать на изменения.
Типичная логика:
Если изменения не затрагивают визуализацию, повторный render блокируется.
Это критично для больших наборов данных, где повторный рендер WebGL сцены может стоить десятки миллисекунд.
Kepler.gl имеет собственный «скрытый lifecycle», который полностью построен на Redux-потоке.
Dispatch action
dispatch(updateMap(viewState));
Reducer processing
State propagation
visState — слои, фильтры, данныеmapState — камера и viewportuiState — интерфейс и панелиКаждый из них имеет собственный жизненный цикл обновления.
Отдельный важный цикл — жизненный цикл слоёв карты.
Происходит при:
layers.push(new ScatterplotLayer({...}));
Trigger события:
Каждое обновление вызывает:
updateStateViewport — отдельный объект жизненного цикла, связанный с камерой.
Основные события:
Каждое изменение вызывает action:
dispatch(updateMapState({
latitude,
longitude,
zoom
}));
Далее происходит синхронизация:
Kepler.gl управляет взаимодействиями через interactionState:
Каждое взаимодействие проходит цикл:
При удалении компонента запускается завершающий lifecycle:
componentWillUnmountВнутренние процессы:
Особенно критичен этап очистки GPU ресурсов, так как утечки WebGL-контекста приводят к деградации производительности при повторном монтировании.
Несмотря на Redux-синхронность, визуализация в Kepler.gl имеет асинхронную природу:
Типичный цикл:
Этот pipeline делает lifecycle многослойным: состояние, UI и графика живут в разных временных шкалах.
Конфигурация карты хранится отдельно от данных и проходит собственный жизненный цикл:
dispatch(loadConfig(config));
При этом происходит строгая синхронизация:
Несоответствие конфигурации и данных приводит к частичной деградации визуализации (например, слои без источника данных).
Kepler.gl можно рассматривать как систему событий, где lifecycle выражается через поток:
Каждое событие не является изолированным — оно всегда порождает каскад обновлений внутри Redux-store и WebGL сцены, формируя непрерывный цикл синхронизации состояния и визуализации.