๊ฑฐ์ฌ๋ฆฌ๋ import ์ฝ๋
๊ทธ๋์ ๋๋ฆ๋๋ก์ ๊ท์น์ ๊ฐ์ง๊ณ import ์ฝ๋๋ฅผ ์ต๋ํ ๋ณด๊ธฐ ์ข๊ฒ ์ ๋ฆฌํ๊ณ ์์๋ค. ํ์ง๋ง ํ ํ์ผ์์ ์ฌ์ฉํ๋ ๋ชจ๋์ด ํ ๋๊ฐ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋งค๋ฒ ์ด๋ ๊ฒ ์์์ ์ผ๋ก ์ผ์ผ์ด import ์์๋ฅผ ๋ง์ถฐ์ฃผ๋ ๊ฒ ์ฌ๊ฐ ๊ท์ฐฎ์ ์ผ์ด ์๋ ์ ์์๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฌด๋ฆฌ ์ ํ๋ค๊ณ ํด๋ ๋ชจ๋ ํ์ผ์์ ๋์ผํ ๊ท์น์ ๋ฐ๋ฅด๊ธฐ๊ฐ ์ฝ์ง ์์๋ค. ๋ฐ๋ผ์ ESLint๋ก ๊ท์น์ ์ ํ๊ณ ๊ฐ์ ํ ํ๋ ์์ ์ ์งํํ๋ค.
ESLint์ eslint-plugin-import
ESLint๋ eslint-plugin-import
๋ฅผ ํตํด import/export ๊ตฌ๋ฌธ์ ๋ฆฐํธ๋ฅผ ์ง์ํ๋ค. ์ถ๊ฐ์ ์ผ๋ก ๋๋ Webpack๊ณผ TypeScript๋ฅผ ์ฌ์ฉํด์ ์ ๋ ๊ฒฝ๋ก(alias)๋ฅผ ์ค์ ํด๋๊ณ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ์ eslint-plugin-import
์ eslint-import-resolver-webpack
, eslint-import-resolver-typescript
ํจํค์ง๋ค์ ์ค์นํ๋ค.
# yarn
yarn add -D eslint-plugin-import eslint-import-resolver-webpack eslint-import-resolver-typescript
# npm
npm install --save-dev eslint-plugin-import eslint-import-resolver-webpack eslint-import-resolver-typescript
๊ทธ๋ฆฌ๊ณ import/resolver
์
ํ
์ ์๋์ ๊ฐ์ด ํ๋ค.
// .eslintrc
{
"settings": {
"import/resolver": {
"webpack": {},
"typescript": {}
}
}
}
import/order ๊ท์น ์ค์ ํ๊ธฐ
์ด์ ESLint ๊ท์น์ import/order
์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋๋ค. import/order
๊ท์น์ import ์์์ ์ปจ๋ฒค์
์ ์ ํ๊ณ , ๊ทธ๊ฒ์ ๊ฐ์ ํํ๋ค. ๊ทธ๋ฆฌ๊ณ --fix
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๊ด์ ์ผ๋ก ๋ฃฐ์ ๋ง์ง ์๋ ์ฝ๋๋ฅผ ํ ๋ฒ์ ์์ ํ ์๋ ์๋ค. ๊ทธ๋ผ ์ด์ ์ต์
๋ค์ ํ๋์ฉ ์ดํด๋ณด์.
groups
- import ๋๋ ์์๋ฅผ ์ ์. ๊ทธ๋ฃน ๋ด ๊ฐ ์์์ ์์์ ๋์ผ
- ์๋ต๋ ๋ฌธ์์ด์ ๋ง์ง๋ง ์์์ ํจ๊ป ๊ทธ๋ฃนํ
- ๊ฐ๋ฅํ ๊ทธ๋ฃน ๋ฌธ์์ด:
builtin
,external
,internal
,unknown
,parent
,sibling
,index
,object
,type
{
"groups": [
"builtin",
"external",
"internal",
// `sibling`, `parent`, `index` ํ์
์ ์๋ ๊ฒฝ๋ก์ ํ์ผ๋ก๋ถํฐ import ๋๋ ๋ชจ๋์ ๋ปํ๋ค.
// ์ฐจ๋ก๋๋ก ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ชจ์ import ํ๋ค.
["sibling", "parent", "index"],
"type",
// ์๋ต๋ `object` ํ์
๊ณผ ํจ๊ป ๊ฐ์ฅ ๋ง์ง๋ง์ import ๋๋ค.
"unknown"
],
}
pathGroups
- ์ถ๊ฐ์ ์ผ๋ก ์ต์ ์ ์ค์ ํ๊ณ ์ถ์ ๊ฒฝ๋ก๋ฅผ ๋ณ์นญ๊ณผ ํจ๊ป ๋ค์ ๊ทธ๋ฃนํ
- ํ๋กํผํฐ
pattern
- ๊ฒฝ๋ก์ minimatch pattern
patternOptions
- minimatch๋ฅผ ์ํ ์ต์
- ๊ธฐ๋ณธ๊ฐ์
default: { nocomment: true }
group
- ์ ์ฉ๋ ๊ทธ๋ฃน์ ํ์
position
- ์ ์ฉ๋ ๊ทธ๋ฃน์ ๋ฐฐ์น๋ ์์น
after
๋๋before
- ์๋ตํ ๊ฒฝ์ฐ ์, ๋ค๊ฐ ์๋ ๊ทธ๋ฃน๊ณผ ๊ฐ์ด ๋ฐฐ์น๋จ
๋๋ react
์ ๊ด๋ จ๋ ๊ฒฝ๋ก๋ฅผ external
๊ทธ๋ฃน ์ค์์๋ ๊ฐ์ฅ ์์ ๋ฐฐ์นํ๊ณ , ์คํ์ผ๊ณผ ๊ด๋ จ๋ ํ์ผ์ unknown
๊ทธ๋ฃน์ผ๋ก ์ค์ ํด import ์ฝ๋ ๋ด์ ๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก ๋ฐฐ์นํ๊ณ ์ ํ๋ค.
{
"pathGroups": [
// react๊ฐ ํฌํจ๋ ๊ฒฝ๋ก๋ external ๊ทธ๋ฃน ๋ด์์ ๊ฐ์ฅ ์์ ์์น์ํจ๋ค.
{
"pattern": "{react*,react*/**}",
"group": "external",
"position": "before"
},
// ์๋๋ ์ ๋ถ ์คํ์ผ ๊ด๋ จ ํ์ผ๋ค์ unknown ๊ทธ๋ฃน ํ๋๋ก ๋ฌถ์ด์ฃผ๋ ์ญํ ์ ํ๋ค.
{
"pattern": "@saas-fe/**/*.style",
"group": "unknown"
},
{
"pattern": "@pages/**/*.style",
"group": "unknown"
},
{
"pattern": "@components/**/*.style",
"group": "unknown"
},
{
"pattern": "./**/*.style",
"group": "unknown"
},
{
"pattern": "../**/*.style",
"group": "unknown"
},
{
"pattern": "*.style",
"group": "unknown"
}
],
}
์ฐธ๊ณ ๋ก ์คํ์ผ ํ์ผ์ pattern
ํ๋กํผํฐ ๊ฐ์ {react*,react*/**}
์ฒ๋ผ minimatch ํจํด์ ์ ์ฉํด์ ์์ฑํ๊ณ ์์ค๋ฅผ ์ค์ด๊ณ ์ถ์๋๋ฐ ๋ง์ฒ๋ผ ๋์ง ์์๋ค. minimatch ํจํด์ ๋ค์ ์ดํด๋ด์ผ์ง. (minimatch ํจํด์ ์์ ๋งํฌ๋ณด๋ค๋ ์ด cheat-sheet์ ์ฐธ๊ณ ํ๋ ๊ฑธ ์ถ์ฒํ๋ค.)
pathGroupsExcludedImportTypes
pathGroups
์์ ์ค์ ์ ์ํด ์ฒ๋ฆฌ๋์ง ์๋ import type์ ์ ์external
๊ทธ๋ฃน์ฒ๋ผ ๋ณด์ด๋pathGroups
์ต์ ์ ์ฒ๋ฆฌํ ๋ ์ฃผ๋ก ํ์
์ฌ์ค ์ ์ดํดํ์ง ๋ชปํ๊ณ ์ฐ๊ณ ์๋ค. ๐ญ ์์ ์ค์ ํ pathGroups
๊ธฐ์ค์ผ๋ก ์๋์ ๊ฐ์ด ์ค์ ํ์ง ์์ผ๋ฉด ์ ์ฉ์ด ๋์ง ์๋๋ค๋ ๊ฒ๋ง ์ฐธ๊ณ !
{
"pathGroupsExcludedImportTypes": ["react", "unknown"],
}
newlines-between
- ๊ทธ๋ฃน ์ฌ์ด์ ์ค๋ฐ๊ฟ์ ๊ฐ์ ํ ํ๊ฑฐ๋ ๊ธ์งํ๋ ์ต์
ignore
- ๊ทธ๋ฃน ๊ฐ์ ์ค๋ฐ๊ฟ์ด ์์ด๋ ์๋ฌ ๋ฐ์ํ์ง ์์
always
- ๊ทธ๋ฃน ๊ฐ์ ์ต์ ํ ์ค ์ด์์ ์ค๋ฐ๊ฟ์ด ๊ฐ์ ํ๋๋ฉฐ, ๊ทธ๋ฃน ์์์์ ์ค๋ฐ๊ฟ์ ๊ธ์ง๋จ
- ์ฌ๋ฌ ์ค์ ์ค๋ฐ๊ฟ์ ๋ฐฉ์งํ๊ธฐ ์ํด์
no-multiple-empty-lines
๊ท์น์ ์ฌ์ฉํ ์ ์์
always-and-inside-groups
- ๊ทธ๋ฃน ๊ฐ์ ์ต์ ํ ์ค ์ด์์ ์ค๋ฐ๊ฟ์ด ๊ฐ์ ํ๋๋ฉฐ, ๊ทธ๋ฃน ์์์์ ์ค๋ฐ๊ฟ๋ ํ์ฉ๋จ
never
- ์ ์ฒด import ์ฝ๋ ๋ด์์ ์ค๋ฐ๊ฟ์ด ํ์ฉ๋์ง ์์
๋๋ ๋น ๋ผ์ธ์ผ๋ก ๊ทธ๋ฃน ๊ฐ์ ๊ตฌ๋ถ์ด ๊ฐ์์ ์ผ๋ก ๋๋ ๊ฒ์ ์ ํธํ๋ฏ๋ก always
๋ฅผ ์ ์ฉํ๋ค.
{
"newlines-between": "always"
}
alphabetize
- ๊ทธ๋ฃน ๋ด์์ ์ํ๋ฒณ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ ์์๋ฅผ ์ค์
- ํ๋กํผํฐ
order
- ๊ธฐ๋ณธ๊ฐ:
ignore
- ์ค๋ฆ์ฐจ์
asc
๋๋ ๋ด๋ฆผ์ฐจ์desc
- ๊ธฐ๋ณธ๊ฐ:
caseInsensitive
- ๊ธฐ๋ณธ๊ฐ:
false
true
- ๋์๋ฌธ์ ๋ฌด์
- ๊ธฐ๋ณธ๊ฐ:
{
"alphabetize": {
"order": "asc",
"caseInsensitive": true
},
}
warnOnUnassignedImports
- ๋ฑ๋ก๋์ง ์์ import์ ์์๊ฐ ์๋ชป๋์ ๊ฒฝ์ฐ ๊ฒฝ๊ณ ๋ฐ์ ์ฌ๋ถ
- ๊ธฐ๋ณธ๊ฐ:
false
true
- ๊ฒฝ๊ณ ๋ฐ์
--fix
๋ช ๋ น์ด๋ฅผ ํตํด ์๋์ ์ผ๋ก ์์ ๋์ง ์์
์ต์ข ์ค์
// .eslintrc
{
"rules": {
"import/order": [
"error",
{
"groups": [
"builtin",
"external",
"internal",
["sibling", "parent", "index"],
"type",
"unknown"
],
"pathGroups": [
{
"pattern": "{react*,react*/**}",
"group": "external",
"position": "before"
},
{
"pattern": "@saas-fe/**/*.style",
"group": "unknown"
},
{
"pattern": "@pages/**/*.style",
"group": "unknown"
},
{
"pattern": "@components/**/*.style",
"group": "unknown"
},
{
"pattern": "./**/*.style",
"group": "unknown"
},
{
"pattern": "../**/*.style",
"group": "unknown"
},
{
"pattern": "*.style",
"group": "unknown"
}
],
"pathGroupsExcludedImportTypes": ["react", "unknown"],
"newlines-between": "always"
"alphabetize": {
"order": "asc",
"caseInsensitive": true
},
}
],
}
}
๊ฐ์ ๋ import ์ฝ๋
์ฒ์๋ณด๋ค ํจ์ฌ ์ฒด๊ณ์ ์ด๊ณ ๊น๋ํ๊ฒ ์ ๋ฆฌ๋๋ค!
์ด์ ๋ ๊ท์น์ ๋ง์ง ์์ผ๋ฉด ์ฝ๋ ์์์ ESLint ์๋ฌ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ๋ถ๋ถ์ ๋์น์ง ์์ ์ ์๊ณ , ์ผ์ผ์ด ๋ง์ถฐ์ค ํ์์์ด ์๋์ ์ผ๋ก ์์ ๋ ๋๋ค. ์ต๊ณ ๋ค. ESLint๋ฅผ ์ ํ์ฉํ๋ฉด ์ด๋ ๊ฒ๋ ๊ฐ๋ฐ์ ์ง์ด ์ฌ๋ผ๊ฐ๋ค! ๐๐
'๐ป๐ > ๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] ํด๋ก์ (Closure) ํ์ฉํ๊ธฐ (0) | 2022.08.28 |
---|---|
[JS] ํธ์ด์คํ (Hoisting) (0) | 2022.08.28 |
[JS] ์ด๋ฒคํธ์ target๊ณผ currentTarget ์ฐจ์ด (with ๋ฒ๋ธ๋ง) (0) | 2022.08.06 |
[JS] ๊ณ ์ฐจ ํจ์(Higher-Order Function) (0) | 2022.07.31 |
[Monorepo] ์ฌ๋ฌ ํจํค์ง์์ React Context Instance ๊ณต์ ํ๊ธฐ(feat. Module Federation) (1) | 2022.07.31 |