import { fileURLToPath, URL } from 'node:url' import { readFileSync } from 'node:fs' import { defineConfig, loadEnv } from 'vite' import vue from '@vitejs/plugin-vue' import vueDevTools from 'vite-plugin-vue-devtools' import AutoImport from 'unplugin-auto-import/vite' import Components from 'unplugin-vue-components/vite' import { VantResolver } from 'unplugin-vue-components/resolvers' import { bumpVersion } from './plugins/bump-version' // https://vite.dev/config/ export default defineConfig(({ command, mode }) => { const env = loadEnv(mode, process.cwd(), '') const apiBaseUrl = env.VITE_API_BASE_URL || '/api' const appVersion = getAppVersion(mode, command) const buildTime = getBuildTime(command) const enableVueDevTools = command === 'serve' && env.VITE_ENABLE_VUE_DEVTOOLS !== 'false' return { base: './', define: { __APP_VERSION__: JSON.stringify(appVersion), __APP_BUILD_TIME__: JSON.stringify(buildTime), }, plugins: [ vue(), enableVueDevTools && vueDevTools(), // 自动导入 Vue / Vue Router / Pinia / VueUse / Vant 的 API,省去手动 import AutoImport({ imports: [ 'vue', 'vue-router', 'pinia', '@vueuse/core', { vant: ['showDialog', 'showConfirmDialog'], }, ], dts: 'src/auto-imports.d.ts', vueTemplate: true, }), // 自动导入组件;样式已在 main.ts 全量引入,避免懒加载页面重复注入样式并改变级联顺序 Components({ resolvers: [VantResolver({ importStyle: false })], dts: 'src/components.d.ts', }), // 打包时自增版本号,并将 plugin.properties 输出到 dist/ bumpVersion(mode, buildTime), ], server: { host: '0.0.0.0', port: 8080, strictPort: true, open: true, proxy: { '/oms': { target: 'http://127.0.0.1:3011', changeOrigin: true, }, }, }, resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), }, }, build: { outDir: 'dist/www', }, } }) function getAppVersion(mode: string, command: 'build' | 'serve') { const content = readFileSync(`src/config/plugin.properties.${mode}`, 'utf-8') if (command === 'build') { const versionCode = content.match(/version_code=(\d+)/)?.[1] if (versionCode) { return toVersionName(Number(versionCode) + 1) } } return content.match(/version_name=([^;\n]+)/)?.[1] || '0.0.0' } function toVersionName(versionCode: number) { const major = Math.floor(versionCode / 10000) const minor = Math.floor((versionCode % 10000) / 100) const patch = versionCode % 100 return `${major}.${minor}.${patch}` } function getBuildTime(command: 'build' | 'serve') { if (command !== 'build') return '开发模式(尚未构建)' return new Date(Date.now() + 8 * 60 * 60 * 1000) .toISOString() .slice(0, 19) .replace('T', ' ') }