Docker Build and Push / build-image (push) Successful in 1m30s
现象: 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 路径的运行时缺陷。
45 lines
1.7 KiB
JavaScript
45 lines
1.7 KiB
JavaScript
// PowerSync 本地库单例 (0.2.1 离线编辑)
|
|
// 页面用法: usePowerSyncQuery 等见 src/lib/powersync/react.jsx; 写入用 db.execute/writeTransaction
|
|
import { PowerSyncDatabase } from '@powersync/web'
|
|
import { AppSchema } from './schema.js'
|
|
import { IBoardConnector } from './connector.js'
|
|
|
|
let dbInstance = null
|
|
|
|
export function getPowersyncDb() {
|
|
if (!dbInstance) {
|
|
dbInstance = new PowerSyncDatabase({
|
|
schema: AppSchema,
|
|
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,
|
|
},
|
|
})
|
|
}
|
|
return dbInstance
|
|
}
|
|
|
|
/** 登录后调用: 建立同步连接 (幂等) */
|
|
export async function connectPowersync() {
|
|
const db = getPowersyncDb()
|
|
db.connect(new IBoardConnector())
|
|
return db
|
|
}
|
|
|
|
/** 退出登录时调用: 断开同步并清空本地库 */
|
|
export async function disconnectAndClearPowersync() {
|
|
if (!dbInstance) return
|
|
try {
|
|
await dbInstance.disconnectAndClear()
|
|
} catch {
|
|
/* ignore */
|
|
}
|
|
}
|