본문 바로가기
Next.js

[Next.js,TS] 특정폴더에만 Eslint 적용하기

by goodchuck 2024. 5. 30.

목차

     왜 특정 폴더에만 Eslint를 적용하나요?

    기존 만들어진 프로젝트에서 airbnb세팅 이랑 여러 커스텀 eslintrc를 넣었을때 바꿔야 할 부분이 너무 많아서 도중 build가 안되는 현상이 일어났다.

    그당시 .eslintrc.json

    전체 규칙을 적용한 모습

    {
      "extends": [
        "next/core-web-vitals",
        "airbnb",
        "airbnb/hooks",
        "plugin:@typescript-eslint/recommended",
        "plugin:prettier/recommended"
      ],
      "plugins": ["@typescript-eslint", "prettier"],
      "parser": "@typescript-eslint/parser",
      "parserOptions": {
        "ecmaVersion": 2020,
        "sourceType": "module",
        "ecmaFeatures": {
          "jsx": true
        },
        "project": "./tsconfig.json"
      },
      "rules": {
        "prettier/prettier": [
          "error",
          {
            "endOfLine": "auto",
            "singleQuote": true,
            "trailingComma": "all",
            "tabWidth": 2,
            "useTabs": false // 추가: 탭 대신 공백 사용
          }
        ],
    
        "react/react-in-jsx-scope": "off",
        "import/no-extraneous-dependencies": ["error", { "devDependencies": true }],
        "@typescript-eslint/explicit-module-boundary-types": "off",
        "react/jsx-filename-extension": [1, { "extensions": [".tsx", ".jsx"] }],
        "import/extensions": [
          "error",
          "ignorePackages",
          {
            "js": "never",
            "jsx": "never",
            "ts": "never",
            "tsx": "never"
          }
        ],
        "@typescript-eslint/no-explicit-any": "off"
      },
      "settings": {
        "react": {
          "version": "detect"
        },
        "import/resolver": {
          "node": {
            "extensions": [".js", ".jsx", ".ts", ".tsx"]
          },
          "typescript": {
            "alwaysTryTypes": true,
            "project": "./tsconfig.json"
          }
        }
      }
    }

     

     특정 폴더에서부터 eslint를 적용하길 원했다.

    기존 프로젝트에 그렇다고 eslint를 적용을안하자니 잘못된 버릇이 생길거같고 그렇게해서 생각난 방법이

    앞으로 개발하는 것들을 폴더단위로 조금씩 고쳐나가자였다.

     

    바뀐  .eslintrc.json

    {
      "plugins": ["@typescript-eslint", "prettier"],
      "parser": "@typescript-eslint/parser",
      "parserOptions": {
        "ecmaVersion": 2020,
        "sourceType": "module",
        "ecmaFeatures": {
          "jsx": true
        },
        "project": "./tsconfig.json"
      },
      "rules": {},
      "overrides": [
        
        {
          "files": [
            "src/components/**/*.{js,jsx,ts,tsx}",
            "src/containers/**/*.{js,jsx,ts,tsx}"
          ],
          "extends": [
            "next/core-web-vitals",
            "airbnb",
            "airbnb/hooks",
            "plugin:@typescript-eslint/recommended",
            "plugin:prettier/recommended"
          ],
          "rules": {
            "prettier/prettier": [
              "error",
              {
                "endOfLine": "auto",
                "singleQuote": true,
                "trailingComma": "all",
                "tabWidth": 2,
                "useTabs": false // 추가: 탭 대신 공백 사용
              }
            ],
    
            "react/react-in-jsx-scope": "off",
            "import/no-extraneous-dependencies": [
              "error",
              { "devDependencies": true }
            ],
            "@typescript-eslint/explicit-module-boundary-types": "off",
            "react/jsx-filename-extension": [1, { "extensions": [".tsx", ".jsx"] }],
            "import/extensions": [
              "error",
              "ignorePackages",
              {
                "js": "never",
                "jsx": "never",
                "ts": "never",
                "tsx": "never"
              }
            ],
            "@typescript-eslint/no-explicit-any": "off",
            "no-unused-vars": "warn",
            "import/prefer-default-export": "warn"
          }
        }
      ],
      "settings": {
        "react": {
          "version": "detect"
        },
        "import/resolver": {
          "node": {
            "extensions": [".js", ".jsx", ".ts", ".tsx"]
          },
          "typescript": {
            "alwaysTryTypes": true,
            "project": "./tsconfig.json"
          }
        }
      }
    }

     

    바뀐모습은 다음과같다.

    기존 코드에서의 "extends"와 "rules"가 전체 부분을 차지하기에 문제였으므로

    "overrides"항목을 추가해 적용할 폴더들을  "files"에 지정하고

    "extends"와 "rules"에 넣으면된다.

    files는 폴더 컨벤션 구조인 src/components와 src/containers에만 적용되게하였다.