1. 프로젝트 생성

npx create-next-app project-name –typescript

2. eslint, prettier 라이브러리 설치(vscode extension 설치와 settings.json 설정은 필수)

npm i -D eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react eslint-plugin-react-hooks

npm i -D prettier eslint-config-prettier eslint-plugin-prettier

npm i -D babel-eslint eslint-plugin-babel

npm i -D @typescript-eslint/eslint-plugin @typescript-eslint/parser

3. eslint 설정 예시 (.eslintrc)

{
  "plugins": ["@typescript-eslint", "prettier"],
  "extends": [
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended", 
    "plugin:prettier/recommended"
  ],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaVersion": 2018,
    "sourceType": "module",
    "ecmaFeatures": {
      "jsx": true,
      "tsx": true
    }
  },
  "settings": {
    "react": {
      "version": "detect"
    }
  },
  "ignorePatterns": ["node_modules/", ".next/*"],
  "rules": {
    "react/react-in-jsx-scope": 0,
    "react/prefer-stateless-function": 0,
    "react/jsx-filename-extension": 0,
    "react/jsx-one-expression-per-line": 0,
    "no-nested-ternary": 0,
    "no-unused-vars": "off",
    "no-undef": "off",
    "/no-useless-escape": "off",
    "prettier/prettier": [
      "error",
      {
        "endOfLine": "auto",
        "useTabs": false
      }
    ],
    "indent": ["error", 2],
    "@typescript-eslint/no-empty-interface": "off",
    "no-empty-interface": "off"
  },
  "globals": {
    "React": "writable"
  },
  "overrides": [
    {
      "files": ["*.js", "*.jsx"],
      "rules": {
        "@typescript-eslint/explicit-function-return-type": "off",
        "@typescript-eslint/no-unused-vars": "off",
        "@typescript-eslint/no-empty-interface": "off"
      }
    }
  ]
}

3. prettier 설정 예시 (.prettierrc)

{
  "trailingComma": "es5",
  "tabWidth": 2,
  "semi": true,
  "singleQuote": true,
  "printWidth": 100,
  "eslintIntegration": true,
  "endOfLine": "auto",
  "parser": "typescript",
  "useTabs": false,
  "arrowParens": "always"
}

Leave a comment

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다