Production-сборка в CesiumJS требует учета особенностей архитектуры движка: работа с Web Workers, загрузка статических ассетов (Assets), шейдеров, текстур и бинарных данных, а также корректная интеграция с модульной системой сборщика (Vite, Webpack, Rollup).
Ключевая особенность CesiumJS заключается в том, что это не просто JavaScript-библиотека, а полноценный WebGL-движок, зависящий от внешних ресурсов, которые должны быть доступны в итоговой сборке без нарушения структуры директорий.
CesiumJS состоит из нескольких критически важных компонентов:
При production-сборке необходимо обеспечить:
Build/Cesium.CesiumJS обычно устанавливается через npm:
npm install cesium
После установки структура пакета включает:
Build/Cesium/ — готовые собранные файлы;Source/ — исходники (используются при кастомной
сборке);Workers/ — вычислительные модули;Assets/ — шрифты, изображения, иконки;Widgets/ — UI компоненты.CesiumJS требует определения базового пути к статическим ресурсам:
import * as Cesium from "cesium";
window.CESIUM_BASE_URL = "/cesium/";
Этот путь должен указывать на директорию, куда будут скопированы:
AssetsWidgetsWorkersThirdPartyБез корректного CESIUM_BASE_URL рендеринг сцен будет
нарушен: не загрузятся текстуры, UI и шейдеры.
Webpack требует ручной настройки копирования ресурсов.
npm install cesium copy-webpack-plugin webpack webpack-cli
const path = require("path");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const cesiumSource = "node_modules/cesium/Source";
const cesiumWorkers = "node_modules/cesium/Build/Cesium/Workers";
module.exports = {
entry: "./src/index.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "dist"),
},
resolve: {
alias: {
cesium: path.resolve(__dirname, cesiumSource),
},
},
plugins: [
new CopyWebpackPlugin({
patterns: [
{ from: cesiumWorkers, to: "Workers" },
{ from: path.join(cesiumSource, "Assets"), to: "Assets" },
{ from: path.join(cesiumSource, "Widgets"), to: "Widgets" },
{ from: path.join(cesiumSource, "ThirdParty"), to: "ThirdParty" },
],
}),
],
};
Vite требует иной подход из-за ESM-модели и оптимизации зависимостей.
npm install cesium vite vite-plugin-static-copy
import { defineConfig } from "vite";
import cesium from "vite-plugin-cesium";
export default defineConfig({
plugins: [cesium()],
build: {
sourcemap: false,
minify: "esbuild",
},
});
Плагин автоматически:
CesiumJS активно использует Web Workers для:
При сборке важно, чтобы Workers были доступны как отдельные файлы:
/dist/Workers/*.js
Ошибка в путях приводит к деградации производительности и fallback-режиму без многопоточности.
CesiumJS частично поддерживает tree-shaking, но с ограничениями:
Рекомендации:
mode: "production";cesium/Source/*;import * as Cesium from "cesium";
CesiumJS — крупная библиотека, поэтому критична оптимизация:
viewer.scene.globe.enableLighting = false;
viewer.scene.fog.enabled = false;
<script src="https://cesium.com/downloads/cesiumjs/releases/1.118/Build/Cesium/Cesium.js"></script>
В этом случае локальный бандл уменьшается, но теряется контроль над версией.
Production-деплой требует строгого сохранения структуры:
/dist
/Assets
/Widgets
/Workers
/ThirdParty
Cesium.js
Cesium.css
В Webpack:
output: {
publicPath: "/cesium-app/",
}
В Cesium:
window.CESIUM_BASE_URL = "/cesium-app/";
Несоответствие этих значений приводит к ошибкам загрузки ресурсов.
CesiumJS можно отлаживать в production через source maps:
module.exports = {
devtool: "source-map",
};
Однако:
CesiumJS хорошо подходит для CDN-архитектуры:
Рекомендуется:
При использовании облачных данных требуется токен:
Cesium.Ion.defaultAccessToken = "YOUR_TOKEN";
Токен должен быть доступен в runtime, но не попадать в публичный репозиторий.
Причина:
CESIUM_BASE_URL;Причина:
ThirdParty.Причина:
Причина:
Типичный pipeline включает:
Критические факторы:
Оптимизационные механизмы CesiumJS:
CesiumJS различает несколько режимов:
В production отключаются:
Обобщённая конфигурация включает:
CESIUM_BASE_URL;Browser
↓
CDN (Cesium build + Assets)
↓
Application bundle (Vite/Webpack)
↓
Workers (parallel execution)
↓
3D Tiles / Terrain servers
Архитектура ориентирована на минимизацию main thread и перенос вычислений в worker-слой, что делает production-сборку не просто процессом упаковки, а конфигурацией распределённой графической системы.