Обновление зависимостей

Библиотека STOMP.js активно развивается, получает исправления ошибок, обновления API, улучшения производительности и совместимости с современными версиями Javascript, TypeScript, браузеров и брокеров сообщений. Использование устаревших зависимостей приводит к накоплению технического долга, проблемам безопасности и несовместимости с экосистемой.

Регулярное обновление позволяет:

  • устранять ошибки в обработке соединений;
  • получать улучшения механизма переподключения;
  • использовать новые возможности WebSocket API;
  • повышать стабильность heartbeat-механизмов;
  • устранять memory leak;
  • поддерживать современные сборщики;
  • улучшать совместимость с TypeScript;
  • устранять deprecated API.

Особенно важно обновлять зависимости в приложениях реального времени:

  • чатах;
  • системах уведомлений;
  • финансовых сервисах;
  • торговых платформах;
  • IoT-системах;
  • системах мониторинга;
  • микросервисной инфраструктуре.

Проверка установленной версии STOMP.js

В проектах npm версия определяется через:

npm list @stomp/stompjs

Либо:

npm info @stomp/stompjs version

Для Yarn:

yarn list @stomp/stompjs

Для pnpm:

pnpm list @stomp/stompjs

Проверка содержимого package.json:

{
  "dependencies": {
    "@stomp/stompjs": "^7.1.0"
  }
}

Основные типы обновлений

Patch-обновления

Изменение третьего числа версии:

7.1.0 → 7.1.1

Обычно содержат:

  • исправления ошибок;
  • улучшения стабильности;
  • небольшие оптимизации;
  • исправления типизации.

Как правило, безопасны.


Minor-обновления

Изменение второго числа версии:

7.1.0 → 7.2.0

Могут включать:

  • новые функции;
  • новые параметры конфигурации;
  • расширение API;
  • улучшения reconnect-механизмов;
  • новые callback.

Требуют дополнительного тестирования.


Major-обновления

Изменение первого числа версии:

6.1.2 → 7.0.0

Обычно содержат breaking changes:

  • удаление устаревших API;
  • изменение сигнатур методов;
  • изменение поведения reconnect;
  • изменение heartbeat-механизмов;
  • изменение импорта модулей;
  • переход на новый формат сборки.

Такие обновления требуют миграции кода.


Проверка доступных обновлений

npm outdated

npm outdated

Пример вывода:

Package          Current   Wanted   Latest
@stomp/stompjs   6.1.2     6.1.5    7.1.0

Поля означают:

  • Current — установленная версия;
  • Wanted — максимальная версия согласно semver;
  • Latest — последняя доступная версия.

npm-check-updates

Популярный инструмент анализа обновлений:

npm install -g npm-check-updates

Проверка:

ncu

Обновление package.json:

ncu -u

После изменения зависимостей:

npm install

Семантическое версионирование

STOMP.js использует SemVer.

Символ ^

"@stomp/stompjs": "^7.1.0"

Разрешает:

7.x.x

Но запрещает:

8.x.x

Символ ~

"@stomp/stompjs": "~7.1.0"

Разрешает только:

7.1.x

Используется для более строгого контроля.


Фиксированная версия

"@stomp/stompjs": "7.1.0"

Полностью отключает автоматические обновления.

Подход полезен:

  • в enterprise-среде;
  • в критичных production-системах;
  • при сертификации ПО;
  • при сложной инфраструктуре тестирования.

Обновление STOMP.js через npm

Обновление до последней версии

npm install @stomp/stompjs@latest

Обновление до конкретной версии

npm install @stomp/stompjs@7.1.0

Обновление с сохранением semver

npm update @stomp/stompjs

Обновление через Yarn

yarn upgrade @stomp/stompjs

До конкретной версии:

yarn add @stomp/stompjs@7.1.0

Обновление через pnpm

pnpm update @stomp/stompjs

Либо:

pnpm add @stomp/stompjs@latest

Анализ breaking changes

Перед major-обновлением необходимо изучать:

  • changelog;
  • release notes;
  • migration guide;
  • GitHub issues;
  • deprecation notices.

Наиболее опасные изменения касаются:

  • reconnectDelay;
  • debug API;
  • heartbeat;
  • типов callback;
  • async-логики;
  • поддержки SockJS;
  • сборки ESM/CommonJS.

Изменения импорта между версиями

Старые версии

import Stomp from 'stompjs';

Современные версии

import { Client } from '@stomp/stompjs';

Изменение связано с переходом на современную архитектуру модулей.


Переход от Stomp.client() к Client

Старый подход

const client = Stomp.client(url);

Новый подход

const client = new Client({
  brokerURL: url
});

