developit / web-worker

Consistent Web Workers in browser and Node.
https://npm.im/web-worker
Apache License 2.0
1.06k stars 55 forks source link

dynamic imports throw an error in module mode #51

Open TimDaub opened 2 months ago

TimDaub commented 2 months ago

I was made aware that make-asynchronous does't import dynamic imports (https://github.com/sindresorhus/make-asynchronous/blob/7fce502f8c5f7d2a4af20f253e9dbb14c68fa21c/test.js#L68-L74). So I looked into this by testing dynamic imports in web-worker, and I found that they somehow throw an error in "module" mode. Why?

> new (await import('web-worker')).default('data:,import("make-asynchronous").then(console.log)');
Worker {}
> new (await import('web-worker')).default('data:,import("make-asynchronous").then(console.log)', {type: "module"});
Worker {}
> TypeError [ERR_INVALID_URL]: Invalid URL
    at new NodeError (node:internal/errors:405:5)
    at getSource (node:internal/modules/esm/load:47:13)
    at defaultLoad (node:internal/modules/esm/load:111:38)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async ModuleLoader.load (node:internal/modules/esm/loader:417:7)
    at async ModuleLoader.moduleProvider (node:internal/modules/esm/loader:288:11)
    at async link (node:internal/modules/esm/module_job:67:21) {
  input: 'data:,import("make-asynchronous").then(console.log)',
  code: 'ERR_INVALID_URL'
}

Through some debugging I got to an error involving ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING

TimDaub commented 2 months ago

It seems one could add importModuleDynamically: true here:

https://github.com/developit/web-worker/blob/b89a392aa178c70701ee89abef4a5d30f8c59527/node.js#L207-L209

But even node v22 docs say that:

This option is still part of the experimental modules API. We do not recommend using it in a production environment.

Bummer, I would have loved to use this!