Помилка ESLint Parsing: Несподіваний маркер


169

З цим кодом:

import React from 'react';
import { Link } from 'react-router';
import { View, NavBar } from 'amazeui-touch';

import * as Pages from '../components';

const {  Home, ...Components } = Pages;

Я отримую цю помилку eslint:

7:16  error  Parsing error: Unexpected token .. Why?

Ось моя конфігурація eslint:

{
  "extends": "airbnb",
  "rules": {
    /* JSX */
    "react/prop-types": [1, {
      "ignore": ["className", "children", "location", "params", "location*"]
    }],
    "no-param-reassign": [0, {
      "props": false
    }],
    "prefer-rest-params": 1,
    "arrow-body-style": 0,
    "prefer-template": 0,
    "react/prefer-stateless-function": 1,
    "react/jsx-no-bind": [0, {
      "ignoreRefs": false,
      "allowArrowFunctions": false,
      "allowBind": true
    }],
  }
}

.... .... В чому проблема?


чи можете ви опублікувати конфігурацію eslint?
— азій

дякую, я вже завантажив ~
— DongYao

3
Потрібно використовувати аналізатор, який підтримує пропозицію властивості об'єкта поширювати.
— Фелікс Клінг

Зтратив несподіваний "імпорт" токена? Це було моє питання .
— Lonnie Best

Відповіді:


253

Несподівані помилки маркера при синтаксичному розборі ESLint виникають через несумісність між вашим середовищем розробки та поточними можливостями розбору ESLint з поточними змінами з JavaScripts ES6 ~ 7.

Додавання властивості "parserOptions" до вашого .eslintrc більше не достатньо для конкретних ситуацій, таких як використання

static contextTypes = { ... } /* react */

в класах ES6, оскільки ESLint наразі не може самостійно їх розібрати. Ця конкретна ситуація призведе до помилки:

error Parsing error: Unexpected token =

Рішення полягає в тому, щоб ESLint розбирав сумісний аналізатор. babel-eslint - це пакет, який нещодавно врятував мене після прочитання цієї сторінки, і я вирішив додати це як альтернативне рішення для тих, хто прийде пізніше.

просто додайте:

"parser": "babel-eslint"

у свій .eslintrcфайл і запустіть npm install babel-eslint --save-devабо yarn add -D babel-eslint.

Зауважте, що новий API контексту, який починається з React ^16.3деяких важливих змін, перегляньте офіційне керівництво .


4
yarn add -D babel-eslintдля тих, хто використовує пряжу.
— Нейромедіатор

8
Для тих, хто не знає, куди додати "parser": "babel-eslint"конфігураційний оператор, він знаходиться в .eslintrc.json. У моєму випадку це файл JSON, але в основному ваш файл .eslintrc
— Avid Programmer

2
Примітка * Якщо ви "викинули" додаток create-react і додаєте eslint-ing до свого IDE, babel-eslint вже застосовується. Просто додайте парсер і ваше добро.
— Уес Дафф

1
Цю статтю я також вважаю
— gurun8

Я додав "parser": "babel-eslint"файл у свій файл eslintrc, але натомість отримав кілька помилок. Я працюю з react, і це говорить мені, що Мої імпортні компоненти називались, але ніколи не використовувалися. Який гарний.
— Девід Ессьєн

61

ESLint 2.x експериментально підтримує синтаксис ObjectRestSpread, ви можете ввімкнути його, додавши до своїх елементів .eslintrc: docs

"parserOptions": {
  "ecmaVersion": 6,
  "ecmaFeatures": {
    "experimentalObjectRestSpread": true
  }
},

ESLint 1.x не підтримує оператора розповсюдження, один із способів обійти це - за допомогою аналізатора babel-eslint . Останні інструкції з встановлення та використання містяться в проектній програмі.


