๐Ÿ”ฎ Airbnb ์ˆ™์†Œ ํŽ˜์ด์ง€ ํด๋ก  ์ฝ”๋”ฉ: ESLint ์‚ฌ์šฉ๊ธฐ

hyeondoongeยท2021๋…„ 2์›” 18์ผ
0
post-thumbnail

ESLint ๋ผ๊ณ  ํ•˜๋Š” ๋„๊ตฌ๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ์ด๋‚˜ ํฌ๋งท ๋“ฑ์„ ์žก์•„์ค€๋‹ค.. ๋‚˜๋Š” airnbn ํด๋ก ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ์Šคํƒ€์ผ์€ airnbn ๊ฒƒ์„ ์ ์šฉํ–ˆ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ google, facebook๋„ ์žˆ์—ˆ๋˜ ๊ฑฐ ๊ฐ™๋‹ค.
ESlint์„ค์น˜ ํ›„ ๋‚ด๊ฐ€ ๋”ฐ๋ฅผ ์Šคํƒ€์ผ์˜ ์„ค์น˜๋„ ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ–ˆ๋‹ค. ex) eslint-config-airbnb

๋ชจ๋“  ์„ค์น˜์™€ ์„ค์ •์„ ๋๋‚ด๊ณ  ๋‹ค์‹œ ์‹คํ–‰์„ ํ•˜๊ฒŒ๋˜๋ฉด
์ด์ „์—” ์—†์—ˆ๋˜ ์˜ค๋ฅ˜๋“ค์ด ๋‹ค๋‹ค๋‹ค๊ฐ‡ใ„ฑ ๋‚˜ํƒ€๋‚œ๋‹ค..๋‘๋‘ฅ


์ด ๋ชจ๋“  ์˜ค๋ฅ˜๋“ค์ด eslint ์‹คํ–‰ ํ›„์— ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋“ค์ด๋‹ค.
์™€์šฐ,, ์‹คํ–‰ ์ด์ „์—๋Š” ๊น”๋”ํ–ˆ๋˜ ํ„ฐ๋ฏธ๋„์ด ์ด์   ์˜ค๋ฅ˜๋กœ ๊ฐ€๋“์ฐจ์กŒ๋‹ค,,,!
linkebreak-style, react-in-jsx-scope, react/prop-type ๋“ฑ๋“ฑ,, ์ •๋ง ์—„๊ฒฉํ•˜๊ตฌ๋‚˜,,,๐Ÿ˜ญ

์—๋Ÿฌ๋Ÿ‰์ด ๋„ˆ๋ฌด ๋งŽ๊ธฐ์— ๊ฐ€์žฅ ๋ˆˆ์— ๋งŽ์ด ๋›ฐ๋Š” ๊ฑธ ๋ฝ‘์•„์„œ ํ•ด๊ฒฐํ•ด๋ดค๋‹ค.
linkbreak-style: ์ค„์˜ ๋์„ CRLF๊ฐ€ ์•„๋‹ˆ๋ผ LF๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค๋Š” ์˜ค๋ฅ˜๋‹ค.
์ด ์˜ค๋ฅ˜๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํšŒํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒํ–ˆ๋‹ค.
.eslintrc.js ํŒŒ์ผ์—์„œ ๊ทœ์น™์„ ์ •ํ•˜๋Š” rules ์†์„ฑ์ด์žˆ๋‹ค. ๊ฑฐ๊ธฐ์—๋‹ค ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋ช…๊ณผ ์ฒ˜๋ฆฌ๋‹จ๊ณ„๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
๋‹จ๊ณ„๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๊ณ ๋‚˜๋‹ˆ linkbreak-style๊ณผ ๊ด€๋ จํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ชจ๋‘ ๋œจ์ง€์•Š๊ฒŒ ๋˜์—ˆ๋‹ค!

(๋‹จ๊ณ„์—๋Š” 0, 1, 2๊ฐ€ ์žˆ๋Š”๋ฐ 0์€ off๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ
์ด ๊ทœ์น™์„ ๋ฌด์‹œํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๊ณ  1์€ warn์œผ๋กœ ๊ฒฝ๊ณ ์ฐฝ๋งŒ ๋„์šฐ๋Š” ๊ฒƒ 2๋Š” error๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•˜๊ฒŒ ๋œ๋‹ค. )

quotes: ๊ฒฝ๊ณ ๊ธ€์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, "๋ง๊ณ  '๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๋ง์ด๋‹ค.
์ด๋ฏธ ๋‚ด ์ฝ”๋“œ๋Š” prettier์— ์˜ํ•ด " ๋กœ ์ •๋ณต๋˜์–ด์žˆ๋Š” ์ƒํƒœ์—ฌ์„œ ์ผ์ผ์ด ๊ณ ์น˜๊ธฐ์ง€๋Š” ๋ชปํ•˜๊ฒ ๋‹ค...ใ…Ž

arrow-body-style: ์• ๋กœ์šฐ ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ, return ํ‚ค์›Œ๋“œ ๋ฐ ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ๋ฐ”๋กœ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ ์–ธํ•ด๋ผ๋Š” ๋ง์ด๋‹ค.

const Logo = () => {
  return (
    <a className="navbar-brand">
      <img src={picSrc}></img>
    </a>
  );
};

return ํ‚ค์›Œ๋“œ ๋ฐ ์ค‘๊ด„ํ˜ธ๋ฅผ ์—†์• ์ฃผ๋ฉด ๋œ๋‹ค.

const Logo = () => (
  <a className="navbar-brand">
    <img src={picSrc}></img>
  </a>
);

์™ธ์—๋„ react/no-unknown-property๋Š” class => className ๋ณ€๊ฒฝ
react/react-in-jsx-scope๋Š” jsx์ฝ”๋“œ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ณณ์— import or require react

eslint๊ฐ€ ์นœ์ ˆํ•˜๊ฒŒ ์—๋Ÿฌ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์„ค๋ช…์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์„๊ฑฐ๋ผ ์˜ˆ์ƒํ•œ๋‹ค ! ๐Ÿ˜Š

๋‹ด๋ถ€ํ„ด eslint์„ค์ •๋ถ€ํ„ฐํ•˜๊ณ  ์ฝ”๋“œ ์ž‘์„ฑ์„ ํ•ด์•ผ๊ฒ ๋‹ค,, ์ค‘๊ฐ„์— ํ•ด๋ฒ„๋ฆฌ๋‹ˆ ใ…‹ใ…‹ใ…‹ใ…‹์›,,,ใ… ใ… 
์•”ํŠผ ์‚ฌ์šฉํ•˜๊ณ ๋‚˜์„œ ์ •๋ง ๊ฐˆ์ˆ˜๋ก ์ผ๊ด€์„ฑ์—†๊ฒŒ ์ž‘์„ฑ์„ ํ•˜๋Š” ๋‚˜ ๊ฐ™์€ ์‚ฌ๋žŒํ•œํ…Œ ์ •๋ง ์•ˆ์„ฑ๋งž์ถค์ด๋ผ๋Š” ์ƒ๊ฐ์ด๋“ค๊ณ 
ํŠนํžˆ ํ˜‘์—…ํ•  ๋•Œ ์ •๋ง ์œ ์šฉํ•  ๋„๊ตฌ๋‹ค. ๐Ÿ‘

eslint ๊ณต์‹ ์‚ฌ์ดํŠธ์— ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์™€ ์‚ฌ๋ก€๋“ค์ด ์ž˜ ๋‚˜์™€์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๋“ฏ ํ•˜๋‹ค :)
https://eslint.org/docs/rules/

0๊ฐœ์˜ ๋Œ“๊ธ€