Как исправить "ReferenceError: primordials не определен" в Node.js
Узнайте, как исправить ошибку ReferenceError: primordials не определен в Node.js. Обновление до Gulp 4, понижение версии Node.js и полные альтернативные решения.
Как исправить ошибку «ReferenceError: primordials is not defined» в Node.js
Я установил модули Node.js с помощью npm install, а затем попытался запустить gulp sass-watch в командной строке. После этого я получил следующую ошибку:
[18:18:32] Requiring external module babel-register
fs.js:27
const { Math, Object, Reflect } = primordials;
^
ReferenceError: primordials is not defined
Я уже пробовал выполнить npm -g install gulp-cli перед запуском gulp sass-watch.
Ошибка “ReferenceError: primordials is not defined” в Node.js обычно возникает при использовании Gulp.js версии 3 с Node.js 12 или новее из‑за несовместимости старого Gulp 3.x и новых версий Node.js. Эта ошибка появляется, потому что Gulp 3 зависит от graceful‑fs@3.0.0, который не поддерживает API primordials, введённый в Node.js 12+. Вы можете исправить её, либо обновив до Gulp 4, либо понизив Node.js до версии 10‑11, либо обновив зависимости проекта.
Содержание
- Понимание ошибки
- Анализ причины
- Решение 1: обновление до Gulp 4 (рекомендуется)
- Решение 2: понижение версии Node.js (быстрый фикс)
- Решение 3: альтернативные обходные пути
- Профилактика и лучшие практики
Понимание ошибки
Ошибка ReferenceError: primordials is not defined конкретно возникает в fs.js:27, где код пытается распаковать объект primordials:
const { Math, Object, Reflect } = primordials;
Это сообщение означает, что объект primordials, внутренний API Node.js, введённый в версии 12, недоступен в контексте, где выполняется код. Ошибка обычно проявляется при запуске команд Gulp, особенно gulp sass-watch, как в вашем случае.
Анализ причины
Основная причина — Gulp.js версии 3.x несовместим с Node.js 12 и новее. Согласно исследованию из Stack Overflow, Gulp 3.9.1 работает только с Node 8 (последняя 8.17.0) и ничего более.
Техническое разложение:
- Gulp 3 зависит от
graceful-fs@3.0.0 - Эта версия
graceful‑fsне поддерживает изменения в Node.js 12+ - Node.js 12 ввёл
primordialsкак внутренний API - Старые модули, как
graceful‑fs@3.0.0, не имеют доступа к этому новому API - При попытке загрузки этих модулей Node.js падает, потому что
primordialsне определён
Как подтверждает документация Microsoft SPFX, «Gulp v3 не поддерживается с Node.js v12+. Это не изменение в SPFx. Это упомянуто здесь, чтобы привлечь внимание, поскольку это релиз SPFx добавляет поддержку Node.js v12».
Решение 1: обновление до Gulp 4 (рекомендуется)
Почему это лучшее решение
Обновление до Gulp 4 — это долгосрочный фикс и рекомендуемый подход, потому что он обеспечивает:
- Полную совместимость с текущими версиями Node.js
- Улучшенную производительность и новые возможности
- Активное сопровождение и обновления безопасности
- Будущую совместимость разработки
Пошаговый процесс обновления
-
Удалите старый Gulp глобально и локально:
bashnpm uninstall gulp gulp-cli -g npm uninstall gulp gulp-cli
-
Установите Gulp 4 глобально:
bashnpm install -g gulp-cli
-
Установите Gulp 4 локально:
bashnpm install gulp@4 --save-dev
-
Обновите ваш
gulpfile.jsпод синтаксис Gulp 4:javascriptconst gulp = require('gulp'); const sass = require('gulp-sass'); // Определяем задачу function sassWatch() { return gulp.src('src/scss/**/*.scss') .pipe(sass().on('error', sass.logError)) .pipe(gulp.dest('dist/css')); } // Экспортируем задачу exports.sassWatch = sassWatch; // Задача по умолчанию exports.default = sassWatch; -
Проверьте установку:
bashgulp --version
Вы должны увидеть версии Gulp CLI 4.x и локального Gulp 4.x.
Решение 2: понижение версии Node.js (быстрый фикс)
Когда использовать этот подход
Понижение Node.js — это быстрый фикс, рекомендованный для:
- Устаревших проектов, которые сложно мигрировать до Gulp 4
- Команд с ограниченным временем на крупные рефакторинги
- Проектов со сложными рабочими потоками Gulp 3
Пошаговый процесс понижения
-
Проверьте текущую версию Node.js:
bashnode --version
-
Установите Node Version Manager (nvm), если его нет:
bash# Для macOS/Linux curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash # Для Windows (используя nvm-windows) # Скачайте с: https://github.com/coreybutler/nvm-windows/releases -
Установите и используйте Node.js 11.x или 10.x:
bash# Установить Node.js 11.x nvm install 11 # Или установить Node.js 10.x nvm install 10 # Переключиться на установленную версию nvm use 11 -
Проверьте понижение:
bashnode --version
-
Переустановите зависимости проекта:
bashrm -rf node_modules package-lock.json npm install
Примечание: Согласно исследованию из r/node на Reddit, «использование nvm для получения node 10 устранило ошибку primordials, но теперь появляются ошибки о недостающих именах в некоторых файлах node_modules, например «Cannot find name ‘bigint’» и «Cannot find name ‘AsyncIterableIterator’».
Решение 3: альтернативные обходные пути
Метод А: Очистка lock‑файла
Иногда повреждённый package-lock.json может вызывать проблемы совместимости:
rm package-lock.json
rm -rf node_modules
npm install
Метод B: Создание npm-shrinkwrap.json
Как предложил TimOnWeb, вы можете создать файл npm-shrinkwrap.json, чтобы закрепить версии зависимостей:
npm shrinkwrap
Метод C: Обновление npm и обеспечение совместимости
Согласно CodeForGeek, обновление npm и проверка совместимости могут помочь:
npm install -g npm@latest npm audit fix
Метод D: Альтернативные инструменты сборки
Рассмотрите замену Gulp на современные альтернативы:
- Vite – быстрый инструмент сборки
- Webpack – модульный бандлер
- Parcel – бандлер без конфигурации
Профилактика и лучшие практики
Регулярное обновление зависимостей
-
Используйте
npm outdatedдля проверки обновлений:bashnpm outdated
-
Тестируйте совместимость перед крупными обновлениями:
bashnpm install node@latest --dry-run
Структура проекта
-
Используйте
.npmrcдля принудительного указания версии Node.js:iniengine-strict=true engines={ "node": ">=14.0.0 <15.0.0", "npm": ">=6.0.0" } -
Добавьте скрипты для проверки совместимости:
json{ "scripts": { "preinstall": "node -e \"if (parseInt(process.version.split('.')[0]) < 14) console.log('Warning: Node.js version < 14 may cause compatibility issues')\"", "test": "npm run test:build && npm run test:lint" } }
Стратегия миграции
Для существующих проектов с Gulp 3:
- Этап 1: Тестируйте совместимость Gulp 4 в отдельной ветке
- Этап 2: Пошагово мигрируйте задачи под синтаксис Gulp 4
- Этап 3: Удалите зависимости Gulp 3
- Этап 4: Обновите документацию и знания команды
Заключение
Ошибка “ReferenceError: primordials is not defined” в основном является проблемой совместимости между Gulp 3 и современными версиями Node.js. Ключевые выводы:
- Для новых проектов: всегда используйте последние стабильные версии Node.js и инструменты сборки, такие как Gulp 4.
- Для устаревших проектов: выбирайте между обновлением до Gulp 4 (рекомендуется) или понижением Node.js (быстрый фикс).
- Профилактика: регулярные обновления зависимостей и проверки совместимости помогут избежать подобных ошибок.
- Долгосрочное решение: переход на современные инструменты сборки обеспечивает лучшую производительность, безопасность и поддержку.
Если вы работаете в команде, согласуйте миграцию, чтобы все использовали совместимые версии. Всегда тщательно тестируйте пайплайн сборки после изменений версий, чтобы выявить проблемы совместимости как можно раньше.