V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
subframe75361
V2EX  ›  程序员

dexie.js 求助

  •  
  •   subframe75361 ·
    subframe7536 · 2022-10-02 10:13:22 +08:00 · 1757 次点击
    这是一个创建于 569 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    reproduce gif

    • 调用
    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)
    }
    
    • worker
    import { db } from './index'
    self.addEventListener('message', event => {
      console.log(db)
    })
    

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

    8 条回复    2022-10-03 10:17:15 +08:00
    noe132
        1
    noe132  
       2022-10-02 10:42:04 +08:00
    说点别的
    一是你这个属于循环依赖
    二是 dexie 为啥会阻塞主线程,都是异步 IO

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

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

    单纯的 A 依赖 B ,B 依赖 A
    subframe75361
        7
    subframe75361  
    OP
       2022-10-02 14:09:27 +08:00
    @zjccc 试了一下还真是...十分感谢解惑
    AyaseEri
        8
    AyaseEri  
       2022-10-03 10:17:15 +08:00   ❤️ 1
    worker 里面定一个 class ,constructor 接收一个 db 实例,然后该干嘛干嘛就行了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2581 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 16:00 · PVG 00:00 · LAX 09:00 · JFK 12:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.