Skip to content

About React, NPM, Eslint and Prettier installation for React developers

License

Notifications You must be signed in to change notification settings

nicolastrote/about-React-NPM-Eslint-Prettier

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 

Repository files navigation

about-React-NPM-Eslint-Prettier

About npm, React, Eslint and Prettier installation for React developers

Motivation

Create-react-app in npx@^7.4.0 used [email protected] which wasn't working with react. React was expected the version 7.2.0. Here I am testing the last version of create-react-app and display a proper path to update your dev environment.

Table of contents

NodeJS Install & Upgrade

For using react-create-app, latest LTS version of NodeJS is recommended by this project.

  • website: choose LTS from NodeJS
  • nvm : nvm install node --reinstall-packages-from=node
  • Brew : brew upgrade && brew upgrade node
  • Chocolatey : choco install nodejs-lts

Clean Up

Some packets could stay in your global and need to be delete for no conflicts. List all global packets :

npm list -g --depth 0

// My minimum of packages is :
C:\Users\x\AppData\Roaming\npm
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
└── [email protected]
```shell
and remove unwanted with:

```shell
npm remove -g [package]

NPM Upgrade

Upgrade of npm

npm install -g npm@latest

Validate that all global packages are update:

npm i -g npm-check && npm-check -g -y

npm --version reply 7.5.2

NPX Upgrade

Upgrade of npx

npm install -g npx --force

npx --version reply 7.5.2 (same as npm, we're good!)

Create-React-App

Now we can testing if create-react-app is working properly with typescript, eslint and prettier

npx create-react-app web-app --template typescript
  • first test:
cd web-app && yarn start

Eslint

Eslint installation:

yarn add -D @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-config-airbnb-typescript eslint-plugin-jest

Install of Airbnb config

npx install-peerdeps --dev eslint-config-airbnb

Prettier

Prettier installation:

yarn add -D prettier eslint-config-prettier eslint-plugin-prettier

Eslint Config File

Create .eslintrc.js file :

module.exports = {
  root: true,
  extends: [
    'airbnb-typescript',
    'airbnb/hooks',
    'plugin:@typescript-eslint/recommended',
    'plugin:jest/recommended',
    'plugin:prettier/recommended',
    'prettier',
    'prettier/@typescript-eslint',
    'prettier/react',
    "eslint:recommended",
    "plugin:@typescript-eslint/eslint-recommended",
  ],
  plugins: ['react', '@typescript-eslint', 'jest'],
  env: {
    browser: true,
    es6: true,
    jest: true,
  },
  globals: {
    Atomics: 'readonly',
    SharedArrayBuffer: 'readonly',
  },
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaFeatures: {
      jsx: true,
    },
    ecmaVersion: 2018,
    sourceType: 'module',
    project: './tsconfig.json',
  },
  rules: {
    'no-console': 'off',
    'no-explicit-any': 'off',
    'prettier/prettier': [
      'error',
      {
        endOfLine: 'auto',
      },
    ],
    'no-multiple-empty-lines': ['warn', { max: 1, maxEOF: 1 }],
    '@typescript-eslint/explicit-function-return-type': 'off',
    '@typescript-eslint/explicit-member-accessibility': 'off',
    '@typescript-eslint/interface-name-prefix': 'off',
    'import/prefer-default-export': 'off',
    'newline-before-return': ['warn'],
    indent: ['error', 2, { SwitchCase: 1 }],
    'no-multi-spaces': ['warn'],
    'max-len': [
      'warn',
      {
        code: 100,
        ignoreComments: true,
        ignoreTrailingComments: true,
        ignoreUrls: true,
        ignoreTemplateLiterals: true,
        ignoreRegExpLiterals: true,
      },
    ],
    'prefer-promise-reject-errors': ['off'],
    'no-return-assign': ['warn'],
    'no-dupe-keys': ['warn'],
    'no-useless-escape': ['warn'],
    yoda: ['warn'],
    'no-underscore-dangle': ['off'],
    'no-param-reassign': ['off'],
    'no-var': ['warn'],
    'no-unused-vars': ['warn'],
    'prefer-const': ['warn'],
    'no-plusplus': ['warn', { allowForLoopAfterthoughts: true }],
    'no-shadow': [
      2,
      {
        hoist: 'all',
        allow: ['resolve', 'reject', 'done', 'next', 'err', 'error'],
      },
    ],
    'no-buffer-constructor': ['warn'],
    'prefer-destructuring': ['warn'],
    'spaced-comment': ['warn'],
    strict: ['warn'],
    'import/newline-after-import': ['warn'],
    'import/order': [
      'warn',
      {
        groups: ['external', 'internal', 'parent', 'sibling', 'index', 'builtin'],
        'newlines-between': 'always',
      },
    ],
    'no-else-return': ['warn'],
    'consistent-return': ['warn'],
    'lines-around-directive': ['warn'],
    'prefer-template': ['warn'],
    'one-var': ['warn'],
    'no-useless-rename': ['warn'],
    'array-callback-return': ['warn'],
    'new-cap': ['warn'],
    'vars-on-top': ['warn'],
    'no-lonely-if': ['warn'],
    'no-useless-concat': ['warn'],
    'no-unused-expressions': ['warn'],
    'no-unneeded-ternary': ['warn'],
    radix: 0,
    'no-nested-ternary': ['warn'],
    camelcase: ['warn'],
    'import/no-extraneous-dependencies': ['off'],
    'import/no-dynamic-require': ['off'],
    'no-new-require': ['warn'],
    'operator-assignment': ['warn'],
    'global-require': ['warn'],
    'no-multi-assign': ['warn'],
    'no-restricted-syntax': ['warn'],
    'guard-for-in': ['warn'],
    'dot-notation': ['warn'],
    'no-unreachable': ['warn'],
    'newline-per-chained-call': ['warn', { ignoreChainWithDepth: 2 }],
    quotes: ['warn', 'single'],
    'padding-line-between-statements': [
      'warn',
      { blankLine: 'always', prev: '*', next: ['return', 'block-like'] },
      {
        blankLine: 'always',
        prev: 'block-like',
        next: '*',
      },
    ],
    'jsx-a11y/href-no-hash': 'off',
    'jsx-a11y/anchor-is-valid': [
      'warn',
      {
        aspects: ['invalidHref'],
      },
    ],
    'react/display-name': 1,
    'react/no-array-index-key': 0,
    'react/react-in-jsx-scope': 0,
    'react/prefer-stateless-function': 0,
    'react/prop-types': ['off'],
    'react/forbid-prop-types': 0,
    'react/no-unescaped-entities': 0,
    'jsx-a11y/accessible-emoji': 0,
    'react/require-default-props': 0,
    'react/jsx-filename-extension': [
      1,
      {
        extensions: ['.js', '.jsx', '.tsx'],
      },
    ],
    'react-hooks/rules-of-hooks': 'warn',
    'react-hooks/exhaustive-deps': 'off',
    'react/jsx-curly-spacing': 'warn',
    'object-curly-spacing': ['error', 'always'],
  },
};