2
Це не правда. Аналізатор ESLint за замовчуванням Espree підтримує розширення і навіть розповсюдження спокою об’єкта (це єдина експериментальна функція, яка підтримує espree). Для отримання додаткової інформації дивіться це: eslint.org/docs/user-guide/…
— Ілля Володін

1
ecmaFeaturesзастаріло. ВикористанняecmaVersion
— Річард Айотт

7
ecmaVersion: 2018працює без попередження з ESLint 5
— Tomasz Racia

1
Найкраще рішення, якщо я можу так сказати.
— Ansjovis86

1
Я не бачу проблем з цим рішенням - він справно працював для мене. Це також краще, ніж установити новий пакет!
— Паровий геймер

49

"parser": "babel-eslint" допомогло мені виправити проблему

{
    "parser": "babel-eslint",
    "parserOptions": {
        "ecmaVersion": 6,
        "sourceType": "module",
        "ecmaFeatures": {
            "jsx": true,
            "modules": true,
            "experimentalObjectRestSpread": true
        }
    },
    "plugins": [
        "react"
    ],
    "extends": ["eslint:recommended", "plugin:react/recommended"],
    "rules": {
        "comma-dangle": 0,
        "react/jsx-uses-vars": 1,
        "react/display-name": 1,
        "no-unused-vars": "warn",
        "no-console": 1,
        "no-unexpected-multiline": "warn"
    },
    "settings": {
        "react": {
            "pragma": "React",
            "version": "15.6.1"
        }
    }
}

Довідково


3
Ця відповідь нічого не додає до відповіді @ JaysQubeXon.
— cs01

7
Насправді це так - ви отримуєте приклад конфігурації (з включеними parserOptions)
— kriskodzi

Чудово мати повний приклад ++. Це допомогло мені виправити помилки натяків на TamperMonkey JS.
— brasofilo

@brasofilo де ти міняєш еслінт у мавпочки?
— Metin Dagcilar

22

Я вирішив цю проблему спочатку, встановивши babel-eslint за допомогою npm

npm install babel-eslint --save-dev

По-друге, додайте цю конфігурацію у файл .eslintrc

{
   "parser":"babel-eslint"
}

Дякую, це
— вирішило

21

У моєму випадку (я використовую хмарні функції Firebase) я відкрив .eslintrc.jsonта змінив:

"parserOptions": {
  // Required for certain syntax usages
  "ecmaVersion": 2017
},

до:

"parserOptions": {
  // Required for certain syntax usages
  "ecmaVersion": 2018
},

8

Спочатку рішення полягало в наданні наступного конфігурації як деструктуризації об'єкта, що використовувався в якості експериментальної функції і не підтримується за замовчуванням:

{
  "parserOptions": {
    "ecmaFeatures": {
      "experimentalObjectRestSpread": true
    }
  }
}

Починаючи з версії 5, ця опція застаріла .

Тепер достатньо лише оголосити версію ES, яка є достатньо новою:

{
  "parserOptions": {
    "ecmaVersion": 2018
  }
}

1

Якщо у вас є попереднє завдання із запуском хаскі eslint, будь ласка, продовжуйте читати. Я спробував більшість відповідей про parserOptionsтаparser значення, де моя справжня проблема стосувалася версії вузла, яку я використовував.

Моя поточна версія вузла становила 12.0.0, але хаскі якось використовував мою версію за замовчуванням nvm (хоча я не мав nvmу своїй системі). Здається, це проблема з самим хаскі . Так:

  1. Я видалив $HOME/.nvmпапку, яку не було видалено, коли я її видалив nvmраніше.
  2. Перевірений вузол - це останній і правильний параметр параметри.
  3. Це почало працювати!

1

Тільки для запису, якщо ви використовуєте eslint-plugin-vue , правильне місце для додавання 'parser': 'babel-eslint'- це parserOptionsпарам.

  'parserOptions': {
    'parser': 'babel-eslint',
    'ecmaVersion': 2018,
    'sourceType': 'module'
  }

https://eslint.vuejs.org/user-guide/#faq

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.