ข้อผิดพลาดในการแยกวิเคราะห์ ESLint: โทเค็นที่ไม่คาดคิด


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 config ของฉัน:

{
  "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 config ของคุณได้ไหม?
azium

ขอบคุณฉันได้อัพโหลดไปแล้ว ~
DongYao

3
คุณต้องใช้ตัวแยกวิเคราะห์ที่รองรับข้อเสนอคุณสมบัติการกระจายวัตถุ
เฟลิกซ์คลิง

โทเค็น "นำเข้า" ที่ไม่คาดคิดเป็นอย่างไร นั่นคือของฉันปัญหา
Lonnie Best

คำตอบ:


253

ข้อผิดพลาดของโทเค็นที่ไม่คาดคิดในการแยกวิเคราะห์ ESLint เกิดขึ้นเนื่องจากความไม่ลงรอยกันระหว่างสภาพแวดล้อมการพัฒนาของคุณกับความสามารถในการแยกวิเคราะห์ปัจจุบันของ ESLint ด้วยการเปลี่ยนแปลงอย่างต่อเนื่องกับ JavaScripts ES6 ~ 7

การเพิ่มคุณสมบัติ "parserOptions" ใน. eslintrc ของคุณไม่เพียงพอสำหรับสถานการณ์เฉพาะเช่นการใช้

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

ในคลาส ES6 เนื่องจาก ESLint ไม่สามารถแยกวิเคราะห์ได้ด้วยตนเอง สถานการณ์เฉพาะนี้จะทำให้เกิดข้อผิดพลาด:

error Parsing error: Unexpected token =

การแก้ปัญหาคือการแยกวิเคราะห์ ESLint โดย parser ที่เข้ากันได้ babel-eslint เป็นแพ็คเกจที่ช่วยฉันเมื่อไม่นานมานี้หลังจากอ่านหน้านี้และฉันตัดสินใจที่จะเพิ่มสิ่งนี้เป็นทางเลือกสำหรับทุกคนที่มาในภายหลัง

เพียงเพิ่ม:

"parser": "babel-eslint"

ที่คุณ.eslintrcไฟล์และเรียกใช้หรือnpm install babel-eslint --save-devyarn add -D babel-eslint

โปรดทราบว่าเป็นบริบทใหม่ APIเริ่มต้นจากReact ^16.3มีการเปลี่ยนแปลงที่สำคัญบางโปรดดูที่คู่มืออย่างเป็นทางการ


4
yarn add -D babel-eslintสำหรับผู้ที่ใช้ไหมพรม
สารสื่อประสาท

8
สำหรับผู้ที่ไม่รู้ว่าจะเพิ่ม"parser": "babel-eslint"คำสั่ง config ไว้ที่.eslintrc.jsonใด ในกรณีของฉันมันเป็นไฟล์ JSON แต่โดยพื้นฐานแล้วไฟล์. eslintrc ของคุณ
Avid โปรแกรมเมอร์

2
หมายเหตุ * ถ้าคุณมี "ejected" create-react-app ของคุณและคุณกำลังเพิ่ม eslint-ing เข้ากับ IDE ของคุณ Babel-eslint จะถูกนำไปใช้แล้ว เพียงเพิ่ม parser และของดีของคุณไป
Wes Duff

1
ฉันพบว่าบทความนี้มีประโยชน์เช่นกัน: grantnorwood.com/…
gurun8

ฉันเพิ่มลงใน"parser": "babel-eslint"ไฟล์ eslintrc ของฉัน แต่มีข้อผิดพลาดหลายอย่างแทน ฉันทำงานกับการตอบสนองและมันบอกฉันว่าส่วนประกอบที่นำเข้าของฉันถูกเรียกใช้ แต่ไม่เคยใช้ อันไหนแปลก
David Essien

61

ESLint 2.x สนับสนุนการทดสอบ ObjectRestSpread ไวยากรณ์คุณสามารถเปิดใช้งานได้โดยเพิ่มสิ่งต่อไปนี้ใน.eslintrc: docs

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

ESLint 1.x ไม่รองรับผู้ประกอบการแพร่กระจายวิธีหนึ่งที่จะได้รับรอบนี้คือการใช้parser Babel-eslint คำแนะนำในการติดตั้งและการใช้งานล่าสุดอยู่ใน readme ของโครงการ


2
ที่ไม่เป็นความจริง. Espree parser เริ่มต้นของ ESLint รองรับการแพร่กระจายและแม้กระทั่งการวางส่วนที่เหลือของวัตถุ (นั่นเป็นคุณลักษณะทดลองเพียงอย่างเดียวที่ espree สนับสนุน) สำหรับข้อมูลเพิ่มเติมดูที่นี่: eslint.org/docs/user-guide/ …
Ilya Volodin

1
ecmaFeaturesเลิกใช้แล้ว ใช้ecmaVersion
Richard Ayotte

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 คุณเปลี่ยน eslint เป็นลิงงัดแงะที่ไหน?
Metin Dagcilar

22

ฉันแก้ไขปัญหานี้โดยขั้นแรกติดตั้ง babel-eslint โดยใช้ npm

npm install babel-eslint --save-dev

ประการที่สองเพิ่มการกำหนดค่านี้ในไฟล์. eslintrc

{
   "parser":"babel-eslint"
}

ขอบคุณนี้แก้ไขปัญหาที่
ขยิบตา

21

ในกรณีของฉัน (ฉันใช้ฟังก์ชัน Firebase Cloud) ฉันเปิด.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. มันเริ่มทำงาน!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.