Antwort an „Rolf B“ verfassen

Hallo effel,

wenn Du meine Fragen nicht beantwortest, kommen wir nicht weiter. Ich habe dich gefragt, wie Du die übrigen Module einbindest. require oder import? Sind das ES6- oder CommonJS-Module? Das schau ich jetzt bestimmt nicht einzeln nach. Aber ich würde vermuten, du lädst alles mit require()?

Sodann: Das import-Statement muss am Anfang eines ES6-Moduls stehen. In einer Funktion klappt das nicht. Was aber in einem CommonJS-Ökosystem (also: KEIN type=module in der package.json) geht, ist dies:

async function timeserver(){

  const ws = await import('ws'),
        socketServer = new ws.WebSocket({ port:8443 });

  setInterval(() => {
    const data = JSON.stringify({
       'type': 'time',
       'time': new Date().toTimeString()
    });
    socketServer.clients.forEach((client) => {
      client.send(data);
    });
  }, 500);
}

Das import-Statement ist auf ES6-Module beschränkt und muss am Anfang stehen. Es wird nämlich synchron durchgeführt und der Code im Modul läuft erst los, wenn alle imports befriedigt sind.

Aber die import-Funktion kannst Du auch ohne type=module aufrufen, sie arbeitet asynchron und liefert Dir ein Promise für das Modul-Objekt. Mit await wird gewartet, bis das Promise erfüllt (also: das Modul verfügbar) ist und dann findet man in ws die Konstruktorfunktion für den WebSocket. Das ganze muss in eine async-Funktion hinein, weil await außerhalb von Funktionen nur in ES6-Modulen erlaubt ist und das hast Du ohne type=module nicht.

Es geht auch andersrum, mit module.createRequire kann man sich in ES6-Modulen eine require-Funktion generieren lassen. Aber was für Dich richtig ist, kann ich Dir nicht sagen, wenn Du die Details für Dich behältst.

Rolf

--
sumpsi - posui - obstruxi
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar

Ihre Identität in einem Cookie zu speichern erlaubt es Ihnen, Ihre Beiträge zu editieren. Außerdem müssen Sie dann bei neuen Beiträgen nicht mehr die Felder Name, E-Mail und Homepage ausfüllen.

abbrechen