36 lines
1.3 KiB
JavaScript
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: false
|
|
},
|
|
define: {
|
|
__BUILD_DATE__: JSON.stringify(new Date().toISOString().slice(0, 10))
|
|
}
|
|
}));
|