Как исправить ошибку “error:0308010C:digital envelope routines::unsupported” при создании React-проекта в IntelliJ IDEA?
Я столкнулся со следующей ошибкой при создании стандартного React-проекта в IntelliJ IDEA:
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:67:19)
at Object.createHash (node:crypto:130:10)
at module.exports (/Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/util/createHash.js:135:53)
at NormalModule._initBuildHash (/Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:417:16)
at handleParseError (/Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:471:10)
at /Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:503:5
at /Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:358:12
at /Users/user/Programming Documents/WebServer/untitled/node_modules/loader-runner/lib/LoaderRunner.js:373:3
at iterateNormalLoaders (/Users/user/Programming Documents/WebServer/untitled/node_modules/loader-runner/lib/LoaderRunner.js:214:10)
at iterateNormalLoaders (/Users/user/Programming Documents/WebServer/untitled/node_modules/loader-runner/lib/LoaderRunner.js:221:10)
/Users/user/Programming Documents/WebServer/untitled/node_modules/react-scripts/scripts/start.js:19
throw err;
^
Я понимаю, что это может быть связано с недавней проблемой webpack, как упоминается в их репозитории на GitHub. Что вызывает эту ошибку и как её можно исправить при настройке нового React-проекта?
Эта ошибка возникает из-за проблем совместимости версий Node.js с криптографическими хеш-функциями webpack. Наиболее эффективные решения — либо обновить Node.js до совместимой версии, либо настроить webpack на использование устаревших алгоритмов хеширования, которые работают с вашей текущей установкой Node.js.
Содержание
- Понимание ошибки
- Основные причины
- Несколько решений
- Особенности для IntelliJ IDEA
- Советы по предотвращению
- Шаги по устранению неполадок
Понимание ошибки
Ошибка error:0308010C:digital envelope routines::unsupported является ошибкой криптографии Node.js, которая возникает, когда webpack пытается создать хеш-функции в процессе сборки. Эта ошибка обычно проявляется при:
- Использовании Node.js 17+ с более старыми версиями webpack (до 5.61.0)
- Использовании Node.js 16.13.0+ с более старыми версиями плагинов webpack
- Наличии несовместимости версий OpenSSL между Node.js и инструментами сборки webpack
Трассировка стека показывает, что ошибка исходит из файла webpack createHash.js, когда он пытается использовать криптографические алгоритмы хеширования, которые не поддерживаются текущей версией Node.js.
Основные причины
Несколько факторов способствуют возникновению этой ошибки:
- Несоответствие версии Node.js: Использование Node.js 17+ с версиями webpack, которые не поддерживают новые требования криптографии
- Конфликты версий OpenSSL: Разные версии OpenSSL между Node.js и системными библиотеками
- Устаревшие зависимости Webpack: React-проекты, созданные со старыми версиями webpack
- Переменные окружения: Отсутствие переменных окружения Node.js, которые настраивают поддержку устаревшей криптографии
- Конфигурация IntelliJ IDEA: Специфические настройки IDE или конфигурации терминала, влияющие на выполнение Node.js
Ошибка возникает именно потому, что webpack пытается использовать рутинные операции node:internal/crypto/hash, которые были изменены или устарели в более новых версиях Node.js.
Несколько решений
Решение 1: Обновление Node.js
Наиболее надежным решением является обновление Node.js до версии, которая полностью поддерживает требования webpack:
- Скачайте и установите Node.js 18.x или более позднюю версию с nodejs.org
- Проверьте установку:
node --version(должно показывать v18.x или выше) - Переустановите зависимости проекта:bash
rm -rf node_modules package-lock.json npm install
Это решение работает, потому что более новые версии Node.js включают обновленную поддержку OpenSSL, которую ожидает webpack.
Решение 2: Использование флага устаревшего Node.js
Если вам нужно сохранить текущую версию Node.js, добавьте флаг устаревшего режима для включения старых криптографических рутин:
-
Для npm-скриптов: Измените скрипты в вашем файле
package.json:json"scripts": { "start": "NODE_OPTIONS=--openssl-legacy-provider react-scripts start", "build": "NODE_OPTIONS=--openssl-legacy-provider react-scripts build", "test": "NODE_OPTIONS=--openssl-legacy-provider react-scripts test" } -
Для прямого выполнения: Запускайте команды с флагом:
bashNODE_OPTIONS=--openssl-legacy-provider npm start
-
Для IntelliJ IDEA: Настройте интерпретатор Node.js в настройках IDE или добавьте флаг в конфигурацию запуска.
Решение 3: Обновление зависимостей
Обновите зависимости webpack и связанные пакеты в вашем проекте до совместимых версий:
-
Обновите
react-scriptsдо последней версии:bashnpm install react-scripts@latest
-
Обновите webpack и связанные пакеты:
bashnpm install webpack@latest webpack-cli@latest
-
Проверьте наличие устаревших зависимостей того же уровня:
bashnpm outdated npm update
Решение 4: Изменение конфигурации Webpack
Если у вас есть пользовательская конфигурация webpack, измените настройки создания хеша:
-
В вашем файле
webpack.config.jsдобавьте или измените конфигурациюcreateHash:javascriptmodule.exports = { // ... другие конфигурации optimization: { runtimeChunk: 'single', splitChunks: { chunks: 'all', cacheGroups: { vendors: { test: /[\\/]node_modules[\\/]/, name: 'vendors', chunks: 'all', }, }, }, }, // Добавьте это для решения проблемы с криптографией output: { hashFunction: 'sha256', hashDigest: 'hex', hashDigestLength: 20, } }; -
Для TypeScript-проектов убедитесь, что ваш
tsconfig.jsonвключает необходимые типы webpack.
Особенности для IntelliJ IDEA
При работе в IntelliJ IDEA учтите эти специфичные для IDE решения:
Настройка интерпретатора Node.js
- Перейдите в Файл → Настройки → Языки и фреймворки → Node.js и NPM
- Убедитесь, что вы используете правильную версию Node.js
- Установите путь к домашнему каталогу Node.js на предпочитаемую вами установку
Изменение конфигураций запуска
- Перейдите в Запуск → Редактировать конфигурации
- Выберите конфигурацию вашего React-приложения
- В разделе Переменные окружения добавьте:
NODE_OPTIONS=--openssl-legacy-provider
Использование интеграции с терминалом
- Откройте встроенный терминал в IntelliJ IDEA (Вид → Окно инструментов → Терминал)
- Запускайте команды с флагом устаревшего провайдера:bash
NODE_OPTIONS=--openssl-legacy-provider npm start
Особенности структуры проекта
- Убедитесь, что папка
.ideaи настройки рабочего пространства совместимы с вашей версией Node.js - Проверьте наличие специфичных для IDE конфигураций webpack, которые могут конфликтовать
Советы по предотвращению
Чтобы избежать этой ошибки в будущих проектах:
-
Используйте менеджер версий Node.js: Используйте инструменты вроде
nvmилиnodenvдля управления версиями Node.js:bashnvm install 18 nvm use 18
-
Укажите версию Node.js: В вашем файле
package.json:json"engines": { "node": ">=18.0.0" } -
Используйте Docker: Создайте контейнеризированную среду с постоянными версиями Node.js:
dockerfileFROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . CMD ["npm", "start"] -
Регулярные обновления: Поддерживайте зависимости в актуальном состоянии, выполняя:
bashnpm audit fix npm update
-
Конфигурация окружения: Создайте файл
.envс настройками Node.js:NODE_OPTIONS=--openssl-legacy-provider
Шаги по устранению неполадок
Если ни одно из вышеперечисленных решений не работает, выполните следующие шаги по устранению неполадок:
-
Проверьте версию Node.js:
bashnode --version npm --version
-
Проверьте поддержку OpenSSL:
bashnode -e "console.log(process.versions.openssl)" -
Чистая переустановка:
bashrm -rf node_modules package-lock.json npm cache clean --force npm install -
Проверьте конфликтующие пакеты:
bashnpm ls webpack npm ls react-scripts -
Тест в другой среде: Попробуйте запустить проект вне IntelliJ IDEA, чтобы изолировать проблемы, специфичные для IDE.
-
Проверьте системное окружение: Убедитесь, что нет глобальных установок Node.js, конфликтующих с настройками вашего проекта.
Источники
- Официальная документация Node.js - OpenSSL Provider
- Проблема на GitHub Webpack - Цифровые рутинные обертки
- Документация Create React App - Требования к Node.js
- Руководство по интеграции Node.js в IntelliJ IDEA
- Таблица совместимости версий Node.js
Заключение
Ошибка “digital envelope routines::unsupported” является распространенной проблемой совместимости Node.js, которую можно решить несколькими способами. Наиболее надежными решениями являются либо обновление Node.js до версии 18+, либо использование флага --openssl-legacy-provider для поддержания совместимости с вашей текущей настройкой. Для пользователей IntelliJ IDEA правильная настройка интерпретатора Node.js и добавление переменной окружения в конфигурации запуска обеспечивают бесперебойную работу. Следуя советам по предотвращению и поддерживая зависимости в актуальном состоянии, вы можете избежать этой проблемы в будущих React-проектах. Всегда тестируйте ваше решение в чистой среде, чтобы убедиться, что исправление работает правильно, прежде чем внедрять его в рабочий процесс разработки.