142 lines
4.6 KiB
TypeScript
142 lines
4.6 KiB
TypeScript
import { defineConfig, loadEnv } from 'vite'
|
||
import vue from '@vitejs/plugin-vue'
|
||
import { resolve } from 'path'
|
||
import { fileURLToPath, URL } from 'node:url'
|
||
import Icons from 'unplugin-icons/vite'
|
||
import IconsResolver from 'unplugin-icons/resolver'
|
||
import Components from 'unplugin-vue-components/vite'
|
||
import fs from 'node:fs'
|
||
import path from 'node:path'
|
||
|
||
// 读取 apps.txt 确定应用优先级(靠后优先)
|
||
function loadAppsOrder(appsDir: string) {
|
||
const appsTxt = path.join(appsDir, 'apps.txt')
|
||
try {
|
||
const content = fs.readFileSync(appsTxt, 'utf-8')
|
||
return content
|
||
.split(/\r?\n/)
|
||
.map((s) => s.trim())
|
||
.filter(Boolean)
|
||
} catch {
|
||
return ['jingrow']
|
||
}
|
||
}
|
||
|
||
// 计算本工程中的 apps 目录(当前文件位于 apps/jingrow/frontend/vite.config.ts)
|
||
const currentDir = fileURLToPath(new URL('.', import.meta.url))
|
||
const appsDir = path.resolve(currentDir, '..', '..')
|
||
const APPS_ORDER = loadAppsOrder(appsDir)
|
||
|
||
export default defineConfig(({ mode }) => {
|
||
const env = loadEnv(mode, process.cwd(), '')
|
||
const JINGROW_SERVER_URL = env.VITE_JINGROW_SERVER_URL
|
||
const BACKEND_URL = env.VITE_BACKEND_SERVER_URL
|
||
const FRONTEND_HOST = env.VITE_FRONTEND_HOST || '0.0.0.0'
|
||
const FRONTEND_PORT = Number(env.VITE_FRONTEND_PORT) || 3100
|
||
const ALLOWED_HOSTS = (env.VITE_ALLOWED_HOSTS || '').split(',').map((s) => s.trim()).filter(Boolean)
|
||
|
||
return {
|
||
plugins: [
|
||
vue(),
|
||
Icons({
|
||
autoInstall: true,
|
||
compiler: 'vue3'
|
||
}),
|
||
Components({
|
||
resolvers: [
|
||
IconsResolver({
|
||
prefix: 'i',
|
||
enabledCollections: ['tabler']
|
||
}),
|
||
],
|
||
}),
|
||
],
|
||
resolve: {
|
||
alias: {
|
||
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
||
// 跨 app 访问源码(相对计算得到的 apps 目录)
|
||
'@apps': appsDir
|
||
}
|
||
},
|
||
server: {
|
||
host: FRONTEND_HOST,
|
||
port: FRONTEND_PORT,
|
||
strictPort: true,
|
||
open: false,
|
||
cors: true,
|
||
// 允许通过指定域名访问开发服务器(可通过 VITE_ALLOWED_HOSTS 配置,逗号分隔)
|
||
...(ALLOWED_HOSTS.length ? { allowedHosts: ALLOWED_HOSTS } : {}),
|
||
fs: {
|
||
// 放行 monorepo apps 目录,便于 import.meta.glob 跨应用扫描
|
||
allow: [appsDir]
|
||
},
|
||
proxy: {
|
||
'/api/action': {
|
||
target: JINGROW_SERVER_URL,
|
||
changeOrigin: true,
|
||
secure: false,
|
||
// 确保后端 Set-Cookie 的域与路径被重写为当前前端域名与根路径,便于浏览器保存 sid/user_id
|
||
cookieDomainRewrite: { '*': '' },
|
||
cookiePathRewrite: { '*': '/' },
|
||
// 移除 Cookie 的 Secure 标志,因为前端可能是 HTTP 访问
|
||
configure: (proxy, options) => {
|
||
proxy.on('proxyRes', (proxyRes, req, res) => {
|
||
const setCookieHeaders = proxyRes.headers['set-cookie']
|
||
if (setCookieHeaders) {
|
||
// 移除所有 Set-Cookie 中的 Secure 标志
|
||
proxyRes.headers['set-cookie'] = setCookieHeaders.map(cookie => {
|
||
return cookie.replace(/;\s*[Ss]ecure/gi, '').replace(/,\s*[Ss]ecure/gi, '')
|
||
})
|
||
}
|
||
})
|
||
}
|
||
},
|
||
'/api/data': {
|
||
target: BACKEND_URL,
|
||
changeOrigin: true,
|
||
secure: false,
|
||
cookieDomainRewrite: { '*': '' },
|
||
cookiePathRewrite: { '*': '/' },
|
||
configure: (proxy, options) => {
|
||
proxy.on('proxyRes', (proxyRes, req, res) => {
|
||
const setCookieHeaders = proxyRes.headers['set-cookie']
|
||
if (setCookieHeaders) {
|
||
proxyRes.headers['set-cookie'] = setCookieHeaders.map(cookie => {
|
||
return cookie.replace(/;\s*[Ss]ecure/gi, '').replace(/,\s*[Ss]ecure/gi, '')
|
||
})
|
||
}
|
||
})
|
||
}
|
||
},
|
||
'/jingrow': {
|
||
target: BACKEND_URL,
|
||
changeOrigin: true,
|
||
secure: false,
|
||
cookieDomainRewrite: { '*': '' },
|
||
cookiePathRewrite: { '*': '/' },
|
||
configure: (proxy, options) => {
|
||
proxy.on('proxyRes', (proxyRes, req, res) => {
|
||
const setCookieHeaders = proxyRes.headers['set-cookie']
|
||
if (setCookieHeaders) {
|
||
proxyRes.headers['set-cookie'] = setCookieHeaders.map(cookie => {
|
||
return cookie.replace(/;\s*[Ss]ecure/gi, '').replace(/,\s*[Ss]ecure/gi, '')
|
||
})
|
||
}
|
||
})
|
||
}
|
||
}
|
||
}
|
||
},
|
||
build: {
|
||
outDir: 'dist',
|
||
assetsDir: 'assets'
|
||
},
|
||
define: {
|
||
// 确保环境变量在构建时可用
|
||
__APP_VERSION__: JSON.stringify(process.env.npm_package_version),
|
||
// 注入 apps.txt 的应用顺序到前端
|
||
__APPS_ORDER__: JSON.stringify(APPS_ORDER)
|
||
}
|
||
}
|
||
})
|