From 469f91361962b850f201bcdaa4f151a7711f5632 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Fri, 16 Oct 2026 14:23:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(page):=20=E4=BF=AE=E5=A4=8D=20index.html=20?= =?UTF-8?q?=E4=B8=BB=E6=96=87=E4=BB=B6=E5=BC=95=E7=94=A8=E5=A4=B1=E9=85=8D?= =?UTF-8?q?=EF=BC=88=E6=96=B0=E4=B8=BB=E6=96=87=E4=BB=B6=E6=B2=A1=E8=A2=AB?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=EF=BC=8C=E8=87=AA=E5=8A=A8=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=E7=AD=89=E5=85=A8=E9=83=A8=E5=A4=B1=E6=95=88?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 根因:index.html 写死 main.9f4e7a89.js,重拆后主文件改名 main.7cfa4058.js → 请求旧名 404,新主文件里的 HORNET 注入 / 自动刷新拦截 / F5 兜底压根没加载 - 3DTank/web/index.html:引用改为 main.7cfa4058.js - tools/serve.js:Resolve 增加兜底 —— 请求 main..js 但文件不存在时,回退到目录里最新的 main..js(以后换 bundle 无需再改 HTML) - tools/split.js:拆分完成后自动改写 index.html 的主文件引用(防复发) --- 3DTank/tools/serve.js | 16 +++++++++++++++- tools/split.js | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/3DTank/tools/serve.js b/3DTank/tools/serve.js index f298fc6..2fe2f07 100644 --- a/3DTank/tools/serve.js +++ b/3DTank/tools/serve.js @@ -94,7 +94,21 @@ function Resolve(UrlPath) { const Clean = decodeURIComponent(UrlPath.split('?')[0]); // 切割版 JS 走 TankIC 目录 if (Clean.startsWith('/play/static/js/')) { - return path.join(JS_DIR, Clean.slice('/play/static/js/'.length)); + const P = path.join(JS_DIR, Clean.slice('/play/static/js/'.length)); + // 主文件名的 hash 随 bundle 版本变化,而 index.html 里写的是固定名(重新拆分后会失配 → 404)。 + // 这里兜底:请求 main..js 但该文件不存在时,回退到 JS 目录里最新的 main..js。 + if (/[/\\]main\.[0-9a-f]{8}\.js$/.test(P) && !fs.existsSync(P)) { + const Newest = fs + .readdirSync(JS_DIR) + .filter((F) => /^main\.[0-9a-f]{8}\.js$/.test(F)) + .map((F) => ({ F, T: fs.statSync(path.join(JS_DIR, F)).mtimeMs })) + .sort((A, B) => B.T - A.T)[0]; + if (Newest) { + console.log('[serve] 主文件失配,回退到最新: ' + path.basename(P) + ' → ' + Newest.F); + return path.join(JS_DIR, Newest.F); + } + } + return P; } const Rel = Clean.replace(/^\/+/, ''); return Rel === '' ? path.join(WEB_DIR, 'index.html') : path.join(WEB_DIR, Rel); diff --git a/tools/split.js b/tools/split.js index 244c5a5..57a0306 100644 --- a/tools/split.js +++ b/tools/split.js @@ -409,6 +409,26 @@ var __webpack_modules__ = window.__modules__; console.log(` 资源模块: ${resourceCount} (存入 resources.json)`); console.log(` 代码模块: ${codeCount} (独立文件)`); console.log(` 美化失败: ${failCount}`); + // ===== 自动同步 index.html 里的主文件引用 ===== + // 主文件名带 bundle hash(main..js),而 index.html 里写的是固定名; + // 重新拆分后必须一起改,否则页面请求旧名 404 → 新主文件(含 HORNET 注入/自动刷新拦截)全部失效。 + try { + const HTML_PATH = path.resolve(__dirname, '..', '3DTank', 'web', 'index.html'); + if (fs.existsSync(HTML_PATH)) { + const MainName = path.basename(MAIN_PATH); + const Html = fs.readFileSync(HTML_PATH, 'utf8'); + const NewHtml = Html.replace(/\/play\/static\/js\/main\.[0-9a-f]{8}\.js/g, '/play/static/js/' + MainName); + if (NewHtml !== Html) { + fs.writeFileSync(HTML_PATH, NewHtml, 'utf8'); + console.log(` index.html: 已更新主文件引用 → ${MainName}`); + } else { + console.log(` index.html: 引用已是最新 (${MainName})`); + } + } + } catch (e) { + console.log(' index.html: 同步失败(不影响拆分结果): ' + e.message); + } + console.log(` 主文件: ${MAIN_PATH}`); console.log(` 资源 JSON: ${RESOURCES_JSON_PATH}`); console.log(` 代码模块目录: ${UNPACKED_DIR}\\`);