0
votes

In Visual Studio Code I get Parsing error: The keyword 'import' is reserved. 1

What actions would you recommend to remedy this error?


I provide my .eslintrc.json and package.json files below.
However, they will likely not be sufficient to reproduce the error.
So here is a link to a zip file containing all the necessary project files. 2

The project is (locally) installed by running npm install – this may take about 5-9 minutes.
Then npm start should open the project in the default web browser. 3

When I do this and hit F12, I get no errors but two warnings in the console of the browser.
The warnings are:

  • 'unUsedArgument' is defined but never used. Allowed unused args must match /^_/u no-unused-vars, and

  • 'unUsedVariable' is assigned a value but never used. Allowed unused vars must match /^_/u no-unused-vars.

Running 'npm start' gives 2 warnings in the browser but no error


The error in the title, Parsing error: The keyword 'import' is reserved, shows up when I open App.js in VS Code.

Parsing error: The keyword 'import' is reserved

But this error has nothing to do with my choice of text editor,
which is easy to confirm by running ESLint from the command line. 4

node_modules/.bin/eslint . --ext .js

Parsing error: The keyword 'import' is reserved


.eslintrc.json :

{
  "rules": {
    "no-unused-vars": [
      "warn",
      {
        "argsIgnorePattern": "^_",
        "varsIgnorePattern": "^_"
      }
    ]
  }
}

package.json :

{
  "name": "parsing-error",
  "version": "0.1.0",
  "dependencies": {
    "@testing-library/jest-dom": "^4.2.4",
    "@testing-library/react": "^9.4.1",
    "@testing-library/user-event": "^7.2.1",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-scripts": "4.0.3"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version"
    ]
  }
}

Visual Studio Code? – Other text editors or IDE:s?

Although I am using Visual Studio Code, I invite answers (and discussions) of other text editors and IDE:s as well. Note that – in addition to installing ESLint correctly via npm – you also have to install a plugin/extension for your specific integrated development environment (IDE).
In my case, I use this VS Code ESLint extension. 5

Still, the focus here should clearly be on the npm command and on the Node.js packages installed.

Previous reports of the error

In references 5-12 of the list below, I link some previous reports of this error – or similar errors.
Some of those links (questions) are clearly related to the issue here, but maybe not all of them.

References


1 The word import could be const – or just about any other JavaScript keyword.

2 Since it is recommended to install ESLint locally, I assume all readers here do so.

3 In my case Google Chrome Version 98.0.4758.102, 64-bit. Running on Windows 10.

4 If you are on Microsoft Windows (like myself), use backward slashes instead of forward slashes, like so:
node_modules\.bin\eslint . --ext .js

5 Apart from installing the extension, I have added "eslint.nodePath": "C:\\Program Files\\nodejs", to my (user) settings.json file in VS Code. No other changes.

1

1 Answers

0
votes

0. Prerequisites

If the server is running, close it by hitting Ctrl+C.

I strongly recommend uninstalling any global installations of ESLint.
To see what global packages are installed, in the command line run: 1

npm list --global --depth 0

If ESLint is globally installed, uninstall by running:

npm uninstall eslint --global

To correctly install ESLint into your local project, I recommend performing the following two steps.

  1. Locally install ESLint.

  2. Create a functioning .eslintrc.json file.

As it turns out, you will also need to do a third step.

  1. Update all npm packages to their latest versions.

1. Locally install ESLint

To locally install ESLint, run: 2

npm install eslint --save-dev

This will add

  ,
  "devDependencies": {
    "eslint": "^7.32.0"
  }

at the end of package.json.

2. Create a .eslintrc.json file that works

NOTE! Before moving on, do yourself a favor by saving a copy of your current .eslintrc.json file, as the next command will destroy (recreate) that file.

To create a new .eslintrc.json file, run:

npm init @eslint/config

You will be asked a number of questions, to which I answer by pressing Enter to choose the default, except for the format which I choose to be JSON (instead of JavaScript).

Configuring ESLint

In addition to creating the .eslintrc.json file, this will also add the "eslint-plugin-react": "^7.29.2" attribute under devDependencies to the package.json file. 3

