How to Add Linting and Formatting for your React App
Tags: javascript, programming, react
Published: 2023-05-19 16:49:44

_**_To read more articles like this, [visit my blog](https://www.mdfaisal.com/blog)
_**_



Programming is a work of art. But not everybody can appreciate your piece of work when it comes to coding. Because the coding style varies from person to person a lot. So your artwork may be actually garbage to another person :P

It becomes a huge problem when we work on a team project. Where each member tries to overwrite other people's code. So establishing a coding standard is a must in these scenarios.

There are some libraries that can make our life very easy. They are…

* **Linters** are static checkers of your code. It can find common errors while writing code.

* **Formatters** can format your code in a certain way so that it becomes understandable to everybody else

Today we will learn how to use these 2 libraries.

### [ESLint](https://eslint.org/docs/user-guide/getting-started)

ESLint is a tool for identifying and reporting on patterns found in ECMAScript/JavaScript code, with the goal of making code more consistent and avoiding bugs (from the docs)

### [Prettier](https://prettier.io/docs/en/index.html)

It is an opinionated code formatter. We can customize it to meet our needs.

### Step 1. Install

First, we need to install ESLint and Prettier. We will save these as dev dependencies because we don’t need them in production.

If your application is scaffolded with create-react-app you don’t need to install `eslint` separately. It already comes with that.

```js
npm install --save-dev eslint prettier
```

ESLint and prettier can have some overlapping rules. So we need to make sure that they work together. We need 2 more package

```js
npm install --save-dev eslint-config-prettier eslint-plugin-prettier
```

We will install two more additional dependencies to work with react. They contain `React` specific style guidelines.

```js
npm install --save-dev eslint-plugin-react eslint-plugin-react-hooks
```

### Step 2. Configure ESLint

Now add a file named `.eslintrc.js` inside your project's root folder. It will work as a configuration file for ESLint. The content of the file may vary according to your need. Here is a sample example configuration that I work with.

```js
module.exports = {
  root: true, 
  parserOptions: {
    ecmaVersion: 2020, 
    sourceType: 'module', 
    ecmaFeatures: {
      jsx: true 
    }
  },
  settings: {
    react: {
      version: 'detect'
    }
  },
  env: {
    jest: true,
    browser: true, 
    amd: true, 
    node: true 
  },
  extends: [
    'eslint:recommended',
    'plugin:react/recommended',
    'plugin:prettier/recommended' // Make this the last element so prettier config overrides other formatting rules
  ],
  rules: {
    'no-unused-vars': ['error', { vars: 'all', args: 'after-used', ignoreRestSiblings: false }],
    'prettier/prettier': ['error', {}, { usePrettierrc: true }] 
  }
}
```

You can also add a `.eslintignore` file. It’s like `.gitignore` because We don’t want to format our build files or node_modules. The contents of the `.eslintignore` are almost the same as `.gitignore`.

### Step 3. Configure Prettier

```js
npm install --save-dev prettier
```

Add a .prettierrc file in the root of your project. It will hold the rules needed for prettier to work. The contents may vary according to your need. You may get more options [here](https://prettier.io/docs/en/options.html).

```js
{
  "arrowParens": "always",
  "bracketSpacing": true,
  "embeddedLanguageFormatting": "auto",
  "htmlWhitespaceSensitivity": "css",
  "insertPragma": false,
  "jsxBracketSameLine": false,
  "jsxSingleQuote": true,
  "proseWrap": "preserve",
  "quoteProps": "as-needed",
  "requirePragma": false,
  "semi": false,
  "singleQuote": true,
  "trailingComma": "none",
  "useTabs": false,
  "vueIndentScriptAndStyle": false,
  "printWidth": 140,
  "tabWidth": 2,
  "rangeStart": 0
}
```

Similarly, we can add a .prettierignore file to ignore the files that we don’t want to format.

### Step 4. Add to Script

Now we will add two more scripts to our package.json file

```js
"scripts": {
  "lint": "eslint  --fix src/**/*.js",
  "format": "prettier src/**/*.js --write. --config ./.prettierrc"
}
```

Now we can run the following command to Lint and fix errors

```js
npm run lint
```

Or to format a project run the following

```js
npm run format
```

Now your project is ready for a consistent look. But wait! You can do some extra work to automate the process. Here is how …

### Step 5 (Optional). Run linter before every commit

As a developer you are lazy. You don’t want to run these commands every time you want to commit something. We can automate the process with the use of an additional library named husky

```js
npm install --save-dev husky -D
```

husky will help us to use pre-commit git-hook. So whenever we commit something it will run the linter and prettier automatically for us.

For that, we need to add the following configuration in our package.json file

```js
"husky": {
    "hooks": {
         "pre-commit": "npm run lint && npm run format"
    }
}
```

### Step 6. Run linter on only staged files

It is okay for small projects to run linter on the whole project on every commit. But as your project grows bigger you don’t want to wait for several minutes before each commit. For that, we will add another package to help us.

```js
npm install --save-dev lint-staged -D
```

Add the following configuration in your package.json file

```js
"lint-staged": {
  "*.+(js|jsx)": ["eslint --fix", "git add"],
  "*.+(json|css|md)": ["prettier --write", "git add"]
}
```

Now only the staged files of your project will be affected by the pre-commit hook of git.

Your final package.json should look something like this

![package.json](https://cdn-images-1.medium.com/max/2720/1*hqN5HkF9cEGcAySpiXyVcg.png)

Okay so now you are ready to rock. Your project is now clean and properly formatted. Also, you are forcing everyone to run a linter before they push something.

We focused only on the react-to stuff in this article but the process is the same for any kind of nodejs/javascript project.

That’s it for today. Happy Coding! :D

**Get in touch with me via [LinkedIn](https://www.linkedin.com/in/56faisal/) or my [Personal Website](https://www.mdfaisal.com/).**