Node.js 25: Включение Web Storage по умолчанию ломает некоторые тулчейны (localStorage SecurityError)

#Node.js#Web Storage#localStorage#CI

TL;DR: Node.js 25 включил Web Storage по умолчанию, что привело к ошибкам SecurityError в некоторых тулчейнах из-за отсутствия пути к файлу для localStorage. В статье обсуждаются подходы к работе с новыми мажорными версиями Node.js и способы устранения подобных проблем.

Введение

Node.js продолжает развиваться, и с каждой новой версией разработчики сталкиваются с изменениями, которые могут повлиять на их проекты. Одним из таких изменений в Node.js 25 стало включение Web Storage API по умолчанию. Это решение вызвало проблемы в некоторых тулчейнах, где начали появляться ошибки типа DOMException [SecurityError]. В данной статье мы разберем причины этих ошибок и предложим способы их устранения.

Основная часть

Что произошло?

В Node.js 25 Web Storage API был включен по умолчанию. Это означает, что localStorage и sessionStorage теперь доступны в глобальной области видимости. Однако, если приложение или его зависимости пытаются использовать localStorage, но не предоставляют путь к файлу для хранения данных, возникает ошибка SecurityError.

Пример ошибки:

try {
  localStorage.setItem('key', 'value');
} catch (e) {
  console.error(e); // DOMException [SecurityError]
}

Почему это важно?

Это изменение может быть критичным для проектов, которые используют CI/CD pipelines с автоматическим обновлением Node.js до последней версии. Если одна из зависимостей использует localStorage, это может привести к неожиданным сбоям в процессе сборки.

Пример проблемы

Рассмотрим пример, когда зависимость использует localStorage для хранения временных данных:

// Пример зависимости
function saveTempData(key, value) {
  localStorage.setItem(key, value);
}

// Ваш код
saveTempData('temp', 'data');

Если ваш проект использует Node.js 25 и выше, этот код вызовет ошибку SecurityError, так как localStorage требует указания пути к файлу для хранения данных.

Практическое применение

Как избежать проблем?

  1. Фиксация версии Node.js в CI: Вместо автоматического обновления до последней версии Node.js, зафиксируйте версию в вашем CI/CD pipeline до тех пор, пока не убедитесь, что все зависимости работают корректно.

    # Пример .github/workflows/ci.yml
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v2
          - uses: actions/setup-node@v2
            with:
              node-version: '18' # Фиксируем версию Node.js
    
  2. Обновление зависимостей: Проверьте, какие из ваших зависимостей используют localStorage, и обновите их до версий, которые не зависят от этого API или корректно обрабатывают отсутствие пути к файлу.

  3. Использование полифилов: Если вы не можете обновить зависимость, рассмотрите возможность использования полифилов для localStorage, которые не требуют указания пути к файлу.

    // Пример полифила для localStorage
    if (typeof localStorage === 'undefined' || localStorage === null) {
      const LocalStorage = require('node-localstorage').LocalStorage;
      localStorage = new LocalStorage('./scratch');
    }
    

Как обрабатывать новые мажорные версии Node.js?

  1. Постоянное тестирование в CI: Добавьте тестирование на последней версии Node.js в ваш CI pipeline, чтобы своевременно выявлять проблемы.

    # Пример .github/workflows/ci.yml
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v2
          - uses: actions/setup-node@v2
            with:
              node-version: '25' # Тестируем на последней версии
    
  2. Отслеживание проблем: Создайте issue в вашем проекте для отслеживания проблем, связанных с новыми версиями Node.js, и планируйте их устранение перед переходом на LTS.

  3. Комьюнити и документация: Следите за обновлениями в сообществе Node.js и читайте документацию к новым версиям, чтобы быть в курсе потенциальных проблем.

Заключение

Включение Web Storage по умолчанию в Node.js 25 — это важное изменение, которое может повлиять на ваши проекты и их зависимости. Следуя рекомендациям из этой статьи, вы сможете минимизировать риски и обеспечить стабильную работу ваших приложений. Не забывайте тестировать свои проекты на новых версиях Node.js и своевременно обновлять зависимости, чтобы избежать неожиданных сбоев.


Источник: https://pas7.com.ua/blog/en/nodejs-25-whats-new