CesiumJS представляет собой комплексную библиотеку для рендеринга трёхмерной геопространственной сцены в браузере. При использовании вместе с современными сборщиками модулей требуется учитывать особенности загрузки ассетов, Web Workers, WASM-модулей и статических ресурсов.
Vite обеспечивает быстрый dev-сервер, ESM-сборку и оптимизированный production-бандл, однако Cesium требует дополнительной настройки из-за своей нестандартной структуры пакета.
Cesium отличается от типичных npm-библиотек:
Vite по умолчанию обрабатывает зависимости как ESM, но Cesium содержит смешанный формат модулей и файловую структуру, требующую ручной конфигурации.
Базовая структура проекта формируется через стандартный шаблон Vite:
npm create vite@latest cesium-vite-app
cd cesium-vite-app
npm install
Установка Cesium:
npm install cesium
Дополнительно часто требуется plugin для копирования статических ресурсов:
npm install vite-plugin-static-copy --save-dev
После установки Cesium важны следующие пути:
cesium/Build/Cesium/Workerscesium/Build/Cesium/Assetscesium/Build/Cesium/ThirdPartycesium/Build/Cesium/WidgetsЭти директории не бандлятся автоматически Vite и должны быть
скопированы в dist.
Основной файл настройки vite.config.js требует
определения алиасов и копирования статических ресурсов.
import { defineConfig } from 'vite';
import path from 'path';
export default defineConfig({
resolve: {
alias: {
cesium: path.resolve(__dirname, 'node_modules/cesium/Source'),
}
},
define: {
CESIUM_BASE_URL: JSON.stringify('/cesium/')
}
});
Cesium не может работать без корректной раздачи папки
Build/Cesium.
Использование vite-plugin-static-copy:
import { viteStaticCopy } from 'vite-plugin-static-copy';
export default defineConfig({
plugins: [
viteStaticCopy({
targets: [
{
src: 'node_modules/cesium/Build/Cesium/**/*',
dest: 'cesium'
}
]
})
]
});
Результат сборки:
dist/
├── cesium/
│ ├── Assets/
│ ├── Workers/
│ ├── ThirdParty/
│ ├── Widgets/
Входной файл main.js:
import * as Cesium from 'cesium';
import 'cesium/Build/Cesium/Widgets/widgets.css';
const viewer = new Cesium.Viewer('app', {
terrainProvider: Cesium.createWorldTerrain()
});
HTML:
<div id="app"></div>
Cesium требует корректного пути к статике:
window.CESIUM_BASE_URL = '/cesium/';
или через define в Vite:
define: {
CESIUM_BASE_URL: JSON.stringify('/cesium/')
}
Ошибки неправильного base URL проявляются как:
Cesium использует Web Workers для:
Vite должен корректно резолвить worker-файлы. При необходимости применяется настройка:
export default defineConfig({
worker: {
format: 'es'
}
});
Cesium — тяжёлая библиотека, поэтому важна оптимизация:
const Cesium = await import('cesium');
export default defineConfig({
build: {
rollupOptions: {
external: []
}
}
});
В production важно учитывать:
Пример конфигурации:
export default defineConfig({
base: '/',
build: {
assetsDir: 'assets'
}
});
Cesium часто используется с внешними провайдерами данных:
const viewer = new Cesium.Viewer('app', {
imageryProvider: new Cesium.OpenStreetMapImageryProvider({
url: 'https://a.tile.openstreetmap.org/'
}),
terrainProvider: Cesium.createWorldTerrain()
});
Vite поддерживает .env файлы:
VITE_CESIUM_TOKEN=your_token_here
Использование:
Cesium.Ion.defaultAccessToken = import.meta.env.VITE_CESIUM_TOKEN;
Причина — отсутствует папка /cesium/Workers.
Причина — неправильный CESIUM_BASE_URL.
Причина — сервер не раздаёт .wasm как
application/wasm.
Cesium использует WebAssembly для ускорения вычислений:
Vite автоматически обрабатывает .wasm, но иногда
требуется явная настройка:
export default defineConfig({
assetsInclude: ['**/*.wasm']
});
Типичная архитектура:
src/
├── cesium/
│ ├── viewer.js
│ ├── layers.js
├── main.js
public/
├── cesium/ (копируемый билд)
vite.config.js
Инициализация Viewer выделяется в отдельный модуль:
export function createViewer(containerId) {
return new Cesium.Viewer(containerId, {
animation: false,
timeline: false,
geocoder: false
});
}
Оптимизационные параметры:
const viewer = new Cesium.Viewer('app', {
requestRenderMode: true,
maximumRenderTimeChange: Infinity
});
При массовой отрисовке объектов:
EntityCollectionconst points = viewer.entities;
for (let i = 0; i < 10000; i++) {
points.add({
position: Cesium.Cartesian3.fromDegrees(10 + i * 0.001, 50),
point: { pixelSize: 3 }
});
}