-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[FEAT] eslint을 커스텀해서 팀 코드 컨벤션 적용 #441
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
와우,,,,꼼꼼한 커스텀 lint rule 설정 덕분에, 저희가 직접 정한 컨벤션을 놓치지 않고 반영할 수 있겠는데요??? 감사합니다 ㅎㅎㅎ 엄청 고생했어요 포메!!!!! 코드 리뷰할 때도 불필요한 리뷰가 많이 줄어들 것 같아서 좋네요~!
커스텀 린트룰은 이론적으로만 보고 실제 도입해보지 못했던 부분인데, 저희가 정한 팀 컨벤션 기반으로 코드를 보니 좀더 이해가 잘 되는 것 같아용
약간 생소한 부분이고, 패키지 수정이 많아서 질문을 좀 남겼는데 확인 부탁드려용
@@ -11,7 +11,7 @@ | |||
"allowSyntheticDefaultImports": true, // default export 가 없어도 import 허용 | |||
"sourceMap": true, // 디버깅 시 어떤 파일에서 에러났는지 추적 용이 | |||
"resolveJsonModule": true, // JSON 파일 resolve | |||
"types": ["jest", "@emotion/react/types/css-prop"], | |||
"types": ["jest", "@emotion/react/types/css-prop", "node"], |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💭 질문 💭
node를 추가하면 어떤 다른 기능을 하나요??
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
process와 같은 전역객체를 인식하기 위해 @types/node를 추가했고 이걸 ts에 적용하려면 node를 ts 설정 파일에 추가해줘야하더라고요!
}, | ||
}, | ||
globals: { | ||
...globals.browser, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💭 질문 💭
globals가 여기서만 사용되는데, 이걸 추가하지 않으면 어떻게 동작하나요?? 라이브러리가 추가돼서 궁금했습니다!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
전역 객체를 정의할 때 사용되는 라이브러리입니다! 위 설정을 브라우저에서 사용되는 전역 객체들이 추가되어 eslint에서 인식 시켜줍니다
ReadableStream: { value: ReadableStream }, | ||
TransformStream: { value: TransformStream }, | ||
}); | ||
if (!globalThis.TextDecoder) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💭 질문 💭
오호 이렇게 분기처리를 안하면 어떤 문제가 생기나요?? 어떤 점이 다른걸까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저게 없으면 테스트 코드에서 에러가 발생하더라고요!
"eslint": "^9.16.0", | ||
"eslint-plugin-import": "^2.31.0", | ||
"eslint-plugin-jsx-a11y": "^6.10.2", | ||
"eslint-plugin-prettier": "^5.2.1", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
둘 다 설정해준다는 게 혹시 어떤 의미일까요???
질문은 기존에 eslint-config-prettier 만으로 lint가 잘 동작한다고 생각했는데, 수정한 이유가 궁금했습니다!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
추가로 컨트롤 + s 로 저장했을 때 자동으로 포맷팅되는지 궁금하고, 그때의 vscode default formatter 설정이 궁금합니다!
@@ -0,0 +1,22 @@ | |||
import { createContext, RefObject } from 'react'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🙏 제안 🙏
오호 같이 두면 fast refresh 경고가 뜨는군요! ModalContext랑 ToastContext는 providers와 형제 폴더로 contexts 폴더에 분리하는 건 어떤가요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
분리했습니다!
frontend/package.json
Outdated
@@ -40,6 +40,9 @@ | |||
"@chromatic-com/storybook": "^1.6.1", | |||
"@emotion/babel-plugin": "^11.12.0", | |||
"@emotion/babel-preset-css-prop": "^11.11.0", | |||
"@eslint/compat": "^1.2.4", | |||
"@eslint/eslintrc": "^3.2.0", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💭 질문 💭
compat과 eslintrc는 import되서 사용되고 있지는 않은데, 내부 동작에 필요한 라이브러리 인건가요??
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
레거시 설정 파일과의 호환을 위해 필요한 패키지들인 것 같은데 저희 프로젝트 설정에는 필요 없는 것들이네요.
불필요한 패키지들 제거하였습니다!
importPlugin.flatConfigs.recommended, | ||
react.configs.flat.recommended, | ||
jsxA11y.flatConfigs.recommended, | ||
...pluginQuery.configs['flat/recommended'], |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tseslint.config 함수를 통해 동작합니다!
typescript-eslint 패키지가 기본적으로 위 방식을 권장하더라고요
@@ -0,0 +1,37 @@ | |||
const enforceIsBoolean = require('./enforce-is-boolean'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🌸 칭찬 🌸
와우 이렇게 디테일하게 eslint rule을 지정할 수 있군요 대박,,,,너무 좋네요,,,,,
@@ -0,0 +1,37 @@ | |||
const enforceIsBoolean = require('./enforce-is-boolean'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🙏 제안 🙏
이건 간단한 제안인데 해당 파일이 대표 파일 느낌인 것 같아서 파일명을 index.js 로 설정해도 괜찮을 것 같네용
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
폴더명과 파일명이 일치하니까 그게 좋을 것 같네요 수정했습니다!
@@ -0,0 +1,42 @@ | |||
const path = require('path'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🌸 칭찬 🌸
오옹 이런 방식으로 eslint rule 들이 만들어지는군요,,,한번 공부해봐야겠네용
머지되면 콘솔 찍어보면서 입력으로 들어오는 값들을 이해해보겠숨돠
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코멘트 반영 감사합니다 포메~! PropsWithChildren 관련해서만 코멘트 하나 남겼는데 확인해주시면 좋을 것 같고, approve 할게용
Issue Number
#429
As-Is
팀 컨벤션으로 지켜왔던 코드 규칙들 중 eslint로는 검사가 되지 않는 부분들이 존재
To-Be
추가된 eslint 커스텀 규칙
is
keyword로 시작하는 경우에는 타입이boolean
이여야 한다. 함수의 경우는boolean
을 반환pages
폴더 안에는Page
로 끝나는 폴더와 해당 폴더명과 일치하는tsx
파일이 있어야 한다.components
폴더 안에는 컴포넌트 폴더와 해당 폴더명과 일치하는tsx
파일이 있어야 한다.interface
로 나타내며 이름은컴포넌트 명 + props
이다.화살표 함수
을 "권장"한다.화살표 함수
는선언형 함수
와 기능이 다소 다르게 동작하기 때문에선언형 함수
를 사용하는 경우도 생길 수 있다고 판단하여에러
가 아닌권장
으로 설정하였다.추가된 내용
Provider 파일 Context와 Component 분리
한 파일에서 Context와 Component를 동시에 내보내면
fast refresh
가 동작하지 않아eslint 규칙에서
react-refresh/only-export-components
에러가 발생한다.그래서 둘을 각각의 파일로 분리하였음
Check List
Test Screenshot
(Optional) Additional Description
package.json에 있는 eslint plugin들이 업데이트가 되면서 package.lock-json에 변경이 일어나면서 file-changed가 많이 생긴 것 같습니다.
Reference 🔎
공식문서에 있는 eslint 커스텀 설정 예제가
flat configuation
를 기준으로 되어 있어 이에 맞게 설정을 변경eslint 8.21부터는
flat configuation
이라는 방식이 도입되었고 eslint 9부터는 설정 파일의 이름은 기본적으로eslint.config.js
를 사용한다.eslint-react-hook rule 넣는 방법
facebook/react#28313
https://typescript-eslint.io/packages/typescript-eslint#config
https://eslint.org/docs/latest/use/migrate-to-9.0.0
추가로 현재 우리가 사용중인 버전은 더이상 지원되지 않는 버전임
eslint-config-prettier
eslint-plugin-prettier만으로도 설정이 가능하다.
eslint-config-prettier
가 없어도 됨https://github.com/prettier/eslint-plugin-prettier
AST란 무엇일까?
https://gyujincho.github.io/2018-06-19/AST-for-JS-devlopers
typescript-eslint에서 rule을 custom하는 방법
https://medium.com/@uriser/how-to-write-a-custom-typescript-eslint-rule-4cc3489f9815
🌸 Storybook 배포 주소
🌸 Storybook 배포 주소