SvelteKit 및 SocketIO를 사용한 라이브 채팅
18181 단어 tutorialsocketiosveltejavascript
오늘 우리는 Socket.IO를 살펴보고 이를 SvelteKit 프로젝트에 통합하는 방법을 살펴보겠습니다. 예를 들어 이 데모에서는 실시간 채팅 앱을 빌드합니다.
프로젝트 설정
먼저 SvelteKit 프로젝트가 필요합니다. 이미 프로젝트가 있는 경우 이 단계를 건너뛸 수 있습니다. 그렇지 않은 경우 다음 명령을 사용하여 간단히 만들 수 있습니다.
npm init svelte@next live-chat-app
cd live-chat-app
npm install
npm run dev -- --open
이 데모에서는 Tailwind CSS를 사용하고 있습니다. 나는 이미 how to add Tailwind CSS to SvelteKit 에 글을 썼습니다.
종속성 설치
필요한 것은 서버측 부분(수신 요청 및 연결 처리)을 위한 Socket.IO와 클라이언트측 부분(메시지 보내기 및 받기)을 위한 Socket.IO-Client 뿐입니다.
npm i socket.io socket.io-client
Socket.IO 서버 주입
SvelteKit 구성에서 Socket.IO 서버를 직접 주입할 수 있습니다.
// ... (other imports here)
import { Server } from 'socket.io'; // <-- Import the Socket.IO server
const config = {
// ...
kit: {
adapter: adapter(),
vite: {
plugins: [
{
name: 'sveltekit-socket-io',
configureServer(server) {
const io = new Server(server.httpServer);
// Socket.IO stuff goes here
console.log('SocketIO injected');
}
}
]
}
},
// ...
};
export default config;
서버 측 부분
이 데모에서는 작업을 단순하게 유지하고 각 클라이언트에 대해 임의의 사용자 이름을 생성하고 사용자 이름 및 시간과 함께 수신 메시지를 브로드캐스트합니다.
// This is located in the svelte config (see above "Socket.IO stuff goes here")
io.on('connection', (socket) => {
// Generate a random username and send it to the client to display it
let username = `User ${Math.round(Math.random() * 999999)}`;
socket.emit('name', username);
// Receive incoming messages and broadcast them
socket.on('message', (message) => {
io.emit('message', {
from: username,
message: message,
time: new Date().toLocaleString()
});
});
});
참고: 이 가이드는 전체 Socket.IO 가이드가 아닙니다. 이 예제는 매우 간단하며 SvelteKit에서 Socket.IO를 사용하는 방법만 보여줍니다.
클라이언트 측 부분
Socket.IO에 연결
여러 구성 요소 또는 페이지에서 Socket.IO 연결을 사용하고 싶을 수 있으므로 연결 항목을 분리하는 것이 좋습니다.
// src/lib/realtime.js
import ioClient from "socket.io-client";
const ENDPOINT = "http://localhost:3000";
const socket = ioClient(ENDPOINT)
export const io = socket
이제 프로젝트의 모든 곳에서 가져오고 사용할 수 있습니다
io
.형세
클라이언트 측에 Socket.IO를 추가하기 전에 데모용 간단한 UI를 생성하겠습니다. 이것은 채팅일 뿐이므로
src/routes/index.svelte
에서 직접 수행합니다.<script>
import { onMount } from "svelte";
let textfield = ""
let username = ""
let messages = []
function sendMessage() {
}
</script>
<div class="h-screen w-screen bg-zinc-800">
<div class="h-full w-full max-w-md mx-auto bg-zinc-500 flex flex-col">
<header class="px-6 py-4 border-b border-zinc-800 bg-zinc-700 text-white shrink-0 flex items-center justify-between">
<span class="font-bold text-xl">My Chat app</span>
<span>{username}</span>
</header>
<div class="h-full w-full p-4">
{#each messages as message}
<div class="bg-zinc-300 rounded-xl rounded-tl-none px-4 py-3 my-4 w-fit">
<span class="flex items-center space-between gap-4">
<b>{message.from}</b>
<i>{message.time}</i>
</span>
{message.message}
</div>
{/each}
</div>
<form action="#" on:submit|preventDefault={sendMessage}
class="px-6 py-4 border-t border-zinc-800 bg-zinc-700 text-white shrink-0 flex items-center"
>
<input type="text" bind:value={textfield} placeholder="Type something..." class="bg-transparent border-none px-4 py-3 w-full" />
<button type="submit" class="shrink-0 border border-white rounded-lg px-4 py-3">Send</button>
</form>
</div>
</div>
보시다시피 모든 메시지를
messages
배열에 저장하고 each
루프 내부에 출력합니다.메시지를 보내기 위해
sendMessage
형식에 리스너를 연결했습니다.메시지 보내기
먼저 방금 만든 파일(realtime.js)에서 가져오기
io
가 필요합니다.send 함수에서 다음 메시지와 함께
message
이벤트(서버 측 부분에서 호출한 방식)를 간단히 트리거할 수 있습니다.<script lang="ts">
import { io } from "$lib/realtime";
import { onMount } from "svelte";
let textfield = ""
let username = ""
let messages = []
function sendMessage() {
const message = textfield.trim()
if(!message) return
textfield = ""
io.emit("message", message) // Send the message
}
</script>
메시지 수신
메시지를 수신하려면
message
이벤트를 수신해야 합니다(이것이 서버 측 부분에서 호출한 방식입니다). 우리가 받는 객체는 우리가 보낸 것과 동일한 객체(서버 측)이며 messages
배열에 추가할 수 있습니다.<script lang="ts">
import { io } from "$lib/realtime";
import { onMount } from "svelte";
let textfield = ""
let username = ""
let messages = []
onMount(() => {
io.on("message", message => { // Listen to the message event
messages = [...messages, message]
})
io.on("name", name => { // Another listener for the name:
username = name // Update the name so it can be displayed
})
})
function sendMessage() {
const message = textfield.trim()
if(!message) return
textfield = ""
io.emit("message", message) // Send the message
}
</script>
이제
npm run dev
를 실행하고 테스트하십시오.그게 다야 - 이제 서버와 클라이언트 간에 실시간으로 데이터를 보낼 수 있습니다! 🚀
읽어주셔서 감사하고 좋은 하루 되세요 🤗
이 글이 도움이 되셨나요? ⬇️
Reference
이 문제에 관하여(SvelteKit 및 SocketIO를 사용한 라이브 채팅), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/einlinuus/live-chat-with-sveltekit-and-socketio-3kpl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)