JavaScript "window is not defined"?

1 Antwort

"window" ist in Next.js in der Regel nicht definiert, weil Next.js den JavaScript-Code auf dem Server rendert. Und da ist eben noch nicht bekannt, was der Nutzer für einen Browser verwendet und wie groß bspw. sein Bildschirm ist, daher kann "window" nicht definiert sein.

Next.js muss also gezwungen werden den Teil des Codes, der auf "window" zugreift, erst beim Client auszuführen, und nicht auf dem Server. Aus deinem Code-Schnipsel lässt sich nicht erkennen, welcher Teil auf "window" zugreift, vermutlich irgendeine der verwendeten Bibliotheken.

Ist es ein Component, das gerendert wird und auf "window" zugreift, sollte dieses mit konditionell gerendert werden (erst dann wenn "window" definiert ist, also beim Client):

const MyNextComponent = () => {
  // ...

  return (
    <div>
      {/* something... */}
      {typeof window !== "undefined" && (
        <ComponentThatUsesWindow />
      )}
    </div>
  );
}

Wird "window" hingegen von einem anderen Codeteil verwendet, kann dieser bspw. in einem useEffect ausgeführt werden, was Next.js auch dazu bringt, diesen Teil des Codes erst beim Client auszuführen:

const MyNextComponent = () => {
  useEffect(() => {
    // some code that uses window
  }, []);

  // ...
}

Falls das Problem "react-globe" ist (wovon ich ausgehe), hier ein paar GitHub Issues zu dem Thema der verwandten Bibliothek "react-globe.gl":

In letzterem wird das hier empfohlen:

let Globe = () => null;
if (typeof window !== 'undefined') Globe = require('react-globe.gl').default;

Sollte auch mit "react-globe" funktionieren, einfach "react-globe.gl" durch "react-globe" ersetzen.

Woher ich das weiß:Berufserfahrung – Inhaber einer App-Agentur & 15+ Jahre Programmiererfahrung