ESLint解析错误:意外的令牌


168

使用此代码:

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

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

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

我收到此错误提示:

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配置吗?
2016年

谢谢,我已经上传了
〜– DongYao

3
您需要使用支持对象传播属性建议的解析器。
菲利克斯·克林

浪费了意外的令牌“导入”?那是我的问题
Lonnie Best,

Answers:


252

ESLint解析中出现意外的令牌错误是由于开发环境与ESLint当前的解析功能之间的不兼容以及JavaScript 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-devyarn add -D babel-eslint

请注意,由于新的Context API从开始React ^16.3就进行了一些重要更改,请参考官方指南


4
yarn add -D babel-eslint对于那些使用纱线的人。
Neurotransmitter

7
对于那些不知道在哪里添加"parser": "babel-eslint"config语句的人,它位于.eslintrc.json。就我而言,这是一个JSON文件,但基本上是您的.eslintrc文件
Avid Programmer

2
注意*如果“弹出”了create-react-app,并且正在向IDE中添加eslint-ing,则已经应用了babel-eslint。只需添加解析器,然后您就可以使用了。
Wes Duff

1
我发现这篇文章也很有帮助:grantnorwood.com/…–
gurun8

我将"parser": "babel-eslint"eslintrc文件添加了,但是出现了多个错误。我正在与react一起工作,它告诉我我导入的组件已被调用但从未使用过。这很奇怪。
David Essien

61

ESLint 2.x实验性地支持ObjectRestSpread语法,您可以通过将以下内容添加到您的文档中来启用它.eslintrc

"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: 2018ESLint 5
Tomasz Racia

1
如果我可以这样说,那是最好的解决方案。
Ansjovis86 '19

1
我看不到此解决方案有问题-对我来说效果很好。总比必须安装新软件包要好!
Steam游戏玩家

48

"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 18/12/12

拥有完整的示例++很高兴。它帮助我修复了TamperMonkey JS提示错误。
brasofilo

@brasofilo您在哪里更改捣蛋猴子的夹板?
Metin Dagcilar

22

我首先通过使用npm安装babel-eslint解决了这个问题

npm install babel-eslint --save-dev

其次,将此配置添加到.eslintrc文件中

{
   "parser":"babel-eslint"
}

谢谢,这解决了我的
掉毛

21

以我为例(即使用Firebase Cloud Functions),我打开.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/.nvmnvm较早删除时未删除的文件夹
  2. 经过验证的节点是最新的,并且具有正确的解析器选项。
  3. 它开始工作了!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.