返回 JoyAI-Echo
vite.config.ts
根目录 / echo_longvideo / Director_Agent / webui / vite.config.ts
1 import { defineConfig, loadEnv, type ProxyOptions } from "vite";
2 import react from "@vitejs/plugin-react";
3 import path from "node:path";
4 import type { ServerResponse } from "node:http";
5
6 const REFUSED_LOG_THROTTLE_MS = 10_000;
7
8 function createProxyOptions(
9 route: string,
10 target: string,
11 extra: ProxyOptions = {},
12 ): ProxyOptions {
13 let lastRefusedLog = 0;
14 return {
15 target,
16 changeOrigin: true,
17 ...extra,
18 configure(proxy) {
19 extra.configure?.(proxy, extra);
20 proxy.on(
21 "error",
22 (
23 error: NodeJS.ErrnoException,
24 _req: unknown,
25 res: Partial<ServerResponse> | undefined,
26 ) => {
27 if (error.code === "ECONNREFUSED") {
28 const now = Date.now();
29 if (now - lastRefusedLog > REFUSED_LOG_THROTTLE_MS) {
30 lastRefusedLog = now;
31 console.warn(
32 `[vite] nanobot proxy target unavailable for ${route}: ${target}. ` +
33 "Start `nanobot gateway` with channels.websocket.enabled=true, " +
34 "or set NANOBOT_API_URL to the running websocket gateway.",
35 );
36 }
37 } else {
38 console.warn(
39 `[vite] nanobot proxy error for ${route}: ${error.message}`,
40 );
41 }
42
43 if (
44 res &&
45 !res.headersSent &&
46 typeof res.writeHead === "function" &&
47 typeof res.end === "function"
48 ) {
49 res.writeHead(502, { "Content-Type": "text/plain" });
50 res.end("nanobot gateway unavailable");
51 }
52 },
53 );
54 },
55 };
56 }
57
58 export default defineConfig(({ mode }) => {
59 const env = loadEnv(mode, process.cwd(), "");
60 const target = env.NANOBOT_API_URL ?? "http://127.0.0.1:8765";
61
62 const isProd = mode === "production" || env.NODE_ENV === "production";
63 const base = isProd ? "/webui/" : "";
64
65 return {
66 base,
67 plugins: [react()],
68 resolve: {
69 alias: {
70 "@": path.resolve(import.meta.dirname, "./src"),
71 },
72 },
73 optimizeDeps: {
74 // Radix dialog was introduced mid-session for the mobile sidebar sheet.
75 // When Vite re-optimizes it on a running dev server, the browser can race
76 // and request stale chunk paths from `.vite/deps`. Excluding it keeps dev
77 // reloads stable instead of rewriting those chunk filenames under us.
78 exclude: ["@radix-ui/react-dialog"],
79 },
80 build: {
81 outDir: path.resolve(import.meta.dirname, "../nanobot/web/dist"),
82 emptyOutDir: true,
83 sourcemap: false,
84 },
85 server: {
86 host: "127.0.0.1",
87 port: 5173,
88 strictPort: true,
89 proxy: {
90 "/webui": createProxyOptions("/webui", target),
91 "/api": createProxyOptions("/api", target),
92 "/auth": createProxyOptions("/auth", target),
93 "/prePrefix": createProxyOptions("/prePrefix", target),
94 "/proPrefix": createProxyOptions("/proPrefix", target),
95 },
96 },
97 };
98 });
99
99 lines TYPESCRIPT