NextJs+eslint 에러 해결, Cannot find name "div", Replace ....와 Insert .., Cannot find module 에러, 에러 메시지 미리 보기(Error Lens 사용)

# 시작

넥스트로 프로젝트 환경을 세팅하면서 typescript와 eslint, prettier를 한꺼번에 적용해보려고 하니 리액트 프로젝트 세팅할 때 겪었던 것처럼 에러가 여럿 눈에 보였다. eslint의 rules를 변경하면서 걸린 시간이 5시간은 족히 넘을 것 같다. 여기서는 구글링해서 따라하다가 막혔던 세 문제를 해결하고 글로 남긴다.
Next + eslint + prettier + typescript 환경을 이용해보려는 사람들은 참고했으면 좋겠다.
아래 사진들을 보면 코드 위에 에러 메시지들이 바로 띄워져있는 것을 볼 수 있다. 다른 사람들은 이렇게 바로 에러가 보이지 않을 수도 있는데 vscode의 익스텐션중에서 "Error Lens"라는 익스텐션을 사용하고 있다는 점을 참고하길 바란다.

# 1

Cannot find name "div" 에러

Nextjs로 프로젝트를 구성하고 나서 eslint와 prettier를 적용하려는 사람들 중에 아래와 같은 문제가 나타난 사람들이 있을 것이다.
notion image
리액트였다면 더 빨리 해결했을 것 같은데 뭔가 다른 설정을 건드려야되나 해서 더 오래 헤맸던 것 같다. 생각해보니 return문 내에서 jsx문법을 사용하고 있는데 옆의 파일을 보면 page2.ts라고 되어있다. 이것을 파일의 확장자를 "tsx"로 변경하면 해결된다.
아래는 참고한 사이트다.
stackoverflow.com/questions/51158080/typescript-cannot-find-name-errors-in-react-components

# 2

Replace `....`와 Insert `..` 에러

notion image
eslint를 적용하자마자 파일에서 에러들이 엄청 보인다.
이 에러는 prettier의 들여쓰기 제한과 eslint의 들여쓰기 제한이 서로 맞지 않아서 일어나는 문제였다. eslint의 configuration file(나는 .eslintrc.json 파일로 쓰고 있다.)에 rules에서 어떤 속성을 꺼주어야 된다는 것을 알 수 있었다.
{
  "root": true,
 "env": {
    "browser": true,
    "commonjs": true,
    "es6": true,
    "node": true
  },
  "parser": "@typescript-eslint/parser",
  "plugins": [
    "react",
    "react-hooks",
    "@typescript-eslint",
    "prettier"
  ],
  "extends": [
    "plugin:react/recommended",
    "plugin:@typescript-eslint/recommended",
    "prettier/@typescript-eslint",
    "plugin:prettier/recommended"
  ],
  "parserOptions": {
    "project": "./tsconfig.json",
    "sourceType": "module",
    "ecmaVersion": 2018,
    "ecmaFeatures": {
      "jsx": true
    }
  },
  "settings": {
    "react": {
      "version": "detect"
    }
  },
  "rules": {
    "react-hooks/rules-of-hooks": "error",
    "react-hooks/exhaustive-deps": "warn",
    "import/no-unresolved": 0,
    "react/jsx-filename-extension": [
      2,
      { "extensions": [".js", ".jsx", ".ts", ".tsx"] }
    ],
    "react/jsx-indent": [2, "tab"],
    "react/jsx-indent-props": [2, "tab"],
    "@typescript-eslint/no-inferrable-types": "off",
    "@typescript-eslint/interface-name-prefix": "off",
    "@typescript-eslint/explicit-function-return-type": "off",
    "indent" : ["none",0],
    "no-underscore-dangle": 0
  },
  "overrides": [
    {
      "files": ["**/*.tsx"],
      "rules": {
        "react/prop-types": "off"
      }
    }
  ]
}
위 코드처럼 rules : { ... }안에
    "indent" : ["none",0],
를 넣어주자. 깔끔하게 해결되었다.

# 3

Cannot find module 에러

Next에서는 상대경로가 불가능하다. 공식 문서를 보면 알 수 있는데 나는 넥스트를 다른 블로그에서 따라하다보니 file-loader를 통해 웹팩 설정으로 상대경로를 사용할 수 있었다. eslint를 적용하고 나니 여기서 에러가 발생했다.
notion image
이것은 임시방편일지도 모르겠다. 쓰던 file-loader를 쓰는 게 아니라 공식문서에 맞춰 Url path를 사용하면 eslint 에러를 없앨 수 있다.(더 좋은 방식이 있으면 댓글 부탁드립니다.) 해결한 방식은 아래와 같다. 임포트문은 없고 src에 바로 "/file.png"로 지정해주었다.
notion image