Сравнение версий программного обеспечения на JavaScript

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Вот компактная и эффективная функция для сравнения версий программного обеспечения. Она применяет методы JavaScript для обработки строк и чисел:

JS
Скопировать код
function compareVersions(v1, v2) {
  const parts1 = v1.split('.').map(Number), parts2 = v2.split('.').map(Number);
  for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
    const num1 = parts1[i] || 0, num2 = parts2[i] || 0;
    if (num1 != num2) return num1 > num2 ? 1 : -1;
  }
  return 0;
}

compareVersions('1.0', '1.0.5'); // -1 (1.0 < 1.0.5)
compareVersions('1.1', '1.0'); // 1 (1.1 > 1.0)
compareVersions('2.0', '2.0.0'); // 0 (2.0 == 2.0.0)

Эта функция эффективно решает основные задачи сравнения версий и выдает точный результат.

Кинга Идем в IT: пошаговый план для смены профессии

Анализ семантического версионирования (SemVer)

Семантическое версионирование, известное как SemVer, служит ключевым стандартом в мире разработки ПО для обозначения версий. Структура x.y.z включает в себя основной (x), второстепенный (y) и исправительный (z) компоненты, обеспечивая универсальный подход к обновлениям и понимание возможных изменений в программном обеспечении.

В npm доступна библиотека semver, предлагая полный спектр функций для работы с семантическим версионированием. С её помощью можно проводить сравнения и валидацию, отвечающую стандартам SemVer.

Обзор npm-пакетов

semver: Решение сложных задач

В случаях, когда требуется точное соблюдение SemVer, пакет semver становится незаменимым. Он упрощает процесс сравнения версий, предлагая множество готовых методов:

JS
Скопировать код
const semver = require('semver');

semver.gt('1.2.3', '1.2.0'); // true (1.2.3 > 1.2.0)
semver.lt('1.2.0', '1.2.3'); // true (1.2.0 < 1.2.3)
semver.eq('2.0.0', '2.0.0'); // true (2.0.0 == 2.0.0)
Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

localeCompare: Для базовых сравнений

Для основных сравнений в JavaScript функция localeCompare с параметром numeric: true позволяет корректно сравнить версии:

JS
Скопировать код
'1.10.0'.localeCompare('1.2.0', undefined, { numeric: true }); // 1 (1.10.0 > 1.2.0)

Однако она не подходит для версий с предварительными номерами и дополнительной метаинформацией.

Визуализация

Представим версии ПО в виде ступеней:

Markdown
Скопировать код
Версия 1.2.3 – [🟦1️⃣🟨2️⃣🟩3️⃣]
Версия 1.3.4 – [🟦1️⃣🟨3️⃣🟩4️⃣]

Сравнивая версии, мы стремимся понять, какая ступень выше:

JS
Скопировать код
function compareVersions(v1, v2) {
  const parts1 = v1.split('.').map(Number);
  const parts2 = v2.split('.').map(Number);

  for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
    if ((parts1[i] || 0) > (parts2[i] || 0)) return 1;
    if ((parts1[i] || 0) < (parts2[i] || 0)) return -1;
  }
  
  return 0;
}

compareVersions('1.2.3', '1.3.4'); // -1 (1.2.3 < 1.3.4)

Обозначения:

Markdown
Скопировать код
- 🟦 Основной компонент: Большой шаг вперёд.
- 🟨 Второстепенный компонент: Шаг к следующему уровню.
- 🟩 Исправительный компонент: Маленький прыжок вперёд.

В точности так, как мы стремимся преодолеть ступень, ПО стремится к совершенству.

Полезные материалы

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой пакет в npm рекомендуется для точного соблюдения семантического версионирования?
1 / 5