Начиная с Node.js v21, WebSocket API был усилен с помощью библиотеки Undici, что дало встроенный WebSocket-клиент. Это упрощает обмен данными в реальном времени для приложений на Node.js. В релизе Node.js v22.4.0 WebSocket API был помечен как стабильный, то есть готов к использованию в production.
WebSocket — это стандартизированный протокол обмена данными, обеспечивающий одновременный двусторонний обмен по одному TCP-соединению. Его полнодуплексность (двунаправленность) отличает его от HTTP. Совместимость с HTTP WebSocket достигает за счёт использования HTTP-заголовка Upgrade для перехода между протоколами. Он позволяет серверам отправлять контент клиентам без начальных запросов и держит соединения открытыми для непрерывного обмена сообщениями, что делает его идеальным для передачи данных в реальном времени с меньшими накладными расходами, чем у альтернатив вроде HTTP-опроса (polling). Обмен по WebSocket обычно происходит через TCP-порты 443 (защищённый) или 80 (незащищённый), что помогает обходить ограничения межсетевых экранов на не-веб-соединения. Протокол определяет собственные схемы URI (ws:// и wss://) для незашифрованных и зашифрованных соединений соответственно и поддерживается всеми основными браузерами.
Теперь Node.js может выступать в роли WebSocket-клиента без внешних библиотек вроде ws или socket.io для клиентских подключений. Это позволяет приложениям на Node.js инициировать и управлять исходящими WebSocket-соединениями напрямую, упрощая такие задачи, как подключение к потокам данных в реальном времени или взаимодействие с другими WebSocket-серверами. Теперь пользователи могут создавать клиентское WebSocket-соединение стандартным конструктором new WebSocket().
Развивая сказанное, добавим больше практических примеров, демонстрирующих новую функциональность WebSocket-клиента на базовых сценариях использования.
// Создаёт новое WebSocket-соединение с указанным URL.
const socket = new WebSocket('ws://localhost:8080');
// Выполняется, когда соединение успешно установлено.
socket.addEventListener('open', event => {
console.log('WebSocket connection established!');
// Отправляет сообщение WebSocket-серверу.
socket.send('Hello Server!');
});
// Слушает сообщения и выполняется, когда от сервера получено сообщение.
socket.addEventListener('message', event => {
console.log('Message from server: ', event.data);
});
// Выполняется при закрытии соединения, предоставляя код и причину закрытия.
socket.addEventListener('close', event => {
console.log('WebSocket connection closed:', event.code, event.reason);
});
// Выполняется, если во время обмена по WebSocket произошла ошибка.
socket.addEventListener('error', error => {
console.error('WebSocket error:', error);
});const socket = new WebSocket('ws://localhost:8080');
socket.addEventListener('open', () => {
const data = { type: 'message', content: 'Hello from Node.js!' };
socket.send(JSON.stringify(data));
});
socket.addEventListener('message', event => {
try {
const receivedData = JSON.parse(event.data);
console.log('Received JSON:', receivedData);
} catch (error) {
console.error('Error parsing JSON:', error);
console.log('Received data was:', event.data);
}
});Приведённый выше javascript-код демонстрирует отправку и приём JSON-данных, что типично для WebSocket-приложений. Он использует JSON.stringify() для преобразования JavaScript-объектов в JSON-строки перед отправкой, а полученную строку конвертирует обратно в JavaScript-объект через JSON.parse(). Наконец, здесь есть обработка ошибок парсинга JSON.
Это упрощает управление зависимостями и улучшает совместимость. Разработчикам не нужно устанавливать и поддерживать дополнительные клиентские WebSocket-библиотеки. Встроенная реализация соответствует современным веб-стандартам, обеспечивая лучшую интероперабельность. Это улучшение касается клиентской стороны обмена по WebSocket, позволяя Node.js выступать в роли WebSocket-клиента.
Node.js v22 не предоставляет встроенную нативную реализацию WebSocket-сервера. Чтобы создать WebSocket-сервер, принимающий входящие соединения от веб-браузеров или других клиентов, по-прежнему нужны библиотеки вроде ws или socket.io. Это значит, что хотя Node.js теперь легко может подключаться к WebSocket-серверам, чтобы стать WebSocket-сервером, ему всё ещё нужны внешние инструменты.
Node.js v22 позволяет приложениям беспрепятственно взаимодействовать с WebSocket-серверами в роли клиентов, но создание WebSocket-серверов внутри Node.js по-прежнему зависит от устоявшихся библиотек. Это различие критически важно понимать разработчикам при реализации обмена данными в реальном времени в своих Node.js-проектах.