Hi Sam, thanks for checking this, this might be more of any issue with my Vite configuration but I wanted to respond with my train of thought to see if it helps clarify my question:
*"Are you saying there is code in the emscripten-generated maze_builder.js that is using the DOM without first checking the API exists"* I have checked my generated *"maze_builder.js"* and it uses the DOM correctly and with correctly checks for undefined globals. I think the issue may be on the Vite bundling side then, but I wanted to check if there was a convention for bundling an Emscripten-generated Module within Vite (see my last response please). *"Where does `index-Bw7omusj.js` come from? Is that the compiled version of your main.tsx?"* Yes, this file is generated by Vite and can have different naming each build. *"What does "bundling the DOM" mean?"* >From my understanding, Vite will bundle and minify the React components in a React app into the file *"index-Bw7omusj.js"* (or whatever naming is chosen). I guess I'm confused between running my app in the client browser (where DOM is available), and where/why/how Vite is running the production server with no DOM (unless Server-Side Rendering is available, which I'm not using). I'm thinking Vite grabs the generated* "maze_builder.js"* when it's imported in a React component -- and maybe Vite is not verifying or stripping out the DOM when it bundles and generates *"index-Bw7omusj.js"*. I opened the minified file *"index-Bw7omusj.js" *and looked for certain lines of code shown in Chrome dev tools that threw errors: for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l); This line threw an error in Chrome Dev Tools with *"Uncaught ReferenceError: document is not defined at index-Bw7omusj.js:1:364 "* and along those lines. I kind of got my hands dirty and tried editing the minified file to include "if (typeof window !== 'undefined')" but that didn't feel like the right approach. *"If vite is defining things like `window`, even under node, do you know why it is doing that - "Why do you think this is an emscripten issue?"* >From the research that I've done thus far, the DOM is not present in Node or server environments so that condition *should* fail. I thought there might be an Emscripten configuration I missed... ? I think this might be a Vite-related bundling issue. I wanted to make sure I was using the Emscripten compiler switches correctly too. ("-s ENVIRONMENT=web,node, etc.."). I did a build with "-s ENVIRONMENT=node" only, but that didn't really solve the issue because then I can't run the app in the client browser locally or in Vite's production preview. On Monday, July 15, 2024 at 7:17:26 AM UTC-7 s...@google.com wrote: > Hi Zach, > > Are you saying there is code in the emscripten-generated maze_builder.js > that is using the DOM without first checking the API exists? Which code is > that can you point it? > > Where does `index-Bw7omusj.js` come from? Is that the compiled version of > your main.tsx? > > What does "bundling the DOM" mean? Are you saying there is some kind of > DOM emulation being included? If so, then wouldn't you expect the check > for the DOM APIs to succeed? If vite is defining things like `window`, > even under node, do you know why it is doing that? Why do you think this > is an emscripten issue? > > > cheers, > sam > > On Mon, Jul 15, 2024 at 6:56 AM Zach Mertens <zach....@gmail.com> wrote: > >> Hi all, >> >> I'm running into some issues bundling my Emscripten-generated JS/WASM >> files in a Vite+React project. I will quickly note I can run the files in a >> local server ("npm run dev"), and the issue seems related to running a >> production build. >> When I run "npm run preview (tsc -b && vite build)", I get a console >> error: index-Bw7omusj.js:1 Uncaught ReferenceError: document is not >> defined at index-Bw7omusj.js:1:364 at index-Bw7omusj.js:1:1051 I have >> done research and found that the error means the DOM is being used on a >> server side (where it's not available). I was recommended to conditionally >> check if it's available in my component... >> Here's my entry React component (main.tsx): >> // imports .... // Importing the Emscripten-generated JS module works >> fine - I compiled the C++ with MODULARIZE=1, EXPORT_ES6=1 // and added >> type definitions for TypeScript >> if (typeof window !== 'undefined') { >> const rootElement = document.getElementById('root'); >> ReactDOM.createRoot(rootElement!).render( >> <React.StrictMode> >> <App /> >> </React.StrictMode>, >> ) >> } else { >> console.error('Root element is null'); >> } >> I think the issue is that Vite is bundling the DOM (using the >> Emscripten-generated "maze_builder.js / maze_builder.wasm" which I put in >> the Vite project (see screenshot). >> >> >> [image: vite_files2.PNG] >> >> -- >> You received this message because you are subscribed to the Google Groups >> "emscripten-discuss" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to emscripten-disc...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/emscripten-discuss/e3999811-471a-4970-a66a-705e8a6b5dc9n%40googlegroups.com >> >> <https://groups.google.com/d/msgid/emscripten-discuss/e3999811-471a-4970-a66a-705e8a6b5dc9n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to emscripten-discuss+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/emscripten-discuss/cd9eb98c-ca2c-4259-8cb2-1c133261c6c2n%40googlegroups.com.