Новый API обеспечивает:

  • более гибкую конфигурацию;
  • улучшенную типизацию;
  • поддержку reconnect;
  • расширяемость;
  • лучшую интеграцию с TypeScript.

Изменение механизма активации клиента

Старые версии

client.connect({}, () => {
  console.log('Connected');
});

Современный подход

client.onConn ect = () => {
  console.log('Connected');
};

client.activate();

Изменение связано с переходом на событийную архитектуру.


Изменения reconnect API

Старый код

client.reconnect_delay = 5000;

Новый код

const client = new Client({
  reconnectDelay: 5000
});

Переименование параметра часто становится причиной ошибок после обновления.


Изменения heartbeat-конфигурации

Старый синтаксис

client.heartbeat.outgoing = 20000;
client.heartbeat.incoming = 20000;

Новый синтаксис

const client = new Client({
  heartbeatIncoming: 20000,
  heartbeatOutgoing: 20000
});

Проверка deprecated API

После обновления необходимо анализировать:

  • warnings в консоли;
  • TypeScript warnings;
  • ESLint warnings;
  • runtime warnings.

Типичный warning:

Deprecated API usage detected

Игнорирование deprecated API приводит к проблемам при следующем major-релизе.


Обновление TypeScript-типов

Современный STOMP.js содержит встроенные типы.

Устаревшие пакеты:

@types/stompjs

могут конфликтовать с новыми версиями библиотеки.

После обновления рекомендуется удалить:

npm uninstall @types/stompjs

Проверка сборки после обновления

После обновления необходимо тестировать:

  • webpack;
  • Vite;
  • Rollup;
  • Parcel;
  • Babel;
  • TypeScript compilation.

Особенно часто возникают проблемы:

  • с ESM;
  • tree-shaking;
  • dynamic import;
  • SSR;
  • CommonJS interoperability.

Проверка WebSocket-совместимости

После обновления необходимо тестировать:

  • Chrome;
  • Firefox;
  • Safari;
  • Edge;
  • мобильные браузеры.

Некоторые версии STOMP.js меняют:

  • тайминги heartbeat;
  • reconnect-поведение;
  • обработку бинарных фреймов;
  • обработку закрытия сокета.

Проверка совместимости с брокером

После обновления важно тестировать работу с:

  • RabbitMQ;
  • ActiveMQ;
  • Artemis;
  • Apollo;
  • Spring WebSocket;
  • HornetQ.

Разные брокеры могут по-разному реагировать на:

  • heartbeat;
  • ACK;
  • reconnect;
  • transactions;
  • subscriptions.

Проверка reconnect после обновления

Обязательный этап тестирования.

Проверяются:

  • отключение сети;
  • падение брокера;
  • timeout;
  • потеря heartbeat;
  • повторная подписка;
  • восстановление очередей.

Пример теста:

client.onWebSocketCl ose = () => {
  console.log('Socket closed');
};

client.onReconn ect = () => {
  console.log('Reconnect');
};

Проверка подписок после reconnect

Некоторые обновления меняют поведение subscription lifecycle.

Важно убедиться, что после reconnect:

  • подписки восстанавливаются;
  • сообщения продолжают поступать;
  • не возникает дублирования подписок;
  • старые subscription-id не конфликтуют.

Проверка ACK/NACK

После обновления необходимо тестировать:

client.subscribe('/queue/test', (message) => {
  message.ack();
});

Особенно важно проверять:

  • manual acknowledgment;
  • client-individual mode;
  • transaction support;
  • rollback.

Автоматическое тестирование после обновления

Рекомендуется запускать:

  • unit tests;
  • integration tests;
  • e2e tests;
  • нагрузочные тесты;
  • reconnect tests.

Проверка memory leak

Некоторые обновления изменяют:

  • lifecycle listeners;
  • reconnect timers;
  • subscription cleanup;
  • socket destruction.

Проверка выполняется через:

  • Chrome DevTools;
  • heap snapshot;
  • performance profiling.

Проблемы двойного подключения

После обновления иногда появляются дублирующиеся соединения.

Причины:

  • повторный activate();
  • изменение reconnect-логики;
  • race conditions;
  • ошибки жизненного цикла компонентов.

Особенно актуально для:

  • React;
  • Vue;
  • Angular.

Обновление в React-приложениях

Типичная проблема:

useEffect(() => {
  client.activate();

  return () => {
    client.deactivate();
  };
}, []);

После обновления reconnect может продолжать работу после unmount, если cleanup реализован неправильно.


Проверка deactivate()

Современный API поддерживает асинхронную деактивацию:

await client.deactivate();

После обновления необходимо учитывать async lifecycle.


Миграция на async/await

Новые версии STOMP.js лучше интегрируются с async API.

Пример:

async function disconnect(client) {
  await client.deactivate();
}

Проверка логирования после обновления

Старый подход:

client.debug = console.log;

Новый подход:

const client = new Client({
  debug: (message) => {
    console.log(message);
  }
});

Отключение debug в production

После обновления необходимо убедиться, что verbose logging отключён:

const client = new Client({
  debug: () => {}
});

Либо:

debug: process.env.NODE_ENV === 'development'
  ? console.log
  : () => {}

Проверка bundle size

Некоторые обновления могут увеличить размер бандла.

Проверяются:

  • tree-shaking;
  • dead code elimination;
  • minification;
  • sideEffects.

Инструменты:

webpack-bundle-analyzer
source-map-explorer

Проверка безопасности зависимостей

После обновления рекомендуется запускать:

npm audit

Исправление проблем:

npm audit fix

Lock-файлы и воспроизводимость сборки

Крайне важно хранить:

  • package-lock.json;
  • yarn.lock;
  • pnpm-lock.yaml.

Это обеспечивает:

  • стабильные CI/CD-сборки;
  • воспроизводимость production;
  • одинаковые версии зависимостей;
  • предсказуемость тестов.

Обновление в CI/CD

Типичный pipeline:

npm ci
npm run lint
npm run test
npm run build

После обновления STOMP.js pipeline должен проверять:

  • успешную сборку;
  • прохождение тестов;
  • отсутствие breaking changes;
  • корректность reconnect;
  • стабильность websocket-соединений.

Постепенное обновление зависимостей

Нежелательно обновлять сразу большое количество пакетов.

Безопасный подход:

  1. обновление minor/patch;
  2. запуск тестов;
  3. деплой в staging;
  4. нагрузочное тестирование;
  5. production rollout.

Canary-обновления

Для крупных систем используется частичный rollout:

  • 5% пользователей;
  • 10%;
  • 25%;
  • 50%;
  • 100%.

Это позволяет обнаружить:

  • reconnect bugs;
  • нестабильность websocket;
  • рост памяти;
  • проблемы производительности.

Мониторинг после обновления

После деплоя отслеживаются:

  • количество reconnect;
  • websocket disconnect rate;
  • latency;
  • message throughput;
  • browser errors;
  • memory usage.

Типичные ошибки после обновления

Ошибка импорта

Attempted import error

Причина:

  • переход с CommonJS на ESM.

Ошибка activate

client.activate is not a function

Причина:

  • использование старого API.

Ошибка heartbeat

Heartbeat timeout

Причины:

  • изменение heartbeat timing;
  • несовместимость брокера;
  • прокси;
  • firewall.

Ошибка reconnect

Reconnect loop detected

Причины:

  • неправильная конфигурация reconnectDelay;
  • множественные activate();
  • race condition.

Стратегия безопасного обновления

Наиболее надёжный подход включает:

  1. анализ changelog;
  2. обновление в отдельной ветке;
  3. запуск тестов;
  4. ручное тестирование reconnect;
  5. проверку broker compatibility;
  6. анализ производительности;
  7. staging deployment;
  8. production rollout;
  9. мониторинг после релиза.

Пример полного обновления

Установка новой версии

npm install @stomp/stompjs@latest

Обновление кода

import { Client } from '@stomp/stompjs';

const client = new Client({
  brokerURL: 'ws://localhost:15674/ws',
  reconnectDelay: 5000,
  heartbeatIncoming: 10000,
  heartbeatOutgoing: 10000,

  debug(message) {
    console.log(message);
  }
});

client.onConn ect = () => {
  console.log('Connected');

  client.subscribe('/topic/messages', (message) => {
    console.log(message.body);
  });
};

client.onStompEr ror = (frame) => {
  console.error(frame.headers.message);
};

client.activate();

Поддержка обратной совместимости

В крупных проектах иногда используется адаптер:

function createClient(url) {
  return new Client({
    brokerURL: url
  });
}

Это позволяет:

  • централизовать миграцию;
  • скрыть изменения API;
  • упростить обновления;
  • минимизировать breaking changes.

Использование feature flags при обновлении

Иногда новая версия включается через feature flag:

const useNewStomp = true;

Это позволяет:

  • быстро откатить обновление;
  • тестировать новую реализацию;
  • сравнивать поведение версий.

Откат обновления

При обнаружении критических ошибок выполняется rollback:

npm install @stomp/stompjs@6.1.2

После чего восстанавливается lock-файл и выполняется повторная сборка проекта.