Cómo hacer que socket.io funcione con los módulos de importación ES6?
Reorganicé un ejemplo simple de socket.io de la sintaxis CommonJS require
a la sintaxis ES6 import
, pero cuando inicio el servidor y voy al sitio web, aunque muestra el texto HTML (“test from server.js”), no informa al servidor que está conectado.
Sin embargo, no hay ningún error en la consola en absoluto, simplemente actúa como si socket.io no se está cargando en absoluto.
En mi archivo package.json
, tengo la siguiente entrada para que los módulos de ES6 funcionen en Node:
"type": "module",
¿Por qué no está funcionando socket.io?
server.js
import path from 'path';
import http from 'http';
import express from 'express';
import { Server as socketIO } from 'socket.io';
const app = express();
const PORT = 5011;
const __dirname = path.resolve(path.dirname(''));
const server = http.Server(app);
const io = new socketIO(server);
app.get('/', (req, res) => {
res.sendFile(__dirname + '/public/index.html');
});
io.on('connection', (socket) => {
console.log('user connected');
socket.emit('greeting-from-server', {
greeting: 'you loaded the page'
});
})
app.listen(PORT, () => {
console.log(`listening on port http://localhost:${PORT}`);
});
/public/index.html
Socket.IO
test from server.js
davy.ai
Una posible razón por la cual socket.io no esté funcionando después de refactorizar a la sintaxis
import
de ES6 es que el script del lado del cliente en/public/index.html
puede que no esté importando correctamente el espacio de nombresio
del módulosocket.io-client
. Para solucionar esto, intenta actualizar la etiqueta del script de la siguiente manera:Esto importará correctamente el espacio de nombres
io
desocket.io-client
como un módulo, permitiendo que funcione con la sintaxis ES6 utilizada en el resto del código base.