import { defineConfig, loadEnv } from 'vite'
import { mkdirSync, writeFileSync } from 'node:fs'
import { fileURLToPath, URL } from 'node:url'
import vue from '@vitejs/plugin-vue'
import tailwindcss from '@tailwindcss/vite'
const publicRoutes = [
'/',
'/gallery',
'/community',
]
const DEFAULT_SITE_URL = 'http://localhost:5173'
function getSiteUrl(value?: string) {
const siteUrl = new URL(value?.trim() || DEFAULT_SITE_URL)
if (!['http:', 'https:'].includes(siteUrl.protocol)) {
throw new Error('VITE_SITE_URL 必须使用 http 或 https 协议')
}
return siteUrl.href.replace(/\/$/, '')
}
function seoFilesPlugin(siteUrl: string) {
return {
name: 'opencloud-seo-files',
closeBundle() {
mkdirSync('dist/.well-known', { recursive: true })
const robots = [
'User-agent: *',
'Allow: /',
'Disallow: /admin',
'Disallow: /auth/',
'Disallow: /login',
'Disallow: /register',
'Disallow: /upload',
'Disallow: /encyclopedia',
'Disallow: /profile/settings',
`Sitemap: ${siteUrl}/sitemap.xml`,
'',
].join('\n')
const sitemapUrls = publicRoutes
.map(route => ` \n ${siteUrl}${route}\n `)
.join('\n')
const sitemap = [
'',
'',
sitemapUrls,
'',
'',
].join('\n')
writeFileSync('dist/robots.txt', robots)
writeFileSync('dist/sitemap.xml', sitemap)
},
}
}
export default defineConfig(({ mode }) => {
const env = loadEnv(mode, process.cwd(), 'VITE_')
const siteUrl = getSiteUrl(env.VITE_SITE_URL)
return {
plugins: [vue(), tailwindcss(), seoFilesPlugin(siteUrl)],
server: {
port: 5173,
strictPort: true,
},
preview: {
port: 5173,
strictPort: true,
},
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),
},
},
}
})