import { defineConfig } from 'vite'; import fs from 'node:fs/promises'; import path from 'node:path'; import serveStatic from 'serve-static'; // Cesium 懒加载:复制静态资源、注入 CSS,但不注入 6MB 的 Cesium.js 脚本—— // 脚本由 CesiumGlobe 首次进入“地理”视图时动态加载,避免阻塞首屏。 const CESIUM_URL = '/cesium/'; function cesiumLazy() { let isBuild = false; return { name: 'cesium-lazy', config(_c, { command }) { isBuild = command === 'build'; }, configureServer({ middlewares }) { // dev:直接静态服务 Cesium 资源(未压缩版便于调试) const dir = path.join(process.cwd(), 'node_modules/cesium/Build/CesiumUnminified'); middlewares.use(CESIUM_URL, serveStatic(dir)); }, async closeBundle() { if (!isBuild) return; const src = path.join(process.cwd(), 'node_modules/cesium/Build/Cesium'); const out = path.join(process.cwd(), 'dist', 'cesium'); for (const d of ['Assets', 'ThirdParty', 'Workers', 'Widgets']) { await fs.cp(path.join(src, d), path.join(out, d), { recursive: true }); } await fs.copyFile(path.join(src, 'Cesium.js'), path.join(out, 'Cesium.js')); }, transformIndexHtml() { return [{ tag: 'link', attrs: { rel: 'stylesheet', href: `${CESIUM_URL}Widgets/widgets.css` }, }]; }, }; } export default defineConfig({ plugins: [cesiumLazy()], });