์ด๋ฒ์ js ํ๋ก์ ํธ๋ฅผ ts๋ก ๋ฐ๊พธ๋ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉด์ typescript ํ๊ฒฝ์ ๋ํด ๊ถ๊ธํด์ ธ์ ์ ๋ฆฌํด ๋ณด๊ฒ ๋์๋ค.
ESlint
- code level์์ ์๋ฌ๊ฐ ๋ ๋งํ ๋ถ๋ถ์ ์ง์ด์ค๋ค
- ๋ฌธ๋ฒ์ค๋ฅ์ฒดํฌ, ์๋์์ฑ, formatting ์ง์
- .eslintrc.{js, yml, json} ์ฌ๋ฌ๊ฐ์ง ํ์ฅ์๋ก ํ ์ ์๋๋ฐ js๋ก ํ๋ฉด ์ฃผ์ ๋ฌ ์ ์์ด์ ์ข์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
module.exports = {
root: true, //lint๊ฐ root:true๋ผ๊ณ ์ง์ ํ๋ฉด ์ด ์์น๊น์ง๋ง configuration ํ์ผ๋ค์ ์ฐพ์
env: { //ํ๋ก์ ํธ์ ์ฌ์ฉ ํ๊ฒฝ์ ์ค์
browser: true,
node: true,
},
extends: [
'eslint:recommended', //eslint์ ๊ธฐ๋ณธ ๊ถ์ฅํ๋ ์ต์
์ผ๋ก validation ํ๊ฒ ์
'plugin:@typescript-eslint/eslint-recommended',
'plugin:@typescript-eslint/recommended',
],
ignorePatterns: ["temp.js", "**/vendor/*.js"], //์ด ํ์ผ๋ค์ ๊ฑด๋๋
plugins: ['react', 'prettier', '@typescript-eslint'], //
rules: {
'prettier/prettier': [ //prettier ์ค์ - eslint-plugin-prettier
'error', //error level๋ก ์ค์
{
singleQuote: true, //prettier ๊ด๋ จ ์ค์ ์ ์๋์์ ์ค๋ช
semi: true,
useTabs: false,
tabWidth: 2,
printWidth: 80,
bracketSpacing: true,
arrowParens: 'avoid',
},
],
},
parserOptions: {
parser: '@typescript-eslint/parser', //tsํ์ผ์ ํ์ฑํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ parser๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค.
},
};
(1) extends ์ต์ :
- ์์๋ฐ์ ๋ชจ๋ ํ์ผ configuration file์ ์ง์ ํ ์ ์์
- ์ฌ๋ฌ ๊ฐ๋ arrayํ์์ผ๋ก ์ ์ผ๋ฉด ๋
- extends์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ๋ฅผ ํ์์ ์ ํด๋๊ณ , ์ดํ์ โrulesโ option์์ override ํ ์ ์์
- eslint/recommended, eslint:all ์ด ์๋๋ฐ ํ์๋ ์ ์ฐ์ง ์์(์ ์ฐ๋๊ฒ ์์ ํจ)
eslint-configprefix๋ฅผ ์๋ตํ ์ ์์1 2 3
// example extends: ['eslint-config-airbnb', 'eslint-config-standard'] extends: ['airbnb', 'standard']//์์ ๋์ผํจ
(2) rules ์ต์ :
- ๊ท์น๋ค์ override(๋๋ ํ์ฅ) ํ ์ ์์
1 2 3 4 5 6 7 8 9 10 11 12 13 14
"rules": { // enable additional rules "indent": ["error", 4], // indent 4 "linebreak-style": ["error", "unix"], "quotes": ["error", "double"], //double quote๋ฉด error๋ก "semi": ["error", "always"], //semi colon ํญ์ - ์์ผ๋ฉด error // override configuration set by extending "eslint:recommended" "no-empty": "warn", "no-cond-assign": ["error", "always"], // disable rules from base configurations "for-direction": "off", }
์๋์ฒ๋ผ ๊ฐ์ฒดํ์์ผ๋ก ์ ์ด๋ ๋. array์ ์ฒซ ๋ฒ์งธ ์์๋ โerrorโ์ฒ๋ผ ์ ์ด๋ ๋์ง๋ง ์ซ์๋ก ์ ์ด๋ ๋.
0=off, 1=warn, 2=error1 2
"max-lines": ["error", { "max": 100 }] "react/jsx-filename-extension": [2, { "extensions": [".jsx", ".tsx"] }],
(3) plugin ์ต์ :
- eslint์ ์ถ๊ฐํ๊ณ ์ถ์ npm package
- ๋ง์ฐฌ๊ฐ์ง๋ก
eslint-plugin-prefix๋ฅผ ์์ ์๋ตํ ์ ์์ (react===eslint-plugin-react)
๊ทธ ์ธ์ ๊ต์ฅํ ๋ง์ rule ๋ค์ ์ง์ ํ ์ ์๋๋ฐ ํํ์ด์ง ์ฐธ๊ณ .
๊ทธ๋ฆฌ๊ณ prettier์ ํจ๊ป ์ฐ๋ฉด eslint ์์ฒด์์๋ formattingํ๋ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ conflict๊ฐ ์๊ธด๋ค. ๋ฐ๋ผ์ plugin๋ค์ ์ค์นํด์ eslint์ formatting์ disableํด์ฃผ๊ณ , prettier์๊ฒ ๋ชจ๋ formatting์ ์ผ์ํด์ค ์ ์๋ค.
- eslint-config-prettier: eslint์ prettier์ ์ถฉ๋๋๋ formatting ๋นํ์ฑํ
- eslint-plugin-prettier: prettier๋ฅผ eslint์ plugin์ผ๋ก ์ถ๊ฐํด์ ์ฌ์ฉํ๊ธฐ ์ํจ
์ถ๊ฐ๋ก prettier ๊ณต์ document์์๋ eslint-plugin-prettier ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ ๊ฒ generally not recommended๋ผ๊ณ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์จ์๊ธด ํ๋ค.
1
2
- ์ง์ ์ ์ผ๋ก prettier์ ๋๋ ธ์ ๋๋ณด๋ค ๋๋ฆฌ๋ค
- ์๋ฌ ๋ผ์ธ์ด ๋๋ฌด ๋ง์์ง ์ ์๋ค(?)
Prettier
๋ณดํต .prettierrc ํ์ผ์ ์ถ๊ฐํด์ ์ฌ์ฉํ๋ฉด ๋์ง๋ง, eslint์ plugin ๊น์์ ๊ฑฐ๊ธฐ์ ์ค์ ํด์ค๋ ๋๋ค.
- ํ ๋จ์ ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ์ ์ํ ๋ ์ฌ์ฉํ๋ ๋๊ตฌ
- ๋ณดํต ์ด์ ๋ ์
ํ
ํด๋๊ณ , ํ์์ ํ์ํด์ ์ถ๊ฐ/์ญ์ ํ๋ฉด ๋๋ค
1 2 3 4 5 6 7 8 9
{ "singleQuote": true, // ๋ฌธ์์ด์ ๋ฐ์ดํ๋ก formatting "semi": true, //์ฝ๋ ๋ง์ง๋ง์ ์ธ๋ฏธ์ฝ๋ฅธ์ด ์๊ฒ formatting "useTabs": false, //ํญ์ ์ฌ์ฉ์ ๊ธํ๊ณ ์คํ์ด์ค๋ฐ ์ฌ์ฉ์ผ๋ก ๋์ฒดํ๊ฒ formatting "tabWidth": 2, // ๋ค์ฌ์ฐ๊ธฐ ๋๋น๋ 2์นธ "trailingComma": 'all', // ๊ฐ์ฒด๋ ๋ฐฐ์ด ํค:๊ฐ ๋ค์ ํญ์ ์ฝค๋ง๋ฅผ ๋ถํ๋๋ก formatting "printWidth": 120, // ์ฝ๋ ํ์ค์ด maximum 120์นธ "arrowParens": 'avoid', // ํ์ดํ ํจ์๊ฐ ํ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ๋ ๊ดํธ๋ฅผ ์๋ตํ๊ฒ formatting }
Babel
- javascript compiler(์ต์ js ๋ฌธ๋ฒ์ด ์ต๋ํ ๋ง์ ๋ธ๋ผ์ฐ์ ์ ํธํ๋ ์ ์๋๋ก ๋ฐ๊ฟ์ฃผ๋ ๋๊ตฌ)
reference
Eslint configuration doc
TS๊ฐ์ - section.5 ํ์ ํ๊ฒฝ ๊ตฌ์ฑ
ESLint, Prettier ์ ์ฉํ๊ธฐ