Błąd analizy ESLint: nieoczekiwany token


169

Za pomocą tego kodu:

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

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

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

Otrzymuję ten błąd eslint:

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

Oto moja konfiguracja 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
    }],
  }
}

.... .... Jaki jest problem?


czy możesz opublikować swoją konfigurację eslint?
azium

dzięki już
przesłałem

3
Musisz użyć parsera, który obsługuje propozycję właściwości rozszerzania obiektu.
Felix Kling

Marnujesz nieoczekiwany „import” tokena? To był mój problem .
Lonnie Best

Odpowiedzi:


253

Nieoczekiwane błędy tokenów podczas analizowania ESLint są spowodowane niekompatybilnością pomiędzy twoim środowiskiem programistycznym a obecnymi możliwościami parsowania ESLint z bieżącymi zmianami w JavaScripts ES6 ~ 7.

Dodanie właściwości „parserOptions” do pliku .eslintrc nie wystarcza już w określonych sytuacjach, takich jak używanie

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

w klasach ES6, ponieważ ESLint nie jest obecnie w stanie samodzielnie go przeanalizować. Ta szczególna sytuacja spowoduje wyświetlenie błędu:

error Parsing error: Unexpected token =

Rozwiązaniem jest przeanalizowanie ESLint przez zgodny parser. babel-eslint to pakiet, który uratował mnie niedawno po przeczytaniu tej strony i zdecydowałem się dodać go jako alternatywne rozwiązanie dla każdego, kto przyjdzie później.

poprostu dodaj:

"parser": "babel-eslint"

do swojego .eslintrcpliku i uruchom npm install babel-eslint --save-devlub yarn add -D babel-eslint.

Należy pamiętać, że ponieważ nowy interfejs API kontekstu zaczynający się od React ^16.3ma kilka ważnych zmian, zapoznaj się z oficjalnym przewodnikiem .


4
yarn add -D babel-eslintdla osób używających przędzy.
Neurotransmitter

8
Dla tych, którzy nie wiedzą, gdzie dodać instrukcję "parser": "babel-eslint"config, znajduje się ona w .eslintrc.json. W moim przypadku jest to plik JSON, ale w zasadzie twój plik .eslintrc
Avid Programmer

2
Uwaga * Jeśli "wyrzuciłeś" swoją aplikację create-react-app i dodajesz eslint-ing do swojego IDE, babel-eslint jest już zastosowany. Po prostu dodaj parser i gotowe.
Wes Duff

1
Ten artykuł też okazał się
gurun8

Dodałem "parser": "babel-eslint"do mojego pliku eslintrc, ale zamiast tego otrzymałem wiele błędów. Pracuję z React i mówi mi, że moje zaimportowane komponenty zostały wywołane, ale nigdy nie były używane. Co jest dziwne.
David Essien

61

ESLint 2.x eksperymentalnie obsługuje składnię ObjectRestSpread, możesz ją włączyć, dodając do .eslintrc: docs

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

ESLint 1.x nie obsługuje natywnie operatora rozprzestrzeniania, jednym ze sposobów obejścia tego jest użycie parsera babel-eslint . Najnowsze instrukcje instalacji i użytkowania znajdują się w pliku Readme projektu.


2
To nieprawda. Domyślny parser ESLint, Espree, obsługuje rozprzestrzenianie, a nawet rozprzestrzenianie reszty obiektów (to jedyna eksperymentalna funkcja obsługiwana przez espree). Aby uzyskać więcej informacji, zobacz: eslint.org/docs/user-guide/ ...
Ilya

1
ecmaFeatureszostał wycofany. UżyjecmaVersion
Richard Ayotte

7
ecmaVersion: 2018działa bez ostrzeżenia z ESLint 5
Tomasz Racia

1
Najlepsze rozwiązanie, jeśli mogę tak powiedzieć.
Ansjovis86

1
Nie widzę problemu z tym rozwiązaniem - działało dobrze. To lepsze niż konieczność instalowania nowego pakietu!
Gracz Steam

49

"parser": "babel-eslint" pomógł mi rozwiązać problem

{
    "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"
        }
    }
}

Odniesienie


3
Ta odpowiedź nie dodaje niczego do odpowiedzi @ JaysQubeXon.
cs01

7
Właściwie tak - otrzymujesz przykładową konfigurację (z dołączonymi parserOptions)
kriskodzi

Dobrze mieć pełny przykład ++. Pomogło mi to naprawić błąd podpowiedzi TamperMonkey JS.
brasofilo

@brasofilo gdzie zmieniasz eslint w tamper monkey?
Metin Dagcilar

22

Rozwiązałem ten problem przez First, instalując babel-eslint przy użyciu npm

npm install babel-eslint --save-dev

Po drugie, dodaj tę konfigurację w pliku .eslintrc

{
   "parser":"babel-eslint"
}

Dzięki, to rozwiązało moje problemy z
lintingiem

21

W moim przypadku (używam Firebase Cloud Functions) otworzyłem .eslintrc.jsoni zmieniłem:

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

do:

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

8

Pierwotnie rozwiązanie polegało na zapewnieniu następującej konfiguracji, ponieważ destrukcja obiektów była kiedyś funkcją eksperymentalną i nie była domyślnie obsługiwana:

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

Od wersji 5 ta opcja jest przestarzała .

Teraz wystarczy tylko zadeklarować wersję ES, która jest wystarczająco nowa:

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

1

Jeśli masz zadanie przed zatwierdzeniem z bieganiem husky eslint, kontynuuj czytanie. Wypróbowałem większość odpowiedzi parserOptionsi parserwartości, w których mój rzeczywisty problem dotyczył wersji węzła, którego używałem.

Moja aktualna wersja węzła to 12.0.0, ale husky w jakiś sposób używał mojej domyślnej wersji nvm (mimo że nie miałem nvmw moim systemie). Wydaje się, że jest to problem z samym husky . Więc:

  1. I usunięty $HOME/.nvmfolder, który nie został usunięty, kiedy usunięte nvmwcześniej.
  2. Zweryfikowany węzeł jest najnowszy i ma odpowiednie opcje parsera.
  3. Zaczęło działać!

1

Tak dla przypomnienia , jeśli używasz eslint-plugin-vue , prawidłowe miejsce do dodania 'parser': 'babel-eslint'to wewnątrz parserOptionsparam.

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.