Ver código fonte

fix: 生成临时 vite.config.preview.js 硬编码 base 路径

- previewService 启动时将 base 直接注入生成的 vite.config.preview.js
- 不再依赖环境变量或 CLI --base 传参
- 使用 ./node_modules/.bin/vite 替代 npx,避免解析问题
- 停止时清理临时配置文件
guoziyun 3 semanas atrás
pai
commit
b2fd7f99c7

+ 3 - 0
.gitignore

@@ -14,6 +14,9 @@ templates/*/src/filler/_ad_config_.ts
 # Symlink to user assets (created at build time)
 templates/*/assets/user/
 
+# Preview vite config (generated at runtime)
+templates/*/vite.config.preview.js
+
 # OS
 .DS_Store
 ._*

+ 1 - 1
platform/server/dist/services/previewService.d.ts.map

@@ -1 +1 @@
-{"version":3,"file":"previewService.d.ts","sourceRoot":"","sources":["../../src/services/previewService.ts"],"names":[],"mappings":"AAoCA;;GAEG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAmD1B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,UAAU,EAAE,MAAM,GACjB,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAgBlC;AAED,wBAAgB,gBAAgB,IAAI;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAMrG"}
+{"version":3,"file":"previewService.d.ts","sourceRoot":"","sources":["../../src/services/previewService.ts"],"names":[],"mappings":"AAoCA;;GAEG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAyD1B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,UAAU,EAAE,MAAM,GACjB,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAsBlC;AAED,wBAAgB,gBAAgB,IAAI;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAMrG"}

+ 18 - 9
platform/server/dist/services/previewService.js

@@ -53,19 +53,21 @@ async function startPreview(creativeId, theme, storageDir) {
     const configContent = (0, configGenerator_1.generateAdConfig)({ creativeId, theme, storageDir });
     const configPath = path_1.default.join(TEMPLATE_DIR, "src", "filler", "_ad_config_.ts");
     fs_1.default.writeFileSync(configPath, configContent, "utf-8");
-    // 4. 启动 Vite dev server(base 路径由 PREVIEW_BASE_PATH 环境变量传入 vite.config.js)
-    console.log(`[preview] Starting Vite dev server on port ${PREVIEW_PORT}...`);
-    viteProcess = (0, child_process_1.spawn)("npx", [
-        "vite",
+    // 4. 用 vite.config.preview.js(硬编码 base 路径)覆盖默认 config
+    const previewBase = process.env.PREVIEW_BASE_PATH || "/";
+    const originalConfig = fs_1.default.readFileSync(path_1.default.join(TEMPLATE_DIR, "vite.config.js"), "utf-8");
+    // 在 return 语句前注入 base
+    const patchedConfig = originalConfig.replace("return {", `return {\n    base: "${previewBase}",`);
+    const previewConfigPath = path_1.default.join(TEMPLATE_DIR, "vite.config.preview.js");
+    fs_1.default.writeFileSync(previewConfigPath, patchedConfig, "utf-8");
+    console.log(`[preview] Starting Vite dev server on port ${PREVIEW_PORT} (base: ${previewBase})...`);
+    viteProcess = (0, child_process_1.spawn)(path_1.default.join(TEMPLATE_DIR, "node_modules", ".bin", "vite"), [
         "--port", String(PREVIEW_PORT),
         "--strictPort",
+        "--config", previewConfigPath,
     ], {
         cwd: TEMPLATE_DIR,
-        env: {
-            ...process.env,
-            AD_CONFIG_PATH: "src/filler/_ad_config_.ts",
-            PREVIEW_BASE_PATH: process.env.PREVIEW_BASE_PATH || "/",
-        },
+        env: { ...process.env, AD_CONFIG_PATH: "src/filler/_ad_config_.ts" },
         stdio: ["ignore", "pipe", "pipe"],
     });
     viteProcess.stdout?.on("data", (data) => {
@@ -115,6 +117,13 @@ function stopPreview() {
         viteProcess = null;
     }
     currentCreativeId = null;
+    // 清理临时 vite config
+    try {
+        const previewConfigPath = path_1.default.join(TEMPLATE_DIR, "vite.config.preview.js");
+        if (fs_1.default.existsSync(previewConfigPath))
+            fs_1.default.unlinkSync(previewConfigPath);
+    }
+    catch { }
     // 确保端口释放
     try {
         (0, child_process_2.execSync)(`lsof -ti :${PREVIEW_PORT} | xargs kill -9 2>/dev/null`, { stdio: "ignore" });

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
platform/server/dist/services/previewService.js.map


+ 21 - 9
platform/server/src/services/previewService.ts

@@ -53,19 +53,25 @@ export async function startPreview(
   const configPath = path.join(TEMPLATE_DIR, "src", "filler", "_ad_config_.ts");
   fs.writeFileSync(configPath, configContent, "utf-8");
 
-  // 4. 启动 Vite dev server(base 路径由 PREVIEW_BASE_PATH 环境变量传入 vite.config.js)
-  console.log(`[preview] Starting Vite dev server on port ${PREVIEW_PORT}...`);
-  viteProcess = spawn("npx", [
-    "vite",
+  // 4. 用 vite.config.preview.js(硬编码 base 路径)覆盖默认 config
+  const previewBase = process.env.PREVIEW_BASE_PATH || "/";
+  const originalConfig = fs.readFileSync(path.join(TEMPLATE_DIR, "vite.config.js"), "utf-8");
+  // 在 return 语句前注入 base
+  const patchedConfig = originalConfig.replace(
+    "return {",
+    `return {\n    base: "${previewBase}",`
+  );
+  const previewConfigPath = path.join(TEMPLATE_DIR, "vite.config.preview.js");
+  fs.writeFileSync(previewConfigPath, patchedConfig, "utf-8");
+
+  console.log(`[preview] Starting Vite dev server on port ${PREVIEW_PORT} (base: ${previewBase})...`);
+  viteProcess = spawn(path.join(TEMPLATE_DIR, "node_modules", ".bin", "vite"), [
     "--port", String(PREVIEW_PORT),
     "--strictPort",
+    "--config", previewConfigPath,
   ], {
     cwd: TEMPLATE_DIR,
-    env: {
-      ...process.env,
-      AD_CONFIG_PATH: "src/filler/_ad_config_.ts",
-      PREVIEW_BASE_PATH: process.env.PREVIEW_BASE_PATH || "/",
-    },
+    env: { ...process.env, AD_CONFIG_PATH: "src/filler/_ad_config_.ts" },
     stdio: ["ignore", "pipe", "pipe"],
   });
 
@@ -125,6 +131,12 @@ export function stopPreview(): void {
   }
   currentCreativeId = null;
 
+  // 清理临时 vite config
+  try {
+    const previewConfigPath = path.join(TEMPLATE_DIR, "vite.config.preview.js");
+    if (fs.existsSync(previewConfigPath)) fs.unlinkSync(previewConfigPath);
+  } catch {}
+
   // 确保端口释放
   try {
     execSync(`lsof -ti :${PREVIEW_PORT} | xargs kill -9 2>/dev/null`, { stdio: "ignore" });

+ 0 - 4
templates/coloring/vite.config.js

@@ -42,11 +42,7 @@ module.exports = defineConfig(({ mode }) => {
   const output = platformBuild?.output;
   const outDir = output ? `dist/${output}` : "dist";
 
-  // base: 正常构建为 "/",预览时通过环境变量设为 "/ads-preview/"
-  const base = process.env.PREVIEW_BASE_PATH || "/";
-
   return {
-    base,
     plugins: [viteSingleFile(), finalizeHtmlPlugin(outDir, adapter)],
     server: {
       allowedHosts: ["color2.jccytech.cn", "localhost", ".jccytech.cn"],

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff