mjmlio / mjml

MJML: the only framework that makes responsive-email easy
https://mjml.io
MIT License
17.1k stars 961 forks source link

`mjml2html` render in web worker throws `Uncaught ReferenceError: window is not defined` #2853

Open jlarmstrongiv opened 7 months ago

jlarmstrongiv commented 7 months ago

Describe the bug

In a web worker:

mjml-browser.js?v=275a58ae:25 Uncaught ReferenceError: window is not defined
    at ../../../node_modules/mjml-browser/lib/index.js (mjml-browser.js?v=275a58ae:25:7)
    at __require2 (chunk-IRSSH5FH.js?v=275a58ae:23:50)
    at mjml-browser.js?v=275a58ae:24126:16

To Reproduce Steps to reproduce the behavior:

  1. In vite, create a web worker
  2. Try importing import mjml2html from "mjml-browser";
  3. See error

Expected behavior I expect mjml-browser to work in web workers, without throwing any errors. It’s a cpu heavy process that would be perfect for web workers

MJML environment (please complete the following information):

Email sending environment(for rendering issues): N/A

Affected email clients (for rendering issues): N/A

Screenshots N/A

Additional context window is not a global variable in web workers https://stackoverflow.com/a/11237259

bmcminn commented 4 months ago

As you mentioned window is not available to web worker contexts. https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Functions_and_classes_available_to_workers

The way the mjml-browser build script works, it just dumps out a generic amd style export that binds the window object. build script source: https://github.com/mjmlio/mjml/blob/master/packages/mjml-browser/webpack.config.js public compiled source: https://cdn.jsdelivr.net/npm/mjml-browser@4.15.3/lib/index.js

This would likely require a mjml-webworker package to be built for this use case.

jlarmstrongiv commented 4 months ago

If we remove the window binding (which the mjml library does not depend on), then the mjml-browser package would work in web workers.

So, I’m not sure if a separate package is required, as long as we modify the generic amd style export in some way:

crummy commented 1 month ago

I think that would fix Deno as well, which reports (as of Deno v2):

Uncaught (in promise) ReferenceError: window is not defined
    at https://esm.sh/v135/mjml-browser@4.14.1/denonext/mjml-browser.mjs:2:894
    at https://esm.sh/v135/mjml-browser@4.14.1/denonext/mjml-browser.mjs:2:213
    at https://esm.sh/v135/mjml-browser@4.14.1/denonext/mjml-browser.mjs:942:2375

    info: window global is not available in Deno 2.
    hint: Replace `window` with `globalThis`.
iRyusa commented 3 weeks ago

I'lll see what I can do when I'll finish #2908