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?

DongYao
źródło
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 .

JaysQubeXon
źródło
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.

Kevan Ahlquist
źródło
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

Rajendran Nadar
źródło
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"
}
Joee
źródło
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
},
Alvin Konda
źródło
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
  }
}
Vojtech Ruzicka
źródło
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ć!
Asim KT
źródło
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

Cristiano
źródło