WebSocket — это протокол, обеспечивающий двунаправленное взаимодействие между клиентом и сервером через одно соединение. В контексте Stencil, где создаются веб-компоненты, WebSocket позволяет реализовать динамическое обновление данных, уведомления и интерактивные интерфейсы без постоянного опроса сервера.
Для начала работы создается экземпляр объекта WebSocket
с указанием URL сервера:
private socket: WebSocket;
componentWillLoad() {
this.socket = new WebSocket('wss://example.com/socket');
}
Ключевой момент: componentWillLoad
используется для инициализации соединения до того, как компонент будет
смонтирован в DOM.
WebSocket имеет несколько основных событий:
open — соединение установлено;message — получены данные от сервера;error — ошибка соединения;close — соединение закрыто.Пример обработки событий:
componentWillLoad() {
this.socket = new WebSocket('wss://example.com/socket');
this.socket.addEventListener('open', () => {
console.log('Соединение установлено');
});
this.socket.addEventListener('message', (event) => {
const data = JSON.parse(event.data);
console.log('Получено сообщение:', data);
});
this.socket.addEventListener('error', (error) => {
console.error('Ошибка WebSocket:', error);
});
this.socket.addEventListener('close', () => {
console.log('Соединение закрыто');
});
}
Совет: Для сложных приложений стоит вынести обработку событий в отдельные методы компонента для лучшей читаемости и поддержки.
Данные передаются с помощью метода send. В Stencil часто
используется JSON-формат:
sendMessage(data: any) {
if (this.socket && this.socket.readyState === WebSocket.OPEN) {
this.socket.send(JSON.stringify(data));
} else {
console.warn('Соединение не открыто');
}
}
Важно: Проверка readyState
предотвращает ошибки при попытке отправки сообщений до установления
соединения.
WebSocket может разрываться по различным причинам. Для устойчивости соединения часто реализуют автоматическое переподключение:
private reconnectInterval = 5000;
private connect() {
this.socket = new WebSocket('wss://example.com/socket');
this.socket.addEventListener('open', () => {
console.log('Соединение установлено');
});
this.socket.addEventListener('close', () => {
console.log(`Соединение закрыто, повторная попытка через ${this.reconnectInterval / 1000} секунд`);
setTimeout(() => this.connect(), this.reconnectInterval);
});
this.socket.addEventListener('message', this.handleMessage.bind(this));
}
private handleMessage(event: MessageEvent) {
const data = JSON.parse(event.data);
console.log('Получено сообщение:', data);
}
Особенность: Метод bind(this) необходим
для сохранения контекста компонента при передаче обработчиков.
Stencil использует реактивные свойства (@State) для
автоматического обновления DOM при изменении данных. WebSocket-сообщения
можно напрямую связывать с состоянием:
@State() messages: string[] = [];
private handleMessage(event: MessageEvent) {
const data = JSON.parse(event.data);
this.messages = [...this.messages, data.message];
}
В шаблоне компонента это позволяет динамически отображать список сообщений:
render() {
return (
<div>
{this.messages.map(msg => (
<p>{msg}</p>
))}
</div>
);
}
Преимущество: Обновления происходят автоматически без ручного манипулирования DOM.
wss:// вместо ws:// для
защиты данных.disconnectedCallback() {
this.socket?.close();
}
Использование WebSocket в Stencil позволяет строить реактивные и интерактивные компоненты, полностью реализуя преимущества двунаправленного протокола связи.