import { defineConfig } 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({ 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: '0.0.0.0', port: 3002, strictPort: true, open: false, cors: true, fs: { // 放行 monorepo apps 目录,便于 import.meta.glob 跨应用扫描 allow: [appsDir] }, allowedHosts: ['code.jingrow.com'], proxy: { '/api/action': { target: process.env.VITE_JINGROW_SERVER_URL || 'http://192.168.2.58', changeOrigin: true, secure: false }, '/api/data': { target: process.env.VITE_BACKEND_SERVER_URL || 'http://localhost:9001', changeOrigin: true, secure: false }, '/jingrow': { target: process.env.VITE_BACKEND_SERVER_URL || 'http://localhost:9001', changeOrigin: true, secure: false } } }, build: { outDir: 'dist', assetsDir: 'assets' }, define: { // 确保环境变量在构建时可用 __APP_VERSION__: JSON.stringify(process.env.npm_package_version), // 注入 apps.txt 的应用顺序到前端 __APPS_ORDER__: JSON.stringify(APPS_ORDER) } })