Gobliins
Gobliins

Reputation: 4026

ESLint howto fix parsing error: 'import' and 'export' may only appear at the top level

NOTE: The Code is working, only ESLint is giving me an error which I want to fix!!

When doing a dynamic import:

if (true) import x from 'y'; //Parsing error: 'import' and 'export' may only appear at the top level

my .eslintrc

{
  "root": true,
  "extends": "eslint:recommended",
  "env": {
    "es6": true,
    "node": true,
    "browser": true
  },
  "parserOptions": {
    "ecmaVersion": 10,
    "sourceType": "module",
    "ecmaFeatures": {
      "jsx": true
    }
  },
  "rules": {
    "strict": 0,
    "no-undef": 2,
    "accessor-pairs": 2,
    "comma-dangle": [2, "always-multiline"],
    "consistent-return": 2,
    "dot-notation": 2,
    "eqeqeq": 2,
    "indent": [2, 2, {"SwitchCase": 1}],
    "no-cond-assign": 2,
    "no-constant-condition": 2,
    "no-eval": 2,
    "no-inner-declarations": [0],
    "no-unneeded-ternary": 2,
    "radix": 2,
    "semi": [2, "always"],
    "camelcase": 2,
    "comma-spacing": 2,
    "comma-style": 2,
    "eol-last": 2,
    "linebreak-style": [2, "unix"],
    "new-parens": 2,
    "no-lonely-if": 2,
    "no-multiple-empty-lines": 2,
    "no-nested-ternary": 2,
    "no-spaced-func": 2,
    "no-trailing-spaces": 2,
    "operator-linebreak": 2,
    "quotes": [2, "single"],
    "semi-spacing": 2,
    "space-unary-ops": 2,
    "arrow-parens": 2,
    "arrow-spacing": 2,
    "no-class-assign": 2,
    "no-dupe-class-members": 2,
    "no-var": 2,
    "object-shorthand": 2,
    "prefer-const": 2,
    "prefer-spread": 2,
    "prefer-template": 2
  },

i already tried:
...switching ecmaVersion to, 11, 2018, 2019, 2020 which give me either wrong number or parser didn't work anymore
...added parser: babel-eslint which make the parser not work anymore
...added allowImportsExportsAnywhere: true which did nothing

Upvotes: 9

Views: 20987

Answers (3)

Mark
Mark

Reputation: 180631

See https://eslint.org/blog/2019/08/eslint-v6.2.0-released#highlights

This release adds support for ES2020 syntax, which includes support for Dynamic Imports and BigInt. This can be enabled using ecmaVersion: 2020 in your configuration file.

That would seem to suggest adding this to your .eslintrc.json file and reloading vscode:

"parserOptions": {
  "ecmaVersion": 2020,
  "sourceType": "module",
  "ecmaFeatures": {
    "jsx": true
  }
},

or "ecmaVersion": 11, which is the same thing.

But I get a different error option about an invalid ecmaVersion when I do that. This seems to remove that error:

"env": {
    "browser": true,
    "node": true,
    "es2020": true
},

and no ecmaVersion in the parserOptions! Apparently vscode's version of eslint doesn't support "ecmaVersion": 2020 yet.

Upvotes: 31

Alexfrostwolf
Alexfrostwolf

Reputation: 450

Maybe you can use in this structure

const x =
  your condition ? require("y") : () => null;

In your component

{ your condition ?(<x/>):("")}

Upvotes: 1

Styler
Styler

Reputation: 32

Looks like the syntax is wrong. Try this:

if (true) 
  import('y').then((x) => {
     console.log(x);
  });

Upvotes: 0

Related Questions