- authStore: 메인 프로젝트 세션 쿠키 기반 인증 상태 관리 - fetchWithAuth: 401 응답 시 메인 프로젝트 로그인 페이지 리다이렉트 - SessionGuard: 앱 진입 시 세션 유효성 검증 래퍼 컴포넌트 - 기존 API 모듈 fetch → fetchWithAuth 전환 - 환경변수에 VITE_MAIN_APP_URL, VITE_DEV_SKIP_AUTH 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
149 lines
4.8 KiB
JavaScript
149 lines
4.8 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';
|
|
|
|
// 배포 경로 설정 (예: '/kcgnv/', '/' 등)
|
|
// 모든 모드에서 VITE_BASE_URL 사용 (로컬 개발 프록시 모드 지원)
|
|
const base = 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 서버로 라우팅
|
|
'/api/cmn': {
|
|
target: env.VITE_API_URL || 'http://10.26.252.39:9090',
|
|
changeOrigin: true,
|
|
secure: false,
|
|
},
|
|
// 기상/위성 등 GIS API — 메인 API 서버로 라우팅
|
|
'/api/gis': {
|
|
target: env.VITE_API_URL || 'http://10.26.252.39:9090',
|
|
changeOrigin: true,
|
|
secure: false,
|
|
},
|
|
// API 서버 (기타)
|
|
'/api': {
|
|
target: env.VITE_TRACK_API || 'http://localhost:8090',
|
|
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'],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
};
|