nb: for more info read here

Eslint Ignore File

Create .eslintignore file :

# don't ever lint node_modules
node_modules
# don't lint build output (make sure it's set to your correct build folder name)
dist
# don't lint nyc coverage output
coverage
# don't lint .eslintrc.js
.eslintrc.js

Eslint & Prettier Scripts

Add scripts to your package.json file:

"scripts": {
  "format": "prettier --write src/**/*.ts{,x}",
  "lint": "tsc --noEmit && eslint src/**/*.ts{,x}"
}

VSCode configuration

In your json settings file:

{
  "files.associations": {
    "*.jsx": "javascriptreact"
  },
  "editor.insertSpaces": true,
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true, /* This allow fix for eslint + prettier */
    "source.fixAll": true,
    "source.organizeImports": false /* fix VSCode & Eslint conflict at save */
  },
  "json.format.enable": true,
  "files.autoSave": "onFocusChange",
  "editor.tabSize": 2,
  "editor.detectIndentation": false,
  "typescript.updateImportsOnFileMove.enabled": "always",
  "javascript.updateImportsOnFileMove.enabled": "always",
  "cSpell.userWords": [
    "browserslist",
    "choco",
    "linebreak",
    "peerdeps"
  ],
}

Test

Launch the web app

λ yarn start
yarn run v1.22.10
$ react-scripts start

There might be a problem with the project dependency tree.
It is likely not a bug in Create React App, but something you need to fix locally.

The react-scripts package provided by Create React App requires a dependency:

  "eslint": "^7.11.0"

Don't try to install it manually: your package manager does it automatically.
However, a different version of eslint was detected higher up in the tree:

  C:\Users\x\Workspace\boilerplate-react-typescript-hooks-context-app-2\node_modules\eslint (version: 7.2.0)

Resolving The Eslint Errors

The error pop, so we can use yarn-check to solve conflicts:

yarn add yarn-check -g && yarn-check -u
...
[yarn-check] Update complete!
[yarn-check] [email protected], [email protected], @types/[email protected], [email protected]
[yarn-check] You should re-run your tests to make sure everything works with the updates.

Error is gone ;-)

VSCode Does Not Display Eslint/Prettier Errors

NOTE: if eslint doesn't display errors in VSCode, try this to force the display: yarn eslint . --ext .js,.jsx,.ts,.tsx

HUSKY

Husky can prevent bad git commit, git push and more 🐶 woof!

NOTE: to get ride of warning: LF will be replaced by CRLF in

yarn add -D husky lint-staged
  • Add in your package.json some hooks and scripts :
"lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "yarn lint:fix",
      "yarn format"
    ]
  },
"husky": {
  "hooks": {
    "pre-commit": "lint-staged",
    "pre-push": "lint-staged && yarn run test-ci"
  }
},

SCSS

  • yarn add sass classnames

⚠ NOTE : yarn add node-sass will lead to bad issues at time: https://github.com/webpack-contrib/sass-loader/issues/898

  • Rename src/App.css to src/App.scss and update src/App.tsx to import src/App.scss
  • Rename src/index.css to src/index.scss and update src/Dashboard.tsx to import src/index.scss

How to Debug the Code

  • Install the plugin: Debugger for Chrome msjsdiag.debugger-for-chrome
  • In VSCode clic on the icon for debugging
  • Click on the link "create a launch.json file"
  • Select "Chome (Preview)"

It create a launch.json file under .vscode to parameter debugging:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "pwa-chrome",
            "request": "launch",
            "name": "Launch Chrome against localhost",
            "url": "http://localhost:3000/",
            "webRoot": "${workspaceFolder}"
        }
    ]
}
  • change url for http://localhost:3000/
  • go on the App.tsx file, for example, put a break point and launch debug with F5

About

About React, NPM, Eslint and Prettier installation for React developers

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published