vitejs / vite

Next generation frontend tooling. It's fast!
http://vitejs.dev
MIT License
66.1k stars 5.91k forks source link

Allow Web Workers on legacy #10383

Open Tal500 opened 1 year ago

Tal500 commented 1 year ago

Description

Web workers are broken on legacy mode, althought caiuseit shows it can be used on legacy browsers(IE10+ supports for example non-shared web workers). Not even a warning is displayed to the user.

This could have been filed as a bug request, but I think it's better as a feature.

Suggested solution

I saw the code of the Vite worker plugin, and the initial impression is that plugin-legacy can use a regular expressions on renderChunk to find the locations the expression "new Worker" is defined, find the right worker file it reference, and transform it to legacy using Babel. But:

  1. That's seems much more complicated than it needs to.
  2. Does not work with worker inline import(i.e. inline as a query param in import).

Can we somehow overcome this, maybe by replace the worker constructions with some tokens on transform(), and resolves them later in the renderChunk phase? This way:

  1. Vite worker plugin will check if the current format isn't system, and only then will emit the workers assets and replace the URL/inlined-code there.
  2. Vite plugin-legacy will do the same only for the system format, and will transform the worker code via Babel to support legacy.

Alternative

No response

Additional context

No response

Validations

Tal500 commented 1 year ago

Alternatively, and maybe it will be simpler, we can just check if the current format is system directly in the internal worker plugin. If so, then whenever the plugin build the worker asset, we can build the legacy asset instead, via babel transforming and using terser for minification, the same way that is done on the legacy plugin.

Any thoughts?