The command npm init @eslint/config destroys the existing .eslintrc.json file, so you will have to manually add back any "rules" or other JSON settings that you want to keep.
In this case, I add back the rules that were in the original .eslintrc.json.
The result is as below.

.eslintrc.json :

{
  "env": {
    "browser": true,
    "es2021": true
  },
  "extends": [
    "eslint:recommended",
    "plugin:react/recommended"
  ],
  "parserOptions": {
    "ecmaFeatures": {
      "jsx": true
    },
    "ecmaVersion": "latest",
    "sourceType": "module"
  },
  "plugins": [
    "react"
  ],
  "rules": {
    "no-unused-vars": [
      "warn",
      {
        "argsIgnorePattern": "^_",
        "varsIgnorePattern": "^_"
      }
    ]
  }
}

Now when I open VS Code, instead of an error there are two warnings, which is exactly the desired outcome.

VS Code now displaying two warnings but no errors

Great! But wait – unfortunately there turns out to be a fly in the ointment. The problem is that, when I now run npm start to open the project in the web browser and hit F12, two errors show up in the console.
The error messages are:

  • Uncaught ReferenceError: process is not defined, and
  • Line 0: Parsing error: ImportDeclaration should appear when the mode is ES6 and in the module context.

Luckily, I have already posted a solution to this problem, namely:
Update all npm packages to their latest versions.
The section below is a bit succinct, so if you want more flesh on the bones, go visit that other answer.

Update all npm packages to their latest versions

Consider updating all npm packages to their latest versions.
The purpose is to decrease the risk of getting version conflicts.
The advice to update all packages has also been put forth in this answer.

A. Globally install npm-check-updates

In the command line, run:

npm install --global npm-check-updates

B. Update package.json to contain the latest versions

The following command will write the latest package version numbers to your package.json:

npm-check-updates --upgrade

Here is what it looks like in Windows 10:

Upgrading package.json

C. Install the latest versions

In the command line, run:

npm install

D. Check for errors in the browser and/or in the terminal

In the command line, run:

npm start

Both the browser and the terminal now displays five errors.

Discomforting, eh?

Yes definitely! – But don't give up hope! Just close the server (Ctrl+C) and try it over and over again.
Yesterday when I got these errors, all I needed to do was to run npm start one more time.
Today I tried runningnpm start 4-5 more times, but still got the errors.
So I tried npm install && npm start twice, and finally it ran without errors.
Not sure what is going on. Maybe some time has to pass before it works?

Finally there are no errors in the browser.

NO errors in the web browser!

And the terminal says Compiled successfully!

The terminal says: 'Compiled successfully!'

Yay! 4

Conclusion

Following the steps above helped me remedy the error in the question title:
Parsing error: The keyword 'import' is reserved.

For a project with settings even slightly different,5 just copy-pasting from the .eslintrc.json file above is unlikely to work.
Running npm init @eslint/config and upgrading all packages is more likely to be successful.

A note about deleting package-lock.json and node_modules

I wholeheartedly embrace a frequent use of the npm install command. As soon as there is a change to package.json or any other configuration file – such as .eslintrc.json – the npm install command should immediately be run.

By contrast, I have never ever seen anything gained by deleting the package-lock.json file and/or the node_modules directory. 6

So my recommendation is: don't delete any file or directory, just run npm install.

References


1 I am on Windows 10, but I expect all the commands provided here to work just as fine on both Linux and macOS.

2 A. Expect this command to take about 5-10 minutes to complete.
B. As long as your source code is not transformed by Babel, there is no reason to install @babel/eslint-parser. Just normal eslint should be enough. See When should I use @babel/eslint-parser?
If you are using TypeScript, then you will need @babel/eslint-parser.
The command to install is:
npm install eslint @babel/core @babel/eslint-parser --save-dev
The npm init @eslint/config configuration command should be used in the same way as for the normal (non-@babel) ESLint.

3 The "eslint-plugin-react" attribute in package.json does not seem to be of much relevance though.

4 The two warnings still show up in the text editor – just as they should.

5 For example, you might be using Angular or Vue instead of React.

6 Every time you delete node_modules, you will pay a penalty cost of 5-10 minutes of your precious time.