From 3eace4989923cd1b11a15861339f1f7c27df7a09 Mon Sep 17 00:00:00 2001 From: Mars <3361409208a@gmail.com> Date: Thu, 18 Jun 2026 16:59:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(admin):=20=E5=8F=91=E7=89=88=20chunk=20?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=B7=E6=96=B0=E3=80=81nginx=20=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E7=AD=96=E7=95=A5=E4=B8=8E=E5=AE=A1=E8=AE=A1=E9=A1=B5?= =?UTF-8?q?=20i18n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lazy route 加载失败时刷新入口;index.html 不缓存;补全 audit.col.operator/ip 等拆包遗漏 key。 --- apps/admin/src/i18n/pages/en.ts | 6 +++++- apps/admin/src/i18n/pages/zh.ts | 6 +++++- apps/admin/src/router/index.ts | 24 ++++++++++++++++++++++++ docker/nginx/admin.conf | 11 +++++++++++ docker/nginx/player.conf | 10 ++++++++++ 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/apps/admin/src/i18n/pages/en.ts b/apps/admin/src/i18n/pages/en.ts index a069a0a..ec2b671 100644 --- a/apps/admin/src/i18n/pages/en.ts +++ b/apps/admin/src/i18n/pages/en.ts @@ -357,10 +357,14 @@ const adminPages: Record = { 'bet.col.result': 'Result', 'audit.module_ph': 'e.g. USERS, AGENTS', + 'audit.col.time': 'Time', + 'audit.col.operator': 'Operator', 'audit.col.action': 'Action', 'audit.col.module': 'Module', 'audit.col.target_id': 'Target ID', - 'audit.col.time': 'Time', + 'audit.col.ip': 'IP', + 'audit.operator_system': 'System', + 'audit.operator_player': 'Player', 'audit.action.CREATE_PLAYER': 'Create player', 'audit.action.UPDATE_PLAYER': 'Update player', 'audit.action.RESET_DATABASE': 'Reset database', diff --git a/apps/admin/src/i18n/pages/zh.ts b/apps/admin/src/i18n/pages/zh.ts index dfd5ee7..6ca6f40 100644 --- a/apps/admin/src/i18n/pages/zh.ts +++ b/apps/admin/src/i18n/pages/zh.ts @@ -358,10 +358,14 @@ const adminPages: Record = { 'bet.col.result': '赛果', 'audit.module_ph': '如 USERS、AGENTS', + 'audit.col.time': '时间', + 'audit.col.operator': '操作人', 'audit.col.action': '操作', 'audit.col.module': '模块', 'audit.col.target_id': '目标 ID', - 'audit.col.time': '时间', + 'audit.col.ip': 'IP', + 'audit.operator_system': '系统', + 'audit.operator_player': '玩家', 'audit.action.CREATE_PLAYER': '新建玩家', 'audit.action.UPDATE_PLAYER': '更新玩家', 'audit.action.RESET_DATABASE': '重置数据库', diff --git a/apps/admin/src/router/index.ts b/apps/admin/src/router/index.ts index 65954e1..f617df6 100644 --- a/apps/admin/src/router/index.ts +++ b/apps/admin/src/router/index.ts @@ -250,4 +250,28 @@ router.beforeEach(async (to) => { return true; }); +/** 发版后旧 index.html 可能引用已不存在的 hash chunk,自动刷新一次拉最新入口。 */ +function isLazyChunkLoadError(err: unknown): boolean { + const msg = err instanceof Error ? err.message : String(err ?? ''); + return ( + msg.includes('Failed to fetch dynamically imported module') || + msg.includes('Importing a module script failed') || + msg.includes('error loading dynamically imported module') + ); +} + +const CHUNK_RELOAD_FLAG = 'admin:chunk-reload'; + +router.onError((error, to) => { + if (!isLazyChunkLoadError(error)) throw error; + const target = to.fullPath || '/'; + if (!sessionStorage.getItem(CHUNK_RELOAD_FLAG)) { + sessionStorage.setItem(CHUNK_RELOAD_FLAG, target); + window.location.assign(target); + return; + } + sessionStorage.removeItem(CHUNK_RELOAD_FLAG); + throw error; +}); + export default router; diff --git a/docker/nginx/admin.conf b/docker/nginx/admin.conf index 87e2b3a..9793fcc 100644 --- a/docker/nginx/admin.conf +++ b/docker/nginx/admin.conf @@ -9,6 +9,17 @@ server { gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml; + # 带 hash 的静态资源可长期缓存;index.html 禁止缓存,避免发版后引用旧 chunk + location /assets/ { + add_header Cache-Control "public, max-age=31536000, immutable"; + try_files $uri =404; + } + + location = /index.html { + add_header Cache-Control "no-cache, no-store, must-revalidate"; + add_header Pragma "no-cache"; + } + location /api/ { proxy_pass http://api:3000; proxy_http_version 1.1; diff --git a/docker/nginx/player.conf b/docker/nginx/player.conf index 26c902b..9405371 100644 --- a/docker/nginx/player.conf +++ b/docker/nginx/player.conf @@ -10,6 +10,16 @@ server { gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml; + location /assets/ { + add_header Cache-Control "public, max-age=31536000, immutable"; + try_files $uri =404; + } + + location = /index.html { + add_header Cache-Control "no-cache, no-store, must-revalidate"; + add_header Pragma "no-cache"; + } + location /api/ { set $api_upstream api:3000; proxy_pass http://$api_upstream;