Ошибка Unexpected token import в Node.js: способы решения
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы отладить ошибку SyntaxError: Неожиданный токен import в Node.js представим следующие решения:
Вместо
import
примените функциюrequire()
.const myModule = require('./myModule');
Включите поддержку ES-модулей в Node.js, начиная с 14-й версии:
Можно поменять расширение файлов на
.mjs
. Либо добавьте"type": "module"
вpackage.json
, чтобы включить поддержку синтаксисаimport
:{ "type": "module" }
Тогда импорт будет выглядеть так:
import myModule from './myModule.js';
Установите и используйте Babel для транспиляции кода:
– Установите Babel:
npm install @babel/core @babel/cli @babel/preset-env --save-dev
– Создайте файл
.babelrc
:{ "presets": ["@babel/preset-env"] }
– Запустите процесс транспиляции:
npx babel your-file.js --out-file compiled.js
Выбор метода зависит от версии Node.js и специфики текущего проекта.
Подробное рассмотрение решений
Применение 'esm' для использования 'import'
Если обновление до Node.js v14+ неприемлемо, но import
необходим, то следует:
Установить пакет
esm
:npm install esm
Изменить стартовый скрипт в
package.json
, добавив-r esm
:"scripts": { "start": "node -r esm index.js" }
Совмещение ES-модулей и CommonJS
Если проект использует оба вида модулей, то:
- Замените
export default
наmodule.exports
, когда используйте CommonJS. - Для динамического импорта используйте
import()
, который совместим с CommonJS. - Учтите, что именованные импорты требуют деструктуризацию из
module.exports
.
Использование Babel для поддержки ES-синтаксиса в Node.js
Чтобы обеспечить совместимость ES6 в Node.js:
Установите
babel-cli
глобально:npm install -g @babel/cli
Добавьте
babel-preset-env
, целясь на конкретные среды исполнения:npm install @babel/preset-env --save-dev
Исправьте скрипт
start
для запуска Node.js с Babel:"scripts": { "start": "babel-node index.js" }
Чтобы следить за обновлениями, регулярно обращайтесь к документации Node.js и таблицам совместимости MDN.
Визуализация
Всё может представиться как диалог между Node.js и ES6 'import':
Node.js (🚌): "Добро пожаловать! Здесь мы используем исключительно *require()*."
ES6 Import (🎟️): "У меня есть хороший *import* для вас!"
И тут Node.js выдаёт SyntaxError:
🚌💭 "Не пойму этот токен 🎟️..." 💬 "Неожиданный токен 'import'!"
Убедим Node.js распознавать import
:
// Добавьте поддержку ES6 import в Node.js, используйте --experimental-modules или просто обновите версию
Либо примените такие инструменты, как Babel, для трансформации кода:
Babel (🛠️): Трансформирует *import* (🎟️) в проездной *require()* (✅), который знает Node.js
Полезные материалы
- Модули: ECMAScript (ES) модули | Документация Node.js v21.6.1 — подробное руководство по ES-модулям в Node.js.
- Learn ES2015 · Babel — информация о работе Babel с ES6-модулями.
- Node.js — Предыдущие релизы — история релизов Node.js связанная с поддержкой модулей.
- ECMAScript 6 modules: the final syntax — аналитическая статья об ES6-модулях.
- An Update on ES6 Modules in Node.js — подробности об обновлениях реализации ES6-модулей в Node.js.
- JavaScript modules – JavaScript | MDN — полная информация о модулях JavaScript от Mozilla.