cristianbote/goober

deno server-side-render error

Opened this issue · 1 comments

Error

Any attempt to render goober styles within a deno instance results in ReferenceError: document is not defined

Environment

I'm the first to admit the problem might be a configuration problem on my end.

OS:  Ubuntu 20.04.6 LTS
deno:  1.38.4 (release, x86_64-unknown-linux-gnu)
v8:  12.0.267.1
typescript:  5.2.2
goober:  2.1.13

Steps to reproduce

  • install deno
  • copy any goober example source to file
  • deno run example.js

Investigation

Apparently, there is an empty? window object in the global namespace within the deno environment. I don't know why, other than deno is aiming towards creating a browser environment on the server (somewhat) for cross-compatible code. However, there is no default document-object/DOM.

Hence, in src/core/get-sheet.js

export let getSheet = (target) => {
    if (typeof window === 'object') {   // THIS TRIGGERS AS TRUE
        return (...
            Object.assign((target || document.head)... )   // THIS CAUSES REFERENCE ERROR
        ).firstChild;
    }

Note: It still works fine in node.js because node does not have a window object—and obviously the browser which has both.

Suggested Fix

export let getSheet = (target) => {
    if (typeof window === 'object' && typeof document === 'object') {

I just don't know if that would break something somewhere, like if target has a passed value.

Urgency

Low: For my own uses I cloned the repo and hacked a local copy, then bundled the official version for client-side. Doesn't help anyone else, but...

I dealt with the exact same issue today. I fixed it in my use case by simply deleting the window object if the document object is undefined but the window object isn't.

if (typeof window !== 'undefined' && typeof document === 'undefined')
  delete globalThis.window

EDIT: You can set the DENO_FUTURE=1 environment variable to disable the window global in Deno 1.42, and apparently it'll be removed altogether in version 2.