ESLint

ESLint๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, JSON, ๋งˆํฌ๋‹ค์šด์„ ์ •์  ๋ถ„์„ํ•˜๋Š” ๋ฆฐํŠธ(Lint) ๋„๊ตฌ๋‹ค.

๊ตฌ์„ฑ

ESLint๋Š” eslint.config.(js|mjs|cjs) ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ(configuration)์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด ๊ตฌ์„ฑ ๋ฐฉ์‹์€ .eslintrc.(js|json|yaml|yml) ํŒŒ์ผ์„ ์‚ฌ์šฉํ•œ๋‹ค.

ํ”Œ๋žซ(flat) ๊ตฌ์„ฑ์€ v8.21.0 (2022๋…„)์— ๋„์ž…๋œ ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ ์‹œ์Šคํ…œ์ด๋‹ค. ๊ธฐ์กด ๊ตฌ์„ฑ ๋ฐฉ์‹์˜ ๋ณต์žก์„ฑ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์œผ๋กœ ์ œ์‹œ๋˜์—ˆ๊ณ , v9์—์„œ๋Š” ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์‹œ์Šคํ…œ์ด ๋˜์—ˆ๋‹ค. ํ”Œ๋žซ ๊ตฌ์„ฑ์€ ๋ณด๋‹ค ๋‹จ์ˆœํ•˜๊ณ  ์œ ์—ฐํ•˜๋‹ค. ๊ธฐ์กด์˜ ๊ตฌ์„ฑ ์‹œ์Šคํ…œ์€ ์ƒ์œ„์— ์žˆ๋Š” eslintrc ํŒŒ์ผ์„ ์ƒ์†ํ•˜๋А ๊ณ„์ธตํ˜• ๊ตฌ์กฐ์˜€๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” ๊ตฌ์„ฑ์„ ๋”์šฑ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์›์ธ์ด ๋˜์—ˆ๋‹ค. ํ”Œ๋žซ ๊ตฌ์„ฑ ๋ฐฉ์‹์€ ์›์น™์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ ํŒŒ์ผ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์œ„์— ์–ด๋–ค ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ์ฐพ์•„๋ณด์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

ํ”Œ๋žซ ๊ตฌ์„ฑ ์‹œ์Šคํ…œ์€ ๋ฐฐ์—ด์— ๋‹ด๊ธด ๊ฐ ๊ตฌ์„ฑ ๊ฐ์ฒด๋ฅผ ๋ณ‘ํ•ฉํ•ด ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ๋’ค์— ์˜ค๋Š” ๊ตฌ์„ฑ ๊ฐ์ฒด๋Š” ์•ž์— ์˜ค๋Š” ๊ตฌ์„ฑ ๊ฐ์ฒด๋ฅผ ๋ฎ์–ด์“ด๋‹ค.

export default [
    {
        rules: {
            'no-console': 'error',
        },
    },
    {
        rules: {
            'no-console': 'off',
        },
    },
];

์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑ์„ ์ž‘์„ฑํ•˜๋ฉด no-console ๊ทœ์น™์ด off๋กœ ์„ค์ •๋œ๋‹ค. ๋˜ํ•œ files ํ‚ค๋กœ ํ•ด๋‹น ๊ตฌ์„ฑ ๊ฐ์ฒด๊ฐ€ ์ ์šฉ๋  ํŒŒ์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. files ํ‚ค๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ(*.(js|mjs|cjs))์— ๊ทœ์น™์ด ์ ์šฉ๋œ๋‹ค.

export default [
    {
        rules: {
            'no-console': 'error',
        },
    },
    {
        files: ['*.test.js'],
        rules: {
            'no-console': 'off',
        },
    },
];

์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑ์„ ์ž‘์„ฑํ•˜๋ฉด *.test.js ํŒŒ์ผ์—์„œ๋Š” no-console ๊ทœ์น™์ด ๋น„ํ™œ์„ฑํ™”๋˜๊ณ , ๋‹ค๋ฅธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์—์„œ๋Š” ํ™œ์„ฑํ™”๋œ๋‹ค. ์ฃผ์˜ํ•  ์ ์€ ์•ž์— ๋‚˜์˜ค๋Š” ๊ตฌ์„ฑ ๊ฐ์ฒด์— ์ •์˜๋œ files ํ‚ค๊ฐ€ ๋’ค์— ๋‚˜์˜ค๋Š” ๊ตฌ์„ฑ ๊ฐ์ฒด์—๋„ ์ ์šฉ๋œ๋‹ค๋Š” ์ ์ด๋‹ค. ๋งŒ์•ฝ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋ฉด *.test.js ํŒŒ์ผ์— ๋Œ€ํ•ด no-console ๊ทœ์น™์ด error๋กœ ์„ค์ •๋œ๋‹ค.

export default [
    {
        files: ['*.test.js'],
        rules: {
            'no-console': 'off',
        },
    },
    {
        rules: {
            'no-console': 'error',
        },
    },
];

๋”ฐ๋ผ์„œ ๋” โ€˜๊ตฌ์ฒด์ ์ธโ€™ ๊ตฌ์„ฑ ๊ฐ์ฒด๋ฅผ ๋’ค์— ๋ฐฐ์น˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ตฌ์„ฑ์˜ ์ ์šฉ ์ˆœ์„œ๋ฅผ ๋น„๋กฏํ•ด ์ ์šฉ๋œ ๊ตฌ์„ฑ์˜ ์ƒ์„ธํ•œ ์ •๋ณด๋ฅผ ์‚ดํŽด๋ณด๋ ค๋ฉด eslint --inspect-config ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

8.x ๋ฒ„์ „ ESLint CLI๋Š” ์‹คํ–‰ ์งํ›„ ๊ธฐ์กด ๊ตฌ์„ฑ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š”์ง€, ํ”Œ๋žซ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํŒŒ์•…ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋ถ€ํ„ฐ ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์˜ฌ๋ผ๋ฉด์„œ eslint.config ํŒŒ์ผ์„ ์ฐพ๋Š”๋‹ค. ๋งŒ์•ฝ ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— eslint.config ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด ํ”Œ๋žซ ๊ตฌ์„ฑ ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ธฐ์กด ๊ตฌ์„ฑ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— eslintrc ํŒŒ์ผ์ด ์žˆ์–ด๋„ ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— eslint.config ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ํ›„์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ปดํ“จํ„ฐ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— eslint.config ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๊ฐ€ ํ”Œ๋žซ ๊ตฌ์„ฑ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

๊ธฐ์กด์—๋Š” ๋ฆฐํŒ…ํ•  ํŒŒ์ผ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ฐพ์•„ ์ ์šฉํ–ˆ์ง€๋งŒ, ํ”Œ๋žซ ๊ตฌ์„ฑ ๋ฐฉ์‹์—์„œ๋Š” ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ์œ„์น˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ฐพ๋Š”๋‹ค. ๋ชจ๋…ธ๋ ˆํฌ์—์„œ๋Š” ๊ฐ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋งˆ๋‹ค ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋‘๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ํ”Œ๋žซ ๊ตฌ์„ฑ์—์„œ๋Š” ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ์œ„์น˜์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์ ์šฉ๋  ์ˆ˜ ์žˆ์–ด ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ๋ฆฐํŒ…ํ•  ํŒŒ์ผ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ํƒ์ƒ‰ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ”ผ์ณ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

$ eslint --flag unstable_config_lookup_from_file example.js

์ฐธ๊ณ ์ž๋ฃŒ

์ด ๋ฌธ์„œ๋ฅผ ์ธ์šฉํ•œ ๋ฌธ์„œ