본격적인 프로젝트에 임하기 전에 협업에서 중요한 ESLint에 대해 알아보도록 하겠다! 그전에 우선 ESLint와 Prettier의 차이가 헷갈려서 간략하게 정리한 후 들어가 보겠다.
ESLint는 코드 퀄리티를 보장하도록 도와주고,
Prettier는 코드 스타일을 깔끔하게 또는 통일되도록 도와준다.
ESLint는 다양한 코드 작성법 중 일관성 있는 방식으로 구현할 수 있도록, 오류를 분석해 주는 도구이다. Prettier는 텍스트를 일관되게 작성하도록 도와주는 도구이다. 사실 둘 모두 큰 차이 없는 거 아냐?라고 생각했지만, 차이가 있다.
ESLint의 핵심은 코드 에러를 잡고 코드 문법을 강제하여 코드 품질 개선에 중점을 두었다는 것이다. 반면에 Prettier는 작은 따옴표를 사용할 것인지와 같은 코드가 예쁘게 보이는 것에 중점을 둔 도구이다. 즉, 코드의 에러를 잡아내지 못한다.
따라서 이번 프로젝트에서도 두 도구를 모두 사용하여 개발을 하기로 하였다. 그럼 본격적으로 ESLint 설정에 대해 알아보자.
ESLint Setting
사실 Vite로 하면 따로 설치 없이 ESLint가 기본 설정이 되어있다. 그래서 너무너무 편하다... 하지만 조금 더 엄격한 코드 관리를 위해 Airbnb를 선택하게 되었고, 이에 대한 방법을 적어보도록 하겠다.
프로젝트는 React와 TypeScript 기반이며 Vite에 의해 기본 세팅은 모두 되어있다.
"lint": "eslint './src/**/*.{ts,tsx,js,jsx}'",
"lint:fix": "eslint --fix './src/**/*.{ts,tsx,js,jsx}'"
한 가지 변경한 점이 있다면, package.json에 위와 같이 변경 및 추가를 해주었다.
이때 이 lint는 npm run lint 명령어로 터미널에서 해당 경로에 있는 모든 파일들의 에러를 확인할 수도 있다. lint:fix는 영어 뜻 그대로 어긋나는 게 생기면 고쳐 준다.
npm install -D eslint-config-airbnb
npm install -D eslint-config-airbnb-typescript
설치가 마무리되었다면, .eslintrc.cjs 파일에 아래와 같이 추가해 주자.
module.exports = {
root: true,
env: { browser: true, es2020: true },
extends: [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"plugin:@typescript-eslint/recommended-requiring-type-checking",
"plugin:react-hooks/recommended",
"airbnb", // 추가
"airbnb/hooks", // 추가
"airbnb-typescript", // 추가
],
...
};
이렇게 추가해 주었더니 다양한 에러(ESLint 설정 규칙과 Prettier가 맞지 않음)가 발생하였고 Prettier도 따로 설정해 주어 해결하였다.
👀 Tip
커밋하기 전에 ESLint를 확인하고 싶다면, VScode의 ESLint extention을 설치하면 코드를 작성하면서 바로바로 검사할 수 있다.
Prettier Setting
최상위 경로에서 .prettierrc 파일을 만든 다음 아래 코드를 붙여 넣었다.
{
"arrowParens": "always",
"bracketSpacing": true,
"jsxBracketSameLine": false,
"jsxSingleQuote": false,
"printWidth": 80,
"proseWrap": "always",
"quoteProps": "as-needed",
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"useTabs": false
}
하지만 import에 React를 추가하라는 에러는 사라지지 않았고, JSX 문법을 쓰는 만큼 명시해 주면 좋지만 React 17부터는 사용하지 않아도 될 뿐 아니라 빌드에도 실패되어 결국 생략하기로 결정하였다.
ESLint에서 'import React'문 잔소리 없애기
.eslintrc.cjs 파일에서 rules에 아래의 문장을 추가해 주었더니 해결되었다.
rules: {
...
"react/react-in-jsx-scope": "off", // 추가⭐️
},
끝으로 ESLint에 정의되어 있는 프로퍼티들을 간략히 정리해 보도록 하겠다.
module.exports = {
root: true,
env: { browser: true, es2020: true },
extends: [
...
],
parser: "@typescript-eslint/parser",
parserOptions: {
ecmaVersion: "latest",
sourceType: "module",
project: true,
tsconfigRootDir: __dirname,
},
plugins: ["react-refresh"],
rules: {
"react/react-in-jsx-scope": "off",
"react-refresh/only-export-components": [
"warn",
{ allowConstantExport: true },
],
"@typescript-eslint/no-non-null-assertion": "off",
},
ignorePatterns: [".eslintrc.cjs", "vite.config.ts"],
};
- root: true일 경우 해당 프로젝트를 기준으로 ESLint 파일을 찾는다. false이면 내 컴퓨터 전체 파일에서 찾는다.
- extends: eslint rule 설정이 저장되어 있는 외부 file을 extends 한다.
- parser: 각 코드 파일을 검사할 파서(구문 분석(parsing)을 할 프로그램)를 설정한다.
- plugins: 추가적인 규칙(rule)을 사용할 수 있도록 만들어주는 다양한 플러그인(plugin)이 제공되며, 새로운 규칙을 단순히 설정이 가능한 상태로 만들어주기만 한다.
- rules: 직접 lint rule을 적용한다. 커스터마이징 할 수 있다.
ignorePatterns
위 코드 가장 하단에서 발견할 수 있을 것이다. 수기로 작성된 부분인데 이를 추가한 이유는 import에서 parsing 에러가 발생하여 해당 프로퍼티를 추가하여 린트하고 싶지 않은 디렉토리를 설정해 주었더니 에러가 해결되었다.
📜 출처
- [ESLint, Airbnb세팅] ESLint Airbnb세팅을 알아보자!
- ESLint 사용 시 React import문 생략하기
-
ESLint, Prettier Setting, 헤매지 말고 정확히 알고 설정하자.