ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ESLint와 Prettier 설정하기
    Tool/VSCode&Cursor 2023. 11. 17. 17:40

     

    1. ESLint 설치 및 사용방법

    1.1. ESLint 설치

    $ yarn add -D \
      eslint \
      @typescript-eslint/eslint-plugin \
      @typescript-eslint/parser \
      eslint-config-airbnb \
      eslint-plugin-import \
      eslint-plugin-jsx-a11y \
      eslint-plugin-react \
      eslint-plugin-react-hooks \
      eslint-plugin-sort-keys-fix \
      eslint-plugin-storybook

     

    1.2. configuration file 생성

    $ yarn create @eslint/config

     

    bash를 실행하면 아래와 같이 각자의 환경에 대한 선택하는 부분이 나온다.

     

    1.3. .eslintrc.js 파일 수정

    설치 기본

    # .eslintrc.js
    
    module.exports = {
        "env": {
            "browser": true,
            "es2021": true
        },
        "extends": [
            "eslint:recommended",
            "plugin:@typescript-eslint/recommended",
            "plugin:react/recommended"
        ],
        "overrides": [
            {
                "env": {
                    "node": true
                },
                "files": [
                    ".eslintrc.{js,cjs}"
                ],
                "parserOptions": {
                    "sourceType": "script"
                }
            }
        ],
        "parser": "@typescript-eslint/parser",
        "parserOptions": {
            "ecmaVersion": "latest",
            "sourceType": "module"
        },
        "plugins": [
            "@typescript-eslint",
            "react"
        ],
        "rules": {
        }
    }

     

    스토리북 적용

    module.exports = {
    	env: {
    		browser: true,
    		node: true
    	},
    	extends: [ 'airbnb', 'airbnb/hooks', 'eslint:recommended', 'plugin:react/recommended', 'plugin:import/recommended', 'plugin:storybook/recommended' ],
    	ignorePatterns: [ '.storybook', '*.d.ts', 'node_modules', 'build', 'dist', '**/env/*.js' ],
    	overrides: [
    		{
    			files: [ '*.ts', '*.tsx' ],
    			rules: { 'no-undef': 'off' }
    		}
    	],
    	parser: '@typescript-eslint/parser',
    	parserOptions: { warnOnUnsupportedTypeScriptVersion: false },
    	plugins: [ '@typescript-eslint', 'sort-keys-fix', 'prettier' ],
    	rules: {
    		'@typescript-eslint/ban-ts-comment': [
    			'error',
    			{ 'ts-ignore': 'allow-with-description' }
    		],
    		'@typescript-eslint/no-explicit-any': 'warn',
    		'@typescript-eslint/no-unused-vars': 'error',
    		'array-bracket-spacing': [
    			'error',
    			'always',
    			{
    				arraysInArrays: false,
    				objectsInArrays: false
    			}
    		],
    		'brace-style': [ 'error', 'allman' ],
    		'comma-dangle': [ 'error', 'never' ],
    		'eol-last': [ 'error', 'never' ],
    		'import/extensions': 'off',
    		'import/named': 'off',
    		'import/no-anonymous-default-export': 'off',
    		'import/no-cycle': 'off',
    		'import/no-extraneous-dependencies': 'off',
    		'import/no-named-as-default': 'off',
    		'import/no-unresolved': 'off',
    		'import/order': [
    			'error',
    			{
    				alphabetize: {
    					caseInsensitive: true,
    					order: 'asc'
    				},
    				groups: [ 'external', 'builtin', 'internal', 'sibling', 'parent', 'index' ],
    				'newlines-between': 'always'
    			}
    		],
    		indent: [ 'error', 'tab' ],
    		'jsx-a11y/control-has-associated-label': 'off',
    		'jsx-quotes': [ 'error', 'prefer-single' ],
    		'linebreak-style': 'off',
    		'max-len': 'off',
    		'no-restricted-exports': 'off',
    		'no-tabs': [ 'error', { allowIndentationTabs: true }],
    		'no-unused-vars': 'off',
    		'object-curly-newline': [ 'error', {
    			ExportDeclaration: 'never',
    			ImportDeclaration: 'never',
    			ObjectExpression: {
    				minProperties: 3,
    				multiline: true
    			},
    			ObjectPattern: 'never'
    		}],
    		'react-hooks/exhaustive-deps': 'warn',
    		'react/button-has-type': 'off',
    		'react/destructuring-assignment': 'off',
    		'react/function-component-definition': 'off',
    		'react/jsx-curly-brace-presence': [
    			'error',
    			{
    				children: 'never',
    				props: 'never'
    			}
    		],
    		'react/jsx-filename-extension': 'off',
    		'react/jsx-indent': [ 'error', 'tab' ],
    		'react/jsx-props-no-spreading': 'off',
    		'react/jsx-sort-props': [
    			'error',
    			{
    				callbacksLast: true,
    				ignoreCase: true,
    				multiline: 'last',
    				noSortAlphabetically: false,
    				reservedFirst: false,
    				shorthandFirst: false,
    				shorthandLast: true
    			}
    		],
    		'react/prop-types': 'off',
    		'react/react-in-jsx-scope': 'off',
    		'react/require-default-props': 'off',
    		'require-jsdoc': 'off',
    		'sort-keys-fix/sort-keys-fix': 'error'
    	},
    	settings: {
    		'import/parsers': { '@typescript-eslint/parser': [ '.ts', '.tsx', '.js' ] },
    		react: { version: 'detect' }
    	}
    };

     

    2. Prettier 설치 및 설정

    2.1. Prettier 의존성 설치

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

     

    2.2. VSCode Extension 설치 (참조)

     

    2.3. ignore 설정을 통해서 prettier를 적용하지 않을 부분 설정

    # .prettierignore
    
    **/*.css
    **/*.scss

     

    2.4. 파일 저장시 자동 format 설정

    .vscode > settings.json에 옵션 추가

    {
      ...
      "editor.formatOnSave": true
      ...
    }

    .vscode/settings.json

     

     

    주의!

    yarn berry를 사용한다면 prettier설치해준 다음 아래 명령어를 실행시켜 주어야 한다. (참조)

    $ yarn dlx @yarnpkg/sdks vscode

    안하면 node-modules폴더가 없어서 Error: Cannot find module 'prettier' from 에러가 발생한다.

     

    'Tool > VSCode&Cursor' 카테고리의 다른 글

    Cursor 설치 및 설정  (1) 2024.11.01
    정규식으로 text 변환하기  (1) 2023.11.20
    VSCode에서 Python 개발환경 만들기  (0) 2023.08.11
    VSCode에서 rsc 코드 자동완성 설정  (0) 2023.04.28
    VSCode/FormatOnSave 설정  (0) 2022.10.19

    댓글

Designed by Tistory.