Files
yunhai-agent-front/vite.config.ts
T
lijing 275a7c83af
build / build (push) Successful in 1m52s
fix(dev): 本地补模块前缀代理,让「路径拼错」在本地就暴露
请假的模块 key 是 homeleave、真实路由前缀是 /home-leave,后端下发的
optionCall 与附件 uploadPath 都带真实前缀。本地只代理 /api 时,这些带前缀
的请求会直接 404 —— 于是「后端把模块前缀拼错」这类问题在本地测不出来,
请假佐证材料上传 404 就是这么漏到线上的。

这里把各模块前缀一并代理到本地 mock,让本地环境与线上同形。
2026-10-13 16:36:22 +08:00

136 lines
5.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { UserConfig, defineConfig } from "vite";
import { createHtmlPlugin } from "vite-plugin-html";
import vue from "@vitejs/plugin-vue";
import path, { resolve } from "path";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
import ViteAutoImport from "unplugin-auto-import/vite";
import UnoCSS from "@unocss/vite";
import presetUno from "@unocss/preset-uno";
import presetRemToPx from "@unocss/preset-rem-to-px";
export default defineConfig((): UserConfig => {
// 构建产物直出 dist/ 根(CI 打 zip 取 dist 根,projman 校验要求 zip 根直接是 index.html)
const outDir = "dist";
return {
plugins: [
vue(),
createSvgIconsPlugin({
iconDirs: [resolve(process.cwd(), "src/assets/icons")],
symbolId: "icon-[dir]-[name]",
inject: "body-last",
customDomId: "__svg__icons__dom__",
}),
ViteAutoImport({
imports: [
"vue",
"vue-router",
{
"view-ui-plus": ["Button", "Input", "Message", "Avatar", "Tag", "Tooltip"],
},
{
from: "alova/client",
imports: ["useRequest", "useWatcher", "useForm"],
},
],
dts: "./src/auto-imports.d.ts",
dirs: ["src/api/module"],
}),
createHtmlPlugin({
minify: true,
pages: [
{
entry: "src/main.ts",
template: "index.html",
filename: "index.html",
injectOptions: {
data: {
title: "智能助手",
injectScript: ``,
},
},
},
],
}),
UnoCSS({
presets: [
presetUno(),
presetRemToPx({ baseFontSize: 4 }),
],
shortcuts: {
"flex-center": "flex items-center justify-center",
card: "bg-white rounded-8px shadow-md p-16px",
"text-ellipsis": "truncate",
},
theme: {
fontSize: {
xs: "12px",
sm: "14px",
base: "16px",
lg: "18px",
xl: "20px",
"2xl": "24px",
},
},
}),
],
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
},
},
server: {
host: "localhost",
port: 8080,
proxy: {
// 同源代理:serviceHost 留空时前端走 /api/...,由这里转发到本地 AgentService(8093),
// 规避后端 CAS 过滤器对 /api/* 不回 CORS 头导致的浏览器直连跨域拦截。
// 如需连测试环境:target 换成 http://base.yunhaixingtong.com/agent
"/api": {
target: "http://localhost:8093",
changeOrigin: true,
},
// 业务模块前缀:模块的**路由前缀与模块 key 不一定同名** —— 请假的 key 是
// `homeleave` 而真实前缀是 `/home-leave`。后端下发的 optionCall / 附件 uploadPath
// 都会带上真实前缀,本地一并代理到 mock,好让「路径拼错」这类问题在本地就暴露
// (请假的佐证材料就曾因为拼成 /homeleave/api/base/FileUpload 而 404,直到上线才发现)。
"/home-leave": { target: "http://localhost:8093", changeOrigin: true },
"/campusnotice": { target: "http://localhost:8093", changeOrigin: true },
"/dormnotice": { target: "http://localhost:8093", changeOrigin: true },
"/familyactivity": { target: "http://localhost:8093", changeOrigin: true },
"/coursehomework": { target: "http://localhost:8093", changeOrigin: true },
},
},
base: "./",
build: {
target: "modules",
outDir,
assetsDir: "assets",
sourcemap: false,
minify: "esbuild",
chunkSizeWarningLimit: 1000,
cssTarget: "chrome61",
rollupOptions: {
input: {
main: resolve("index.html"),
},
output: {
chunkFileNames: "static/js/[name]-[hash].js",
entryFileNames: "static/js/[name]-[hash].js",
assetFileNames: (assetInfo: any) => {
if (assetInfo.type === "asset" && /\.(jpe?g|png|gif|svg)$/i.test(assetInfo.name)) {
return "static/img/[name].[hash][ext]";
}
if (assetInfo.type === "asset" && /\.(ttf|woff|woff2|eot)$/i.test(assetInfo.name)) {
return "static/fonts/[name].[hash][ext]";
}
return "static/[ext]/[name]-[hash].[ext]";
},
},
},
},
};
});