logo

Ошибка Unexpected token import в Node.js: способы решения

Быстрый ответ

Чтобы отладить ошибку SyntaxError: Неожиданный токен import в Node.js представим следующие решения:

  1. Вместо import примените функцию require().

    JS
    Скопировать код
    const myModule = require('./myModule');
  2. Включите поддержку ES-модулей в Node.js, начиная с 14-й версии:

    Можно поменять расширение файлов на .mjs. Либо добавьте "type": "module" в package.json, чтобы включить поддержку синтаксиса import:

    json
    Скопировать код
    {
      "type": "module"
    }

    Тогда импорт будет выглядеть так:

    JS
    Скопировать код
    import myModule from './myModule.js';
  3. Установите и используйте Babel для транспиляции кода:

    – Установите Babel:

    shell
    Скопировать код
    npm install @babel/core @babel/cli @babel/preset-env --save-dev

    – Создайте файл .babelrc:

    json
    Скопировать код
    {
      "presets": ["@babel/preset-env"]
    }

    – Запустите процесс транспиляции:

    shell
    Скопировать код
    npx babel your-file.js --out-file compiled.js

Выбор метода зависит от версии Node.js и специфики текущего проекта.

Подробное рассмотрение решений

Применение 'esm' для использования 'import'

Если обновление до Node.js v14+ неприемлемо, но import необходим, то следует:

  • Установить пакет esm:

    shell
    Скопировать код
    npm install esm
  • Изменить стартовый скрипт в package.json, добавив -r esm:

    json
    Скопировать код
    "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 глобально:

    shell
    Скопировать код
    npm install -g @babel/cli
  • Добавьте babel-preset-env, целясь на конкретные среды исполнения:

    shell
    Скопировать код
    npm install @babel/preset-env --save-dev
  • Исправьте скрипт start для запуска Node.js с Babel:

    json
    Скопировать код
    "scripts": {
      "start": "babel-node index.js"
    }

Чтобы следить за обновлениями, регулярно обращайтесь к документации Node.js и таблицам совместимости MDN.

Визуализация

Всё может представиться как диалог между Node.js и ES6 'import':

Markdown
Скопировать код
Node.js (🚌): "Добро пожаловать! Здесь мы используем исключительно *require()*."
ES6 Import (🎟️): "У меня есть хороший *import* для вас!"

И тут Node.js выдаёт SyntaxError:

Markdown
Скопировать код
🚌💭 "Не пойму этот токен 🎟️..." 💬 "Неожиданный токен 'import'!"

Убедим Node.js распознавать import:

JS
Скопировать код
// Добавьте поддержку ES6 import в Node.js, используйте --experimental-modules или просто обновите версию

Либо примените такие инструменты, как Babel, для трансформации кода:

Markdown
Скопировать код
Babel (🛠️): Трансформирует *import* (🎟️) в проездной *require()* (✅), который знает Node.js

Полезные материалы

  1. Модули: ECMAScript (ES) модули | Документация Node.js v21.6.1 — подробное руководство по ES-модулям в Node.js.
  2. Learn ES2015 · Babel — информация о работе Babel с ES6-модулями.
  3. Node.js — Предыдущие релизы — история релизов Node.js связанная с поддержкой модулей.
  4. ECMAScript 6 modules: the final syntax — аналитическая статья об ES6-модулях.
  5. An Update on ES6 Modules in Node.js — подробности об обновлениях реализации ES6-модулей в Node.js.
  6. JavaScript modules – JavaScript | MDN — полная информация о модулях JavaScript от Mozilla.