Files
teacherpick/vite.config.js
T
2026-11-10 12:35:16 +09:00

36 lines
1.3 KiB
JavaScript

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: true
},
define: {
__BUILD_DATE__: JSON.stringify(new Date().toISOString().slice(0, 10))
}
}));