dexie.js 求助

2022-10-02 10:13:22 +08:00
 subframe75361

我尝试使用 vite+dexie ,想在 webworker 使用 dexie 防止阻塞主线程,dev 时可以正常跑,build 时就会循环编译,不知道有没有大佬能帮帮我...🥲

import Dexie from 'dexie'
import dbWorker from './worker?worker'

export const db = new Dexie('test')
db.version(1).stores({
  test: '++id, test'
})
const worker = new dbWorker()
export function test(data: string) {
  worker.postMessage(data)
}
import { db } from './index'
self.addEventListener('message', event => {
  console.log(db)
})

复现: https://github.com/subframe7536/issue-dexie

1967 次点击
所在节点    程序员
8 条回复
noe132
2022-10-02 10:42:04 +08:00
说点别的
一是你这个属于循环依赖
二是 dexie 为啥会阻塞主线程,都是异步 IO

目测是因为 worker 类型的循环依赖导致的问题。worker 依赖 index ,index 依赖新 worker ,新 worker 依赖新 worker 的 index ,新 worker 的 index 又依赖新新 worker...
subframe75361
2022-10-02 10:59:03 +08:00
@noe132 感谢指导!不过我是参照作者在类似的[issue]( https://github.com/dexie/Dexie.js/issues/789#issuecomment-458876237)中提供的样例进行编写的,顺便我不太明白为什么 dev 时没问题,然而 build 的时候就会循环依赖...
zjccc
2022-10-02 13:14:51 +08:00
@subframe75361 因为 vite 在 dev 时是用到了再加载,build 是会把文件的所有依赖都扫进去
zjccc
2022-10-02 13:26:03 +08:00
@subframe75361 示例没什么毛病,主要是你的 `index.ts` 里面不该调用 worker
subframe75361
2022-10-02 14:02:39 +08:00
@zjccc 所以是应该把所有关于 dexie 的操作都放到 worker 中吗🧐?
zjccc
2022-10-02 14:09:13 +08:00
@subframe75361 这样可以解决问题,不过不是非得要都放在同一个文件中

你的问题是循环依赖,和 worker 没有什么关系。

单纯的 A 依赖 B ,B 依赖 A
subframe75361
2022-10-02 14:09:27 +08:00
@zjccc 试了一下还真是...十分感谢解惑
AyaseEri
2022-10-03 10:17:15 +08:00
worker 里面定一个 class ,constructor 接收一个 db 实例,然后该干嘛干嘛就行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/884322

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX