Ошибка Parsing error возникает на этапе синтаксического
разбора исходного кода, когда парсер, используемый ESLint, не способен
интерпретировать конструкцию JavaScript-файла в соответствии с заданной
конфигурацией. В отличие от линтинговых правил, работающих на уровне AST
после разбора, parsing error появляется раньше — до применения правил
анализа кода.
Чаще всего сообщение выглядит так:
Parsing error: Unexpected token
Parsing error: Cannot use import statement outside a module
Parsing error: Unexpected reserved word
Ключевая особенность таких ошибок — они почти всегда связаны не с самим кодом, а с настройками парсера или окружения.
Одна из наиболее частых причин — неверно указанная версия ECMAScript в конфигурации.
ESLint по умолчанию использует ограниченный набор синтаксиса. Если
код написан с использованием современных возможностей (optional
chaining, nullish coalescing, top-level await), а
parserOptions.ecmaVersion не обновлён, возникает ошибка
разбора.
Пример проблемной конфигурации:
{
"parserOptions": {
"ecmaVersion": 2015
}
}
Код:
const value = obj?.data?.list;
Исправление:
{
"parserOptions": {
"ecmaVersion": 2022
}
}
Важно учитывать, что ecmaVersion влияет только на
синтаксис, но не на семантику модулей или JSX.
Другой критический параметр — sourceType. Он определяет,
как интерпретируется файл: как скрипт или как модуль.
Некорректная настройка:
{
"parserOptions": {
"sourceType": "script"
}
}
Код:
import fs from "fs";
Результат:
Parsing error: Cannot use import statement outside a module
Исправление:
{
"parserOptions": {
"sourceType": "module"
}
}
ESLint строго разделяет режимы исполнения, и модульный синтаксис требует явного указания.
По умолчанию ESLint использует встроенный парсер Espree. Однако во многих проектах требуется замена:
@typescript-eslint/parser@babel/eslint-parserЕсли парсер не установлен или указан неверно, возникает parsing error уже на уровне инициализации.
Пример:
{
"parser": "@typescript-eslint/parser"
}
Но пакет не установлен:
Parsing error: Cannot find module '@typescript-eslint/parser'
Исправление:
npm install -D @typescript-eslint/parser
При использовании современного JavaScript через Babel часто возникает ситуация, когда код корректно транспилируется, но ESLint не понимает исходный синтаксис.
Типичный случай — использование
@babel/eslint-parser.
Конфигурация:
{
"parser": "@babel/eslint-parser",
"parserOptions": {
"requireConfigFile": false,
"babelOptions": {
"presets": ["@babel/preset-env"]
}
}
}
Ошибки появляются, если:
requireConfigFileПри использовании @typescript-eslint/parser частая
причина parsing error — отсутствие или некорректный
tsconfig.json.
ESLint при включённой опции project пытается загрузить
TypeScript-проект для построения AST.
Ошибка:
Parsing error: "parserOptions.project" has been set for @typescript-eslint/parser.
The file does not match your project config
Причины:
includetsconfig.base.jsonИсправление:
{
"parserOptions": {
"project": "./tsconfig.json"
}
}
И проверка:
{
"include": ["src"]
}
JSX требует явного включения поддержки:
{
"parserOptions": {
"ecmaFeatures": {
"jsx": true
}
}
}
Без этого ESLint выдаёт:
Parsing error: Unexpected token <
Особенно часто это проявляется при React-проектах, где JSX является стандартом.
Современные версии ESLint поддерживают Flat Config
(eslint.config.js), однако многие проекты продолжают
использовать legacy .eslintrc.
Конфликты возникают, когда:
Пример проблемы:
export default [
{
languageOptions: {
parserOptions: {
ecmaVersion: 2022
}
}
}
]
Но при этом .eslintrc.json продолжает переопределять
настройки.
Результат — неожиданный parsing error.
Парсер ESLint зависит от возможностей Node.js. При старых версиях Node:
Ошибка может выглядеть как:
Parsing error: Unexpected token .
Решение — обновление Node.js до LTS-версии.
В монорепозиториях parsing error часто возникает из-за того, что ESLint не видит файл в контексте нужного tsconfig или babel config.
Причины:
root: trueПример:
{
"root": true
}
Без этого ESLint может подниматься выше по дереву и использовать чужую конфигурацию.
Иногда parsing error сохраняется даже после исправления конфигурации из-за кеша.
Очистка:
eslint --no-cache .
или удаление:
node_modules/.cache
ESLint может сохранять старый AST, особенно в CI-средах.
При сложных случаях помогает изоляция:
{
"parserOptions": {
"ecmaVersion": 2022,
"sourceType": "module"
}
}
И запуск только одного файла:
eslint test.js
Если ошибка исчезает — проблема в конфигурационном дереве, а не в коде.
Некоторые плагины для ESLint требуют строгого соответствия версии parser:
Несовместимость может приводить к parsing error даже при корректном коде.
Типичный симптом:
Parsing error: Unexpected token =>
Хотя код валиден, плагин ожидает другую версию AST.
Если среда выполнения не указана, парсер может трактовать код некорректно:
{
"env": {
"browser": true,
"node": false
}
}
Без этого могут появляться ошибки:
Parsing error: 'window' is not defined
Хотя технически это уже ближе к линтингу, часть ошибок всплывает на стадии парсинга в зависимости от конфигурации.
При появлении parsing error в ESLint последовательность проверки всегда сводится к:
parserOptions.ecmaVersionsourceTypeЛюбая ошибка парсинга почти всегда локализуется на уровне конфигурации, а не кода.