Работа с Kepler.gl через CDN требует понимания того, что библиотека построена на экосистеме React, Redux и WebGL-рендеринге поверх deck.gl. Прямое подключение без сборщика возможно, но требует аккуратной сборки зависимостей через глобальные UMD-бандлы и правильного порядка загрузки скриптов.
CDN-интеграция в контексте Kepler.gl предполагает использование готовых браузерных сборок библиотек:
Ключевая особенность заключается в том, что Kepler.gl не предназначен для «голого» подключения в браузере, поэтому важно соблюдение совместимых версий зависимостей.
Пример подключения через CDN:
<script src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/redux@4.2.1/dist/redux.min.js"></script>
<script src="https://unpkg.com/react-redux@7.2.9/dist/react-redux.min.js"></script>
<script src="https://api.mapbox.com/mapbox-gl-js/v2.15.0/mapbox-gl.js"></script>
<link href="https://api.mapbox.com/mapbox-gl-js/v2.15.0/mapbox-gl.css" rel="stylesheet">
Подключение Kepler.gl через CDN:
<script src="https://unpkg.com/kepler.gl@2.5.5/dist/keplergl.min.js"></script>
После загрузки библиотека становится доступной через глобальные
объекты, включая KeplerGl, reducers и actions.
Для корректной работы требуется контейнер, в который будет монтироваться React-приложение:
<div id="app"></div>
Дополнительно необходимо задать размеры контейнера, иначе карта не отобразится:
<style>
body {
margin: 0;
overflow: hidden;
}
#app {
width: 100vw;
height: 100vh;
}
</style>
Kepler.gl использует Redux как обязательный слой состояния. В CDN-сценарии он создаётся вручную:
const { createStore, combineReducers, applyMiddleware } = Redux;
const { Provider } = ReactRedux;
const { keplerGlReducer } = KeplerGl;
Создание root reducer:
const reducers = combineReducers({
keplerGl: keplerGlReducer
});
Создание store:
const store = createStore(reducers, {}, applyMiddleware());
Kepler.gl требует Mapbox токен для отображения тайлов:
const MAPBOX_TOKEN = "YOUR_MAPBOX_TOKEN";
Без него карта не сможет загрузить базовые слои, даже если интерфейс будет отрисован.
После загрузки глобальных зависимостей можно создать корневой компонент:
const { Component } = React;
const { render } = ReactDOM;
const { KeplerGl } = KeplerGl;
Компонент приложения:
class App extends Component {
render() {
return React.createElement(
KeplerGl,
{
id: "map",
width: window.innerWidth,
height: window.innerHeight,
mapboxApiAccessToken: MAPBOX_TOKEN
},
null
);
}
}
React-приложение подключается через Provider:
render(
React.createElement(
Provider,
{ store },
React.createElement(App)
),
document.getElementById("app")
);
После этого инициализируется полноценный интерфейс Kepler.gl с поддержкой слоёв, фильтров и временных анимаций.
Данные можно добавлять напрямую через actions, которые также доступны из глобального объекта:
const { addDataToMap } = KeplerGl.actions;
Пример добавления датасета:
const sampleData = {
fields: [
{ name: "lat", type: "real" },
{ name: "lng", type: "real" }
],
rows: [
{ lat: 51.5, lng: 0.12 },
{ lat: 40.7, lng: -74.0 }
]
};
store.dispatch(
addDataToMap({
datasets: {
info: {
label: "Points",
id: "points"
},
data: sampleData
},
option: {
centerMap: true,
readOnly: false
}
})
);
В отличие от сборочных систем, CDN-режим требует явного контроля store:
dispatchstore.getState()Пример получения состояния:
console.log(store.getState().keplerGl);
Kepler.gl поддерживает несколько экземпляров карты через уникальные
id.
React.createElement(KeplerGl, {
id: "map1",
width: 600,
height: 400,
mapboxApiAccessToken: MAPBOX_TOKEN
});
React.createElement(KeplerGl, {
id: "map2",
width: 600,
height: 400,
mapboxApiAccessToken: MAPBOX_TOKEN
});
Каждый экземпляр получает собственный slice состояния внутри Redux:
state.keplerGl.map1
state.keplerGl.map2
CDN-использование накладывает архитектурные ограничения:
Особенно критичным является синхронизация версий React и Kepler.gl, так как несовместимость приводит к ошибкам контекста Redux и некорректной отрисовке слоёв.
CDN-интеграция допускает подключение дополнительных визуальных слоёв deck.gl через глобальные расширения:
const { ScatterplotLayer } = deck;
Их можно использовать в кастомных конфигурациях слоёв Kepler.gl через модификацию состояния mapConfig, однако такой подход требует точного соблюдения структуры конфигурации и понимания внутреннего schema.
Даже при использовании CDN часто применяется гибридная схема:
Это позволяет использовать Kepler.gl как визуальный слой поверх легковесного веб-приложения без полноценного bundler-пайплайна, сохраняя при этом интерактивность и масштабируемость визуализации геоданных.