Dette prosjektet er et enkelt og konkret Socket.IO-eksempel: En samarbeidsbasert cookie-clicker der alle klienter deler samme total i sanntid.
Hvis du vil se en ekstra forklaring av Socket.IO-konsepter, kan du supplere med denne videoen: Web Dev Simplified - Socket.IO Crash Course
Etter denne guiden skal du kunne:
Prosjektet bruker et vanlig sanntidsmønster:
Poenget er at serveren er autoritativ: klientene eier ikke sannheten, de ber serveren om endringer.
Disse hendelsene er kjernen i appen:
connection: ny klient kobler tilset-name: klient ber om å sette/endre navnincrement: klient ber om +1 klikkstate: server sender oppdatert state til klientenedisconnect: klient kobler fraDette utdraget viser den viktigste ideen: serveren oppdaterer state og sender ny state til alle.
io.on("connection", (socket) => {
state.players[socket.id] = { name: "Spiller", clicks: 0 };
socket.emit("state", getPublicState());
socket.on("set-name", (name) => {
if (!state.players[socket.id]) return;
state.players[socket.id].name = normalizeName(name);
io.emit("state", getPublicState());
});
socket.on("increment", () => {
if (!state.players[socket.id]) return;
state.totalClicks += 1;
state.players[socket.id].clicks += 1;
io.emit("state", getPublicState());
});
});
Hva du bør merke deg:
socket.on(...) tar imot hendelser fra akkurat denne klientensocket.emit(...) sender til bare denne klientenio.emit(...) sender til alle tilkoblede klienterKlienten sender hendelser til server og renderer state tilbake i UI:
const socket = io();
socket.on("state", (state) => {
totalClicksEl.textContent = state.totalClicks;
renderPlayers(state.players);
});
cookieBtn.addEventListener("click", () => {
socket.emit("increment");
});
function submitName() {
socket.emit("set-name", nameInput.value);
}
Viktige poeng:
I public/index.html ligger denne linjen:
<script src="/socket.io/socket.io.js" defer></script>
Dette er ikke en fysisk fil i prosjektmappen. Socket.IO-serveren eksponerer denne URL-en automatisk. Derfor kan du bruke io() i klientkoden uten å laste ned biblioteket manuelt.
npm install
npm start
http://localhost:3000