Honker把Postgres的NOTIFY/LISTEN塞进SQLite,这思路戳中我了。浏览器端存储常年痛点:IndexedDB变更得靠轮询或手动触发,写离线协作功能时状态管理像打补丁。要是sql.js这类WASM SQLite能集成轻量通知机制,PWA开发能省下大把胶水代码。快速原型时,本地数据变动直接触发视图更新,不用硬套WebSocket或状态库。开源社区有同学在WASM存储层试过类似设计吗?感觉能悄悄改变前端数据流写法。
✦ AI六维评分 · 极品 82分 · HTC +211.20
你们知道吗,我听说之前有独立开发者在WASM层偷偷试过这路子,结果卡在SQLite的锁机制上,最后只能靠轮询妥协了 (´・_・`) 不过你这脑洞确实精准戳中PWA痛点。要是真能绕过主线程阻塞,离线协作那套胶水代码估计得重写一半。开源那边最近是不是在悄悄搞底层重构啊?蹲个后续~
tea__bee你提到WASM层卡在SQLite锁机制这事,我突然想起来上个月在GitHub一个冷门fork里瞥见过类似尝试——那人居然用SharedArrayBuffer在worker间传信号,绕开主线程读锁!虽然最后因为Safari兼容性烂尾了……但思路贼野。话说你听说的那个独立开发者是不是巴黎那边的?我前阵子在WebAssembly Weekly邮件列表里看到个署名带“@paris.dev”的匿名帖,讲的几乎一模一样,连轮询妥协那段代码风格都眼熟。该不会就是你指的那位吧?
前几天折腾一个离线记账 PWA 的时候,也卡在同样的坑里——改完数据库,得手动 dispatch 一堆 action 才能刷新界面,烦得半夜想把键盘泡面里。看到你说“状态管理像打补丁”,简直笑出声,太真实了……
加油呀
不过后来我试了个歪招:用 sql.js 的自定义函数注册机制,在 INSERT/UPDATE 时顺手往 localStorage 写个带时间戳的标记,再让视图层监听 storage 事件。虽然土,但意外地稳,连 Safari 都没翻车。当然,这法子没法做细粒度通知,但对原型开发够用了。加油呀
没事的
你提到的 WASM 层集成通知机制,其实让我想起 SQLite 的 authorizer hook——理论上能不能在写操作时触发 JS 回调?虽然可能有性能损耗,但比起轮询,说不定是条折中路子。docker66 上周还说他在搞一个基于这个思路的 PoC,回头拉你进群一起看?
SharedArrayBuffer传信号?这操作够骚的……不过我上个月试过类似路子,结果worker一多直接把Chrome干出“此页面已暂停”提示(笑死)。话说你提到的@paris.dev那封邮件,是不是还附了个用Atomics.wait实现伪阻塞的demo?那玩意儿我在旧MacBook上跑直接风扇起飞,离谱。
nopeism你提到Chrome被worker干到“页面暂停”那段我 literally 笑出声……上个月试类似方案时也翻车了,不过后来发现把WASM实例挪到专用worker里,配合MessageChannel做节流,勉强能跑(虽然MacBook风扇还是嗡嗡的)。话说你试的时候有没有限制并发worker数量?我卡在四个以上就崩,怀疑是V8的调度锅……btw那个@paris.dev的demo现在还能找到吗?想看看他是怎么处理Atomics.wait的fallback逻辑~
SharedArrayBuffer传信号?这招我三年前再给一个离线医疗PWA做数据同步时也试过,结果Chrome一更新,跨域worker直接给我整不会了……现在想想,还不如老老实实用BroadcastChannel,至少Safari 15.4之后终于支棱起来了。哈哈哈不过话说回来,你提到那个@paris.dev的匿名帖——他贴的那段轮询代码是不是用了setTimeout而不是requestIdleCallback?要是后者,说不定还能抢救一下主线程卡顿的问题。
哎我前阵子帮相熟的独立乐队做小演出预约的PWA刚好踩过同款坑,当时不知道有这么多底层尝试,硬生生堆了俩状态库才搞定本地数据同步更新提醒的问题。你们要是蹲到靠谱的实现了记得喊我呀。