From 86335dfaa423e275a985d911eda6649ac01664b5 Mon Sep 17 00:00:00 2001 From: "jif2.zhang" Date: Tue, 27 Oct 2026 19:56:25 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E7=A6=BB=E7=BA=BF=E5=BA=93):=20=E5=85=B3?= =?UTF-8?q?=E9=97=AD=20PowerSync=20=E5=A4=9A=E6=A0=87=E7=AD=BE=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=20worker=20=E2=80=94=E2=80=94=20=E4=BF=AE=E5=A4=8D=20?= =?UTF-8?q?Windows=20=E5=8D=87=E7=BA=A7=E5=90=8E=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E9=A1=B5=E6=B0=B8=E4=B9=85=E3=80=8C=E5=8A=A0=E8=BD=BD=E4=B8=AD?= =?UTF-8?q?=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 现象: Windows 外壳 OTA 升级后, 任务页一直「加载中」; 其它不访问本地库的页面正常。 Android 正常。仅「原地升级/reload 之后」出现, 全新启动进程则正常。 根因: PowerSync Web 的 enableMultiTabs 默认在桌面端开启 (有 SharedWorker 时), 开启后会额外用 **共享 IndexedDB worker** 承载本地库。该 SharedWorker 跨页面 reload 存活, OTA applyUpdate 后 location.reload() 的新页面连上去时, 本地库读取永久挂起 —— 无异常、纯 pending, 所以 TaskPage 的 projects 一直是 null, 停在「加载中…」。 Android WebView 不支持 SharedWorker, 走独立 worker (随页面销毁), 因此不受影响。 实测 (真实 Windows 外壳 + WebView2 CDP): - 修复前: 目标页 /me 正常; Page.reload 后落到 /task 显示「加载中…」, 再导航仍卡住; shared_worker 目标仍在 (worker-*.js 前后同 URL)。 - 修复后: reload 后 /task 正常渲染 25 个任务; shared_worker 目标消失; 控制台仅剩 PowerSync「未启用多标签」提示。 修复: database.enableMultiTabs = false。本应用是单窗口外壳 (dock.html 不访问本地库), 不需要多标签同步; 该选项关闭后本地库改用随页面销毁的独立 worker, reload 干净。 注: 该问题与 OTA 包内容无关 (同一个包全新启动正常), 属 reload 路径的运行时缺陷。 --- src/lib/powersync/db.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/lib/powersync/db.js b/src/lib/powersync/db.js index e272f5e..90af016 100644 --- a/src/lib/powersync/db.js +++ b/src/lib/powersync/db.js @@ -13,6 +13,13 @@ export function getPowersyncDb() { database: { // 默认 IDBBatchAtomicVFS (IndexedDB), 兼容性最广; WebView2 (Chromium) 后续可切 OPFS 加速 dbFilename: 'iboard-powersync.db', + // 关闭多标签支持 —— 否则桌面端 (WebView2/Chromium) 会启用 **共享 IndexedDB worker**: + // enableMultiTabs 默认为 true (桌面且有 SharedWorker 时), 该 SharedWorker 会跨页面 + // reload 存活; OTA 升级后 reload 的新页面连上去时本地库读取会永久挂起 + // (无异常、纯 pending) —— 表现为任务页一直「加载中」, 其它不碰本地库的页面正常。 + // Android WebView 不支持 SharedWorker, 因此只有 Windows 外壳命中。 + // 本应用是单窗口外壳 (dock.html 不访问本地库), 不需要多标签同步。 + enableMultiTabs: false, }, }) }