НейроАгент

Исправление ошибки React проекта: Digital Envelope Routines в IntelliJ IDEA

Узнайте, как устранить ошибку 'digital envelope routines::unsupported' при создании React проектов в IntelliJ IDEA. Полное руководство по совместимости Node.js с несколькими решениями.

Вопрос

Как исправить ошибку “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.

Содержание

Понимание ошибки

Ошибка 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 17.0.0, которая ввела более строгие требования OpenSSL для криптографических операций, нарушив совместимость со старыми конфигурациями webpack.

Основные причины

Несколько факторов способствуют возникновению этой ошибки:

  1. Несоответствие версии Node.js: Использование Node.js 17+ с версиями webpack, которые не поддерживают новые требования криптографии
  2. Конфликты версий OpenSSL: Разные версии OpenSSL между Node.js и системными библиотеками
  3. Устаревшие зависимости Webpack: React-проекты, созданные со старыми версиями webpack
  4. Переменные окружения: Отсутствие переменных окружения Node.js, которые настраивают поддержку устаревшей криптографии
  5. Конфигурация IntelliJ IDEA: Специфические настройки IDE или конфигурации терминала, влияющие на выполнение Node.js

Ошибка возникает именно потому, что webpack пытается использовать рутинные операции node:internal/crypto/hash, которые были изменены или устарели в более новых версиях Node.js.

Несколько решений

Решение 1: Обновление Node.js

Наиболее надежным решением является обновление Node.js до версии, которая полностью поддерживает требования webpack:

  1. Скачайте и установите Node.js 18.x или более позднюю версию с nodejs.org
  2. Проверьте установку: node --version (должно показывать v18.x или выше)
  3. Переустановите зависимости проекта:
    bash
    rm -rf node_modules package-lock.json
    npm install
    

Это решение работает, потому что более новые версии Node.js включают обновленную поддержку OpenSSL, которую ожидает webpack.

Решение 2: Использование флага устаревшего Node.js

Если вам нужно сохранить текущую версию Node.js, добавьте флаг устаревшего режима для включения старых криптографических рутин:

  1. Для 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"
    }
    
  2. Для прямого выполнения: Запускайте команды с флагом:

    bash
    NODE_OPTIONS=--openssl-legacy-provider npm start
    
  3. Для IntelliJ IDEA: Настройте интерпретатор Node.js в настройках IDE или добавьте флаг в конфигурацию запуска.

Решение 3: Обновление зависимостей

Обновите зависимости webpack и связанные пакеты в вашем проекте до совместимых версий:

  1. Обновите react-scripts до последней версии:

    bash
    npm install react-scripts@latest
    
  2. Обновите webpack и связанные пакеты:

    bash
    npm install webpack@latest webpack-cli@latest
    
  3. Проверьте наличие устаревших зависимостей того же уровня:

    bash
    npm outdated
    npm update
    

Решение 4: Изменение конфигурации Webpack

Если у вас есть пользовательская конфигурация webpack, измените настройки создания хеша:

  1. В вашем файле webpack.config.js добавьте или измените конфигурацию createHash:

    javascript
    module.exports = {
      // ... другие конфигурации
      optimization: {
        runtimeChunk: 'single',
        splitChunks: {
          chunks: 'all',
          cacheGroups: {
            vendors: {
              test: /[\\/]node_modules[\\/]/,
              name: 'vendors',
              chunks: 'all',
            },
          },
        },
      },
      // Добавьте это для решения проблемы с криптографией
      output: {
        hashFunction: 'sha256',
        hashDigest: 'hex',
        hashDigestLength: 20,
      }
    };
    
  2. Для TypeScript-проектов убедитесь, что ваш tsconfig.json включает необходимые типы webpack.

Особенности для IntelliJ IDEA

При работе в IntelliJ IDEA учтите эти специфичные для IDE решения:

Настройка интерпретатора Node.js

  1. Перейдите в Файл → Настройки → Языки и фреймворки → Node.js и NPM
  2. Убедитесь, что вы используете правильную версию Node.js
  3. Установите путь к домашнему каталогу Node.js на предпочитаемую вами установку

Изменение конфигураций запуска

  1. Перейдите в Запуск → Редактировать конфигурации
  2. Выберите конфигурацию вашего React-приложения
  3. В разделе Переменные окружения добавьте:
    NODE_OPTIONS=--openssl-legacy-provider
    

Использование интеграции с терминалом

  1. Откройте встроенный терминал в IntelliJ IDEA (Вид → Окно инструментов → Терминал)
  2. Запускайте команды с флагом устаревшего провайдера:
    bash
    NODE_OPTIONS=--openssl-legacy-provider npm start
    

Особенности структуры проекта

  • Убедитесь, что папка .idea и настройки рабочего пространства совместимы с вашей версией Node.js
  • Проверьте наличие специфичных для IDE конфигураций webpack, которые могут конфликтовать

Советы по предотвращению

Чтобы избежать этой ошибки в будущих проектах:

  1. Используйте менеджер версий Node.js: Используйте инструменты вроде nvm или nodenv для управления версиями Node.js:

    bash
    nvm install 18
    nvm use 18
    
  2. Укажите версию Node.js: В вашем файле package.json:

    json
    "engines": {
      "node": ">=18.0.0"
    }
    
  3. Используйте Docker: Создайте контейнеризированную среду с постоянными версиями Node.js:

    dockerfile
    FROM node:18-alpine
    WORKDIR /app
    COPY package*.json ./
    RUN npm install
    COPY . .
    CMD ["npm", "start"]
    
  4. Регулярные обновления: Поддерживайте зависимости в актуальном состоянии, выполняя:

    bash
    npm audit fix
    npm update
    
  5. Конфигурация окружения: Создайте файл .env с настройками Node.js:

    NODE_OPTIONS=--openssl-legacy-provider
    

Шаги по устранению неполадок

Если ни одно из вышеперечисленных решений не работает, выполните следующие шаги по устранению неполадок:

  1. Проверьте версию Node.js:

    bash
    node --version
    npm --version
    
  2. Проверьте поддержку OpenSSL:

    bash
    node -e "console.log(process.versions.openssl)"
    
  3. Чистая переустановка:

    bash
    rm -rf node_modules package-lock.json
    npm cache clean --force
    npm install
    
  4. Проверьте конфликтующие пакеты:

    bash
    npm ls webpack
    npm ls react-scripts
    
  5. Тест в другой среде: Попробуйте запустить проект вне IntelliJ IDEA, чтобы изолировать проблемы, специфичные для IDE.

  6. Проверьте системное окружение: Убедитесь, что нет глобальных установок Node.js, конфликтующих с настройками вашего проекта.


Источники

  1. Официальная документация Node.js - OpenSSL Provider
  2. Проблема на GitHub Webpack - Цифровые рутинные обертки
  3. Документация Create React App - Требования к Node.js
  4. Руководство по интеграции Node.js в IntelliJ IDEA
  5. Таблица совместимости версий Node.js

Заключение

Ошибка “digital envelope routines::unsupported” является распространенной проблемой совместимости Node.js, которую можно решить несколькими способами. Наиболее надежными решениями являются либо обновление Node.js до версии 18+, либо использование флага --openssl-legacy-provider для поддержания совместимости с вашей текущей настройкой. Для пользователей IntelliJ IDEA правильная настройка интерпретатора Node.js и добавление переменной окружения в конфигурации запуска обеспечивают бесперебойную работу. Следуя советам по предотвращению и поддерживая зависимости в актуальном состоянии, вы можете избежать этой проблемы в будущих React-проектах. Всегда тестируйте ваше решение в чистой среде, чтобы убедиться, что исправление работает правильно, прежде чем внедрять его в рабочий процесс разработки.