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 требует указания пути к файлу для хранения данных.
Практическое применение
Как избежать проблем?
-
Фиксация версии 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 -
Обновление зависимостей: Проверьте, какие из ваших зависимостей используют
localStorage, и обновите их до версий, которые не зависят от этого API или корректно обрабатывают отсутствие пути к файлу. -
Использование полифилов: Если вы не можете обновить зависимость, рассмотрите возможность использования полифилов для
localStorage, которые не требуют указания пути к файлу.// Пример полифила для localStorage if (typeof localStorage === 'undefined' || localStorage === null) { const LocalStorage = require('node-localstorage').LocalStorage; localStorage = new LocalStorage('./scratch'); }
Как обрабатывать новые мажорные версии Node.js?
-
Постоянное тестирование в 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' # Тестируем на последней версии -
Отслеживание проблем: Создайте issue в вашем проекте для отслеживания проблем, связанных с новыми версиями Node.js, и планируйте их устранение перед переходом на LTS.
-
Комьюнити и документация: Следите за обновлениями в сообществе Node.js и читайте документацию к новым версиям, чтобы быть в курсе потенциальных проблем.
Заключение
Включение Web Storage по умолчанию в Node.js 25 — это важное изменение, которое может повлиять на ваши проекты и их зависимости. Следуя рекомендациям из этой статьи, вы сможете минимизировать риски и обеспечить стабильную работу ваших приложений. Не забывайте тестировать свои проекты на новых версиях Node.js и своевременно обновлять зависимости, чтобы избежать неожиданных сбоев.