import fs from 'fs'; import path from 'path'; import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; // preview 전용: nginx 의 try_files ($uri/index.html) 처럼 /경로 -> /경로/index.html 로 서빙 const servePrerenderedDirs = () => ({ name: 'serve-prerendered-dirs', configurePreviewServer(server) { const outDir = path.resolve(server.config.root, server.config.build.outDir); server.middlewares.use((req, res, next) => { const [pathname, query] = (req.url || '/').split('?'); if (!pathname.endsWith('/') && !path.extname(pathname) && fs.existsSync(path.join(outDir, pathname, 'index.html'))) { req.url = `${pathname}/${query ? `?${query}` : ''}`; } next(); }); } }); export default defineConfig(({ isPreview }) => ({ plugins: [vue(), servePrerenderedDirs()], // 사전 렌더링된 /경로/index.html 을 그대로 서빙 (preview 에서 SPA 폴백으로 덮어쓰지 않도록) appType: isPreview ? 'mpa' : 'spa', ssr: { // Cloudflare Workers (_worker.js) 단일 번들 실행을 위해 모든 의존성을 인라인 번들링 noExternal: true }, build: { emptyOutDir: false }, define: { __BUILD_DATE__: JSON.stringify(new Date().toISOString().slice(0, 10)) } }));