mjmlio / mjml

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

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

Open jlarmstrongiv opened 4 months ago

jlarmstrongiv commented 4 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 1 month 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 1 month 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: