2024-03-30.md
๐กDIL: ๋ชจ๋ ๋ฆฌ์กํธ ๋ฅ ๋ค์ด๋ธ, 4์ฃผ์ฐจ-6
์คํฐ๋: ์๊ฐ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์ค๋ ์งํ: ๊ฐ์ธ๊ณต๋ถ
DIL-week4-6_2024-03-30
| DIL ์ฃผ์ฐจ | ๋ฒ์ | ๋ด์ฉ | ์ค๋์ฐจ ์ง๋ | | -------- | ------ | ------------------------------- | ----------- | | 4์ฃผ์ฐจ | 4, 8์ฅ | SSR๊ณผ ESlint, ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | 469p~495p |
์ค๋ ์ฝ์ ๋ด์ฉ์ markdown์ผ๋ก ๊ฐ๋จํ ๋ฉ๋ชจ
์ฝ์ ์๊ฐ: 7์๋ฐ~10์๋ฐ
์ข์ ๋ฆฌ์กํธ ์ฝ๋ ์์ฑ์ ์ํ ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ
ESLint๋ฅผ ํ์ฉํ ์ ์ ์ฝ๋ ๋ถ์
- ์ ์ ์ฝ๋ ๋ถ์
- ์ฝ๋ ์ค๋ฉ(์ ์ฌ์ ์ผ๋ก ๋ฒ๊ทธ๋ฅผ ์ผ๊ธฐํ ์ ์๋ ์ฝ๋)
ESLint
- ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ฌธ์์ด๋ก ์ฝ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ถ์ํ ์ ์๋ ํ์(parser)๋ก ์ฝ๋๋ฅผ ๊ตฌ์กฐํํ๋ค.
- 2๋ฒ์์ ๊ตฌ์กฐํํ ํธ๋ฆฌ๋ฅผ AST(Abstract Syntax Tree) => ๊ท์น๊ณผ ๋์กฐ
- ๊ท์น๊ณผ ๋์กฐ: report, fix
| ๊ตฌ๋ถ | ๋ด์ฉ | | ------- | ---------------------------- | | rules | ์๋ชป๋ ์ฝ๋ + ๋ง๋ ์ฝ๋ ์ ์ | | plugins | ํน์ ํ rules์ ๋ชจ์ |
espree
- ํ์: ๊ตฌ๋ฌธ ๋ถ์๊ธฐ
- ํ์ ํด๋ณด๊ธฐ: https://astexplorer.net/
- espree: https://github.com/eslint/espree
- ts => @typescript-eslint/typescript-estree, espree ๊ธฐ๋ฐ ํ์
eslint-plugin, eslint-config
๋ค์ด๋ฐ: (1)์ ํด์ง ์ ๋์ฌ๋ก ์์ (2)ํ ๋จ์ด๋ก ๊ตฌ์ฑ (3)ํน์ ์ค์ฝํ๊ฐ ์์ ๋ถ๋ ๊ฒ ๊ฐ๋ฅ
eslint-plugin
- ํน์ ํ๋ ์์ํฌ๋ ๋๋ฉ์ธ์ ๊ด๋ จ๋ ๊ท์น์ ๋ฌถ๋๋ค
- ๊ท์น(rule)์ ๋ชจ์๋์ ํจํค์ง, ex) eslint-plugin-import, eslint-plugin-react
eslint-config
- eslint-plugin์ ๋ฌถ์ด์ ํ ์ธํธ๋ก ์ ๊ณตํ๋ค
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ๋ด์ฉ | ์ฃผ์ | | --------------------------- | ---------------- | ---------------------------------------------------------------------------------------- | | eslint-config-airbnb | ์์ด๋น์ค๋น, ์ ๋ช | https://github.com/airbnb/javascript | | @titicaca/triple-config-kit | ํ๊ตญ ์ปค๋ฎค๋ํฐ | https://github.com/titicacadev/triple-config-kit | | @eslint-config-next | Next.js | https://nextjs.org/docs/pages/building-your-application/configuring/eslint#eslint-plugin |
- eslint-config-next
- Next.js 11 ๋ฒ์ ๋ถํฐ ๋ง๋ฆ
- (1)js ์ฝ๋ ๋ฟ๋ง ์๋๋ผ, (2)ํ์ด์ง๋ ์ปดํฌ๋ํธ์์ ๋ฐํํ๋ JSX (3) **app, **document ์์ฑ๋์ด ์๋ HTML ์ฝ๋๋ ์ ์ ๋ถ์ ๋์
- ํต์ฌ ์น ์งํcore web vitals์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ๋ถ์
ESLint rule ๋ง๋ค๊ธฐ
- https://eslint.org/docs/latest/use/configure/rules#using-configuration-files
์์
- no-restricted-imports
- ์์:
import React from 'react';
- ๋ฆฌ์กํธ 17๋ถํฐ ์๋ก์ด JSX ๋ฐํ์ ๋๋ฌธ์ import React๊ฐ ํ์์๋ค
- bundle.js์ unused variable
- ์นํฉ์ด ํธ๋ฆฌ์์ดํน์ผ๋ก ์ฝ๋ ์ญ์ ํ๊ธฐ ๋๋ฌธ์ ๋ฒ๋ค ์ฌ์ด์ฆ๋ ์ํฅ ์์ง๋ง, ํธ๋ฆฌ ์์ดํน ์ค์ฌ์ ๋น๋ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ๊ฒ๋ ์ค์
"no-restricted-imports": [ 'error', { paths: [ { name: "react", importNames: ['default'], message: "~", } ] } ]
- ์์:
import {} from 'lodash'
{ name: "lodash", message: "lodash๋ CommonJS๋ก ์์ฑ๋์ด ์์ด ํธ๋ฆฌ ์์ดํน์ด ๋์ง ์์ ๋ฒ๋ค ์ฌ์ด์ฆ๋ฅผ ํฌ๊ฒ ํ๋ฏ๋ก lo-dash/* ํ์์ผ๋ก import ํด์ฃผ์ธ์", },
- ์์:
new Date() ๊ธ์ง
- server ์๊ฐ์ ์์กดํ๋ ๊ฒฝ์ฐ
- new Date() ๊ธ์ง, new Date(~~)๋ ํ์ฉ
- create๋ก ์๋ก์ด ๊ท์น์ ๋ง๋ ๋ค.
- RuleModule => node_modules/@types/eslint/index.d.ts
- server ์๊ฐ์ ์์กดํ๋ ๊ฒฝ์ฐ
- eslint-plugin ๋ง๋ค๊ธฐ
- yo, generate-eslint
- lib/rules/~~.js << eslint rules
- docs/~~.md << ์ฌ๊ธฐ ๋ฌธ์
- tests/lib/rules/~~.js << eslint tests
- yo, generate-eslint
AST, Abstract Syntax Tree ไธญ
| ๊ตฌ๋ถ | ๋ด์ฉ | | ---------------------------------------- | -------------------------------- | | type: ExpressionStatement | body๊ฐ ํํ์ ์ ์ฒด์ | | ExpressionStatement.expression | ํํ์์ ํ์ธํ Eslint ๋ ธ๋ ๋จ์ | | ExpressionStatement.expression.type | ํํ ํ์ | | ExpressionStatement.expression.callee | ์์ฑ์๋ช | | ExpressionStatement.expression.arguments | ์ธ์ |
eslint ์ปค์คํ rule ๊ด๋ จ ๋ ํผ๋ฐ์ค ๋งํฌ
- https://eslint.org/docs/latest/rules/no-restricted-imports
- https://typescript-eslint.io/developers/custom-rules/
- meta https://github.com/eslint/rfcs/blob/main/designs/2023-rule-options-defaults/README.md#support-for-metadefaultoptions-on-rules
์ฃผ์ํ ์
- Pettier ์ถฉ๋ | ์ ์ ๋ถ์ ๋๊ตฌ | ๋ชฉ์ | ์ธ์ด | | --- | --- | --- | | Prettier | ํฌ๋งคํ | HTML,CSS,markdown,json | | ESLint | ์ฝ๋ ์ค๋ฉ ์ฐพ๊ธฐ | JS |
- ํด๊ฒฐ๋ฒ
- ์ถฉ๋ ์ ๋๊ฒ ์ง๊ธฐ
- js๋ eslint์ ๋งก๊ธฐ๊ธฐ
- js์์ ํ์ํ rule์
eslint-plugin-prettier
๋ฅผ ์ฌ์ฉํ๋ค.
- ์์ธ ์ฒ๋ฆฌ
- // eslint-disable-line
- ๊ฐ๋ฐ์๊ฐ ๋ฌด์ํ๋ ๊ฒฝ์ฐ >> ํฌ๊ฑด ์๊ฑด ๋ฌธ์ ๊ฐ ์๊ธด๋ค
- ์ง์ง ํ์์๋ ๊ท์น์ด๋ผ๋ฉด 'off'ํด์ ์ ๊ฑฐํ ๊ฒ
- // eslint-disable-line
๋ฆฌ์กํธ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
| ๊ตฌ๋ถ | ํ ์คํธ | ๋ด์ฉ | ์ํ | | -------- | ---------- | ---------------------------------------------------------- | -------------------------------- | | backend | ํ์ดํธ๋ฐ์ค | ๊ต์ฐฉ ์ํ, ๊ฒฝ์ ์ํ, ๋ฐ์ดํฐ ์์ค, ํน์ ์ํฉ์์ ์ฅ์ ๋ฐ์ | AUI (Application User Interface) | | frontend | ๋ธ๋๋ฐ์ค | ์ฃผ์ ๋น์ฆ๋์ค ๋ก์ง, ๊ฒฝ์ฐ์ ์ | GUI |
React Testing Library
- ๋ฆฌ์กํธ ํ๊ฒฝ์์ ๋ฆฌ์กํธ ํ ํฌ๋ํธ๋ฅผ ํ ์คํ
- DOM Testing Library๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์๋ค
- jsdom: JS ํ๊ฒฝ์์ HTML๊ณผ DOM์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