wiki:it:dream_of_enc:metaverse:nodejs
λ¬Έμμ μ΄μ νμ λλ€!
λͺ©μ°¨
π’ Node.js λ°±μλ μ€μ
Phaser Baduk Metaverse νλ‘μ νΈμ Node.js λ°±μλ μ€μ κ³Ό ꡬμ±μ λν΄ μ€λͺ ν©λλ€.
π κ°μ
μ΄ νλ‘μ νΈλ Node.jsλ₯Ό κΈ°λ°μΌλ‘ ν μλ² μ¬μ΄λ λ λλ§κ³Ό μ€μκ° ν΅μ μ μ 곡ν©λλ€.
ποΈ μλ² κ΅¬μ‘°
λ©μΈ μλ² νμΌ (server.js):
const express = require('express'); const http = require('http'); const socketIo = require('socket.io'); const path = require('path'); const app = express(); const server = http.createServer(app); const io = socketIo(server); // μ μ νμΌ μλΉ app.use(express.static(path.join(__dirname, 'public'))); // λΌμ°νΈ μ€μ app.get('/', (req, res) => { res.sendFile(path.join(__dirname, 'public', 'index.html')); }); // Socket.IO μ΄λ²€νΈ μ²λ¦¬ io.on('connection', (socket) => { console.log('μλ‘μ΄ ν΄λΌμ΄μΈνΈ μ°κ²°:', socket.id); socket.on('join-game', (gameId) => { socket.join(gameId); console.log(`νλ μ΄μ΄κ° κ²μ ${gameId}μ μ°Έκ°νμ΅λλ€.`); }); socket.on('disconnect', () => { console.log('ν΄λΌμ΄μΈνΈ μ°κ²° ν΄μ :', socket.id); }); }); const PORT = process.env.PORT || 3000; server.listen(PORT, () => { console.log(`μλ²κ° ν¬νΈ ${PORT}μμ μ€ν μ€μ λλ€.`); });
π¦ μμ‘΄μ± κ΄λ¦¬
package.json μ£Όμ μμ‘΄μ±:
{ "name": "phaser-baduk-metaverse", "version": "1.0.0", "description": "Phaser.js κΈ°λ° λ°λ λ©νλ²μ€ κ²μ", "main": "server.js", "scripts": { "start": "node server.js", "dev": "nodemon server.js", "pm2": "pm2 start server.js" }, "dependencies": { "express": "^4.18.2", "socket.io": "^4.7.2", "cors": "^2.8.5" }, "devDependencies": { "nodemon": "^3.0.1" } }
π§ νκ²½ μ€μ
νκ²½ λ³μ μ€μ :
# .env νμΌ NODE_ENV=development PORT=3000 DB_PATH=./db.json
κ°λ° νκ²½ μ€ν:
# κ°λ° λͺ¨λ (nodemon μ¬μ©) npm run dev # νλ‘λμ λͺ¨λ npm start
ποΈ λ°μ΄ν° κ΄λ¦¬
κ²μ λ°μ΄ν° μ μ₯μ (db.json):
{ "games": {}, "users": {}, "rooms": {}, "statistics": { "totalGames": 0, "activePlayers": 0 } }
π λλ²κΉ
λ‘κ·Έ λ 벨 μ€μ :
// κ°λ° νκ²½μμ μμΈ λ‘κ·Έ μΆλ ₯ if (process.env.NODE_ENV === 'development') { console.log('π§ κ°λ° λͺ¨λλ‘ μ€ν μ€'); console.log('π λ©λͺ¨λ¦¬ μ¬μ©λ:', process.memoryUsage()); }
μλ¬ νΈλ€λ§:
process.on('uncaughtException', (err) => { console.error('β μ²λ¦¬λμ§ μμ μμΈ:', err); process.exit(1); }); process.on('unhandledRejection', (reason, promise) => { console.error('β μ²λ¦¬λμ§ μμ Promise κ±°λΆ:', reason); });
π μ±λ₯ μ΅μ ν
λ©λͺ¨λ¦¬ κ΄λ¦¬:
// μ£ΌκΈ°μ μΈ λ©λͺ¨λ¦¬ μ 리 setInterval(() => { if (global.gc) { global.gc(); console.log('π§Ή κ°λΉμ§ 컬λ μ μ€ν'); } }, 30000); // 30μ΄λ§λ€
ν΄λ¬μ€ν° λͺ¨λ:
const cluster = require('cluster'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { console.log(`λ§μ€ν° νλ‘μΈμ€ ${process.pid} μ€ν μ€`); // μ컀 νλ‘μΈμ€ μμ± for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`μ컀 ${worker.process.pid} μ’ λ£`); cluster.fork(); // μλ‘μ΄ μ컀 μμ± }); } else { // μ컀 νλ‘μΈμ€μμ μλ² μ€ν require('./server.js'); }
π κ΄λ ¨ λ¬Έμ
β μ΄ νμ΄μ§λ μλμΌλ‘ μμ±λμμ΅λλ€.
wiki/it/dream_of_enc/metaverse/nodejs.1753682235.txt.gz Β· λ§μ§λ§μΌλ‘ μμ λ¨: μ μ 127.0.0.1