ship-gis/vite.config.js
HeungTak Lee c123f234f2 chore: Vite 빌드 설정 및 프로젝트 구조 개선
- esbuild drop 옵션으로 빌드 시 console/debugger 자동 제거
- 개발용 폴더(publish, component/wrap) 빌드 시 제외
- 프록시 설정 추가 (signal-api, ship/image, tracks)
- index.html root 이동 (public/ → root)
- 의존성 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 06:35:31 +09:00

138 lines
4.4 KiB
JavaScript

import { defineConfig, loadEnv } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path';
export default ({ mode, command }) => {
const env = loadEnv(mode, process.cwd(), '');
// 환경 판별
// - development: 로컬 개발 환경 (yarn dev)
// - dev: 개발서버 배포 환경 (yarn build:dev)
// - qa: QA 환경 (yarn build:qa)
// - production: 프로덕션 환경 (yarn build, yarn build:prod)
const isLocalDev = mode === 'development';
const isDev = mode === 'dev';
const isQA = mode === 'qa';
const isProd = !isLocalDev && !isDev && !isQA; // production 또는 기타 모드
const isBuild = command === 'build';
// 배포 경로 설정 (예: '/kcgv/', '/' 등)
// 로컬 개발 모드(development)에서는 항상 '/' 사용
// 빌드 모드(dev, qa, prod)에서는 VITE_BASE_URL 사용
const base = isLocalDev ? '/' : (env.VITE_BASE_URL || '/');
console.log(`[Vite] Mode: ${mode}, Command: ${command}, Base: ${base}, isLocalDev: ${isLocalDev}`);
// 빌드 시 제외할 폴더 패턴 (로컬 개발 모드 제외)
// - publish: 퍼블리싱 미리보기 (개발용)
// - component/wrap: 레거시 퍼블리시 컴포넌트
// 참고: tracking 폴더의 TS 파일은 JS 파일이 우선 사용되므로 자동 제외됨
const excludePatterns = isBuild && !isLocalDev
? [
/[/\\]publish[/\\]/,
/[/\\]component[/\\]wrap[/\\]/,
]
: [];
return defineConfig({
base,
define: {
global: 'globalThis', // sockjs-client/stompjs용 global polyfill
},
server: {
host: true,
port: 3000,
proxy: {
// 지도 타일 서버
'/MAPS': {
target: env.VITE_MAP_TILE_URL || 'http://10.26.252.39:9090',
changeOrigin: true,
secure: false,
},
// GeoJSON 데이터
'/geo': {
target: env.VITE_MAP_TILE_URL || 'http://10.26.252.39:9090',
changeOrigin: true,
secure: false,
},
// 선박 신호 API (signal-api)
// 참조: mda-react-front/vite.config.ts
'/signal-api': {
target: env.VITE_SIGNAL_API || 'http://10.26.252.39:9090/signal-api',
changeOrigin: true,
secure: false,
rewrite: (path) => path.replace(/^\/signal-api/, ''),
},
// 선박 이미지 (국기, 선종 아이콘)
// 참조: mda-react-front/vite.config.ts - /ship/image 프록시
'/ship/image': {
target: env.VITE_API_URL || 'http://10.26.252.39:9090',
changeOrigin: true,
secure: false,
},
// 항적 조회 API (별도 서버)
// 참조: mda-react-front/vite.config.ts - /api/v2/tracks 프록시
'/api/v2/tracks': {
target: env.VITE_TRACK_API || 'http://10.26.252.51:8090',
changeOrigin: true,
secure: false,
},
// API 서버
'/api': {
target: env.VITE_API_URL || 'http://localhost:8080',
changeOrigin: true,
secure: false,
},
},
},
plugins: [
react(),
// 빌드 시 개발용 폴더 제외 플러그인 (로컬 개발 모드 제외)
isBuild && !isLocalDev && {
name: 'exclude-dev-folders',
resolveId(source, importer) {
// 제외 패턴에 매칭되는 import를 빈 모듈로 대체
const normalizedSource = source.replace(/\\/g, '/');
for (const pattern of excludePatterns) {
if (pattern.test(normalizedSource)) {
return { id: 'virtual:empty-module', moduleSideEffects: false };
}
}
return null;
},
load(id) {
if (id === 'virtual:empty-module') {
return 'export default null;';
}
return null;
},
},
].filter(Boolean),
resolve: {
alias: {
'@': '/src',
},
},
// 빌드 시 console.log, debugger 제거 (로컬 개발 모드 제외)
// 개발서버(dev), QA(qa), 프로덕션(prod) 빌드에서만 적용
esbuild: isBuild && !isLocalDev
? {
drop: ['console', 'debugger'],
}
: {},
build: {
outDir: 'dist',
cssCodeSplit: true,
rollupOptions: {
output: {
manualChunks: {
vendor: ['react', 'react-dom', 'react-router-dom'],
map: ['ol', 'ol-ext'],
state: ['zustand'],
},
},
},
},
});
};