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