๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

๐Ÿ“ข ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„  "Vue CLI"๋กœ ์„ค์น˜ํ•œ ํ”„๋กœ์ ํŠธ์— ESLint์™€ Prettier๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค.
๋ง›์ง‘ ์ง€๋„ ํ† ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ๊ฒช์—ˆ๋˜ ์‚ฝ์งˆ์„ ์ •๋ฆฌํ•˜๊ณ ์ž ๊ธ€์„ ์ž‘์„ฑํ•ด๋ณธ๋‹ค. 

๐Ÿ‘‘ ESLint๋ž€?

ECMAScript/JavaScript ์ฝ”๋“œ ๋ฒ„๊ทธ๋ฅผ ์‹๋ณ„/ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ. 

๋ฒ„๊ทธ๋ฅผ ์žก์Œ๊ณผ ๋™์‹œ์— ํฌ๋งท ๊ธฐ๋Šฅ๋„ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.
์ฝ”๋“œ ํ’ˆ์งˆ ์—๋Ÿฌ๋ฅผ ์žก๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค.
(ex. no-unused-vars , no-extra-bind , no-implicit-globals , prefer-promise-reject-errors...)

 

Vue-cli v3 ์ด์ƒ์—์„œ๋Š” ์ž๋™์œผ๋กœ eslint ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.
๋˜๋Š” vue create ์‹œ์— ESLint ์˜ต์…˜ ์„ ํƒ์œผ๋กœ ์ž๋™์œผ๋กœ ์„ค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.


์„ค์น˜๊ฐ€ ๋œ ํ”„๋กœ์ ํŠธ์˜ package.json์—” ์•„๋ž˜์™€ ๊ฐ™์€ ESLint ๊ด€๋ จ ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

  "scripts": {
    "lint": "vue-cli-service lint"
  },
  "devDependencies": {
    "@vue/cli-plugin-eslint": "~4.5.0",
    "eslint-plugin-vue": "^6.2.2",      
    "eslint": "^6.7.2", 
    "babel-eslint": "^10.1.0",
  }
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended"
    ],
    "parserOptions": {
      "parser": "babel-eslint"
    },
    "rules": {} 
  },
  • vue-cli-service lint
    • npm run lint ๋ช…๋ น ์‹œ ์‹คํ–‰๋˜๋Š” ๋™์ž‘์ด๋‹ค.
    • ์‹คํ–‰ ์‹œ, ESLint ๋ฒ„๊ทธ ์บ์น˜ + ํฌ๋งทํŒ…์ด ์ง„ํ–‰๋œ๋‹ค.
  •  @vue/cli-plugin-eslint
    • Vue CLI ์šฉ ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ.
  • eslint-plugin-vue
    • Vue.js์šฉ ๊ณต์‹ ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ.
  • eslint
    • ESLint

eslintConfig ๋Š” ESLint ์„ค์ • ํŒŒ์ผ์ด๋‹ค.
eslintConfig ๋Š” ์ง€๊ธˆ์ฒ˜๋Ÿผ package.json ์— ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ๊ณ , .eslintrc ํŒŒ์ผ๋กœ ๋”ฐ๋กœ ๋นผ์„œ ๊ด€๋ฆฌํ•ด ์ค„์ˆ˜๋„ ์žˆ๋‹ค.
.eslintrc ํŒŒ์ผ์€ .json ํŒŒ์ผ์ด์–ด๋„ ๋˜๊ณ , .js ํŒŒ์ผ์ด์–ด๋„ ์ƒ๊ด€ ์—†๋‹ค.

 

eslintConfig ์„ค์ •์„ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž.

๐Ÿ‘‘ ESLint Config

๐Ÿ’Ž root

ESLint ๋Š” ์œ„์—์„œ๋„ ์„ค๋ช…ํ–ˆ๋‹ค์‹œํ”ผ, ์„ค์ •ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋‘˜ ์ˆ˜ ์žˆ๋Š”๋ฐ,
์ด๋Š” ํ•˜๋‚˜์˜ ์ฝ”๋“œ ์ €์žฅ์†Œ์—์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ ๊ฐœ์ผ ์ˆ˜ ์žˆ๋‹ค.

 

ELint ๋Š” ํ˜„์žฌ ํด๋” ์•ˆ์— ์„ค์ • ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ์šฐ์„ ์ ์œผ๋กœ ํ™•์ธํ•ด๋ณด๊ณ  ์—†์œผ๋ฉด
๊ทธ ์ƒ์œ„ ํด๋”๋ฅผ ํ•œ ๋‹จ๊ณ„์”ฉ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ์„ค์ •ํŒŒ์ผ์„ ์ฐพ๋Š”๋‹ค.

์ด ๋•Œ, root ์˜ต์…˜์ด true ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ํŒŒ์ผ์„ ๋งŒ๋‚˜๋ฉด ๋” ์ด์ƒ ์ƒ์œ„ ํด๋”๋กœ ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋Š”๋‹ค.


์ฆ‰, ๋‚ด ์ฝ”๋“œ์—์„  package.json์— ์ •์˜๊ฐ€ ๋˜์–ด์žˆ์œผ๋‹ˆ
์ด package.json ์ƒ์œ„์˜ ํด๋”๋“ค์€ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ’Ž env

๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ๋งˆ๋‹ค ์ „์—ญ(global) ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ณ ์œ  ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค.
๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ, windows ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค.
์ด windows ๊ฐ์ฒด๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„  ์ „์—ญ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ NodeJS์—์„  ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ESLint ๋Š” ์ด๋Ÿฐ ์„ ์–ธํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋“ค์— ๋Œ€ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋‚ด๊ธฐ ๋•Œ๋ฌธ์—,
์–ด๋–ค ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ํ™˜๊ฒฝ์ธ์ง€๋ฅผ ์ธ์ง€์‹œ์ผœ์ค˜์•ผํ•œ๋‹ค.

์ด ์—ญํ• ์„ env ๊ฐ€ ํ•˜๊ณ  ์žˆ๋‹ค.

 

์œ„์™€ ๊ฐ™์ด node๋ฅผ true๋กœ ์„ค์ •ํ•ด ์ค€๋‹ค๋ฉด,
NodeJS์—์„œ ์‹คํ–‰๊ฐ€๋Šฅํ•œ ์ „์—ญ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋Œ€์‘์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

    "env": {
      "node": true
    },

๐Ÿ’Ž extends

์œ ๋ช… ๊ธฐ์—…์ด๋‚˜ ESLint ๊ณต์‹์—์„œ ESLint ์„ค์ •์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋‹ค.
์ด๋ฅผ extends ์— ์จ์ฃผ๋ฉด ๊ทธ๋“ค์˜ ESLint ์„ค์ •์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

ํ™œ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ Prettier ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ด ๊ณณ์— ์จ์ฃผ๋ฉด ๋œ๋‹ค.

  "extends": ["airbnb"]

์˜ˆ๋ฅผ ๋“ค์–ด ,์—์–ด๋น„์•ค๋น„์—์„œ ๊ณต์œ ํ•œ ESLint ์„ค์ •์„ ์“ฐ๊ณ  ์‹ถ๋‹ค๋ฉด,
eslint-config-airbnb npm ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด ๋ฐ›์€ ํ›„ ์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์œ„์™€ ๊ฐ™์ด eslint-config- ๋ผ๋Š” ์ ‘๋‘์–ด๊ฐ€ ๋ถ™๋Š”๋ฐ, ์ด๋Š” extends ์—์„œ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.
์ •ํ™•ํžˆ๋Š”, eslint-config- ๊ฐ€ ๋ถ™๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์ดํ•˜ 'config ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ')๋Š”

config ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ทœ์น™๊ณผ ์ถฉ๋Œํ•˜๋Š” ESLint ๊ทœ์น™์„ OFF ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

"extends": [
      "plugin:vue/essential",
      "eslint:recommended"
    ],

๋‚ด ์ฝ”๋“œ์—์„  ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑ๋˜์–ด ์žˆ์—ˆ๋‹ค.
plugin:vue/essential ๋Š” Vue ๊ณต์‹์—์„œ ์ œ๊ณตํ•˜๋Š” ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ,

์—๋Ÿฌ๋ฅผ ๋‚ด๋Š” ์ฝ”๋“œ์™€, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ๋Š” ์ฝ”๋“œ๋ฅผ ์˜ˆ์ธกํ•œ๋‹ค.
eslint:recommended ๋Š” ESLint ๊ณต์‹์—์„œ ์ถ”์ฒœํ•˜๋Š” ํฌ๋งท ์„ค์ •์ด๋‹ค.

 

์ด๋Ÿฐ์‹์œผ๋กœ ๋‚จ์˜(?) ์„ค์ •์„ ๊ฐ€์ ธ์™€์„œ ์„ธํŒ…(ํ™•์žฅ)ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’Ž parserOptions

๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ์‹ค์ œ๋กœ ๋ธŒ๋ผ์šฐ์ €์™€ ๊ฐ™์€ ์‹คํ–‰ํ™˜๊ฒฝ์—์„œ ์‹ค์ œ๋กœ ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ์™€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋‚˜ JSX ์™€ ๊ฐ™์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ™•์žฅ๋ฌธ๋ฒ•์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜
Babel ๊ณผ ๊ฐ™์€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ตœ์‹  ๋ฌธ๋ฒ•์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก Babel

ES6 ์ด์ƒ์˜ ์ตœ์‹  ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ES5 ์ดํ•˜์˜ ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ/ํŠธ๋žœ์ŠคํŒŒ์ผ ํ•ด์ฃผ๋Š” ๋„๊ตฌ.
์ตœ์‹  ๋ฌธ๋ฒ•์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ์‹คํ–‰ํ™˜๊ฒฝ์—์„œ๋„ ์ตœ์‹  ๋ฌธ๋ฒ• ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฌธ์ œ ์—†์ด ์ž‘๋™ํ•˜๋„๋ก ๋„์™€์ค€๋‹ค.

 

ESLint ๋Š” ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋งŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ™•์žฅ ๋ฌธ๋ฒ•์ด๋‚˜ ์ตœ์‹  ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๋ฆฐํŠธํ•˜๊ธฐ ์œ„ํ•ด์„  ๊ทธ์— ์ƒ์‘ํ•˜๋Š” ํŒŒ์„œ(parser)๋ฅผ ์„ค์ •ํ•ด์ค˜์•ผํ•œ๋‹ค.

    "parserOptions": {
      "parser": "babel-eslint"
    },

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด babel-eslint ๋ผ๋Š” eslint ์šฉ ๋ฐ”๋ฒจ์ด ์„ค์ •๋˜์–ด ์žˆ๋‹ค.
babel-eslint๋Š” vue cli ๋กœ๋ถ€ํ„ฐ ์ž๋™์œผ๋กœ ์„ค์น˜๊ฐ€ ๋˜์–ด ์žˆ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‹ค. 

๐Ÿ’Ž rules

ESLint ๊ทœ์น™์„ ๋””ํ…Œ์ผํ•˜๊ฒŒ ์ œ์–ดํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„์›Œ์ ธ์žˆ๋‹ค.

extends ์˜ต์…˜์„ ํ†ตํ•ด ์„ค์ •๋œ ๊ทœ์น™์„ ๋ฎ์–ด์“ฐ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด...

Airbnb ๊ธฐ๋ฐ˜ ์„ค์ •์—๋Š” no-console ๊ทœ์น™์„ ์–ด๊ธฐ๋ฉด ๊ฒฝ๊ณ (warn)๋ฅผ ๋‚ด๋Š”๋ฐ,
๊ฒฝ๊ณ ๊ฐ€ ์•„๋‹Œ ์˜ค๋ฅ˜(error)๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

{
  "extends": ["airbnb"],
  "rules": {
    "no-console": "error"
  }
}

๐Ÿ‘‘ Prettier๋ž€?

๊ณต๋ฐฑ ๋ฐ ํƒญ ๊ฐ„๊ฒฉ, ํ‚ค์›Œ๋“œ ๊ฐ„๊ฒฉ, ์‰ผํ‘œ ์Šคํƒ€์ผ ๋“ฑ ์ฝ”๋“œ ํ˜•์‹์— ๋Œ€ํ•œ ํฌ๋งทํŒ…์„ ์ง€์›ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.
์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์„ค์ •ํ•ด๋†“์œผ๋ฉด ์ž๋™์œผ๋กœ ์ฝ”๋“œ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
Prettier ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์„ ์‰ฝ๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ก ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜

์ฝ๊ณ , ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ ๊ทœ์•ฝ

๐Ÿ’Ž ESLint vs Prettier

  Prettier ESLint
์šฉ๋„ ์„œ์‹ ๋ฐ ์Šคํƒ€์ผ ์ง€์ •์šฉ ์ฝ”๋“œ ๋ฒ„๊ทธ ์žก๊ธฐ์šฉ
์‹คํ–‰ ๋ฐฉ๋ฒ• prettier --write eslint --fix

๐Ÿ‘‘ Prettier ์ ์šฉ

Prettier ๋ฅผ ์ ์šฉํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์„ค์น˜๋ถ€ํ„ฐ ํ•ด์ฃผ์ž.

--dev ๋Š” devDependencies(๊ฐœ๋ฐœ์šฉ ์˜์กด์„ฑ. ๋ฐฐํฌ ๋–ˆ ํฌํ•จ๋˜์ง€ ์•Š์Œ) ์— ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ์˜ต์…˜์ด๋‹ค.

$ npm i prettier --dev

Prettier ๋ฅผ ์„ค์น˜ ํ–ˆ๋‹ค๋ฉด, ์ด์ œ ์–ด๋–ค ์Šคํƒ€์ผ์„ ์“ธ ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•ด์ค˜์•ผํ•œ๋‹ค.
์ผ๋‹จ์€ prettier ๊ณต์‹ ์„ค์ •(@vue/eslint-config-prettier)์œผ๋กœ ์„ค์น˜ํ•ด์ค„๊ฒƒ์ด๋‹ค.

 

vue cli ๋กœ ์„ค์น˜ํ•œ ํ”„๋กœ์ ํŠธ๋Š” ๋ณ„๋„์˜ eslint-config-prettier ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณด๋‹จ,

@vue/eslint-config-prettier์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

vue cli ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ณ„๋„์˜ ์„ค์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
(๋‚˜๋Š” ์ฒ˜์Œ์— vue cli ํ”„๋กœ์ ํŠธ ์šฉ์ด ์•„๋‹Œ eslint-config-prettier๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ, ์•„์ฃผ ๋‚œ๋ฆฌ๊ฐ€ ๋‚ฌ์—ˆ๋‹ค.)

 

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ง๊ณ ๋„ vue cli ๋กœ ์„ค์น˜ํ•œ ํ”„๋กœ์ ํŠธ๋Š” vue cli ์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋”ฐ๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ,
ํ•ญ์ƒ @vue/ ๊ฐ€ ์ ‘๋‘์–ด๋กœ ๋ถ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋ณ„๋„๋กœ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ์ข‹๋‹ค.

$ npm i --dev @vue/eslint-config-prettier

์„ค์น˜ํ•œ ์Šคํƒ€์ผ์€ extends ๋ถ€๋ถ„์— ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

"extends": [
      "plugin:vue/essential",
      "eslint:recommended",
      "@vue/eslint-config-prettier" // ์ถ”๊ฐ€!
    ],

๐Ÿ‘‘ .prettierrc

์„ค์ •ํ•œ ์Šคํƒ€์ผ์— ๊ฐœ์ธ์ ์ธ ์„ค์ •์„ ๋ฎ์–ด์”Œ์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด
๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— .prettierrc ํŒŒ์ผ์„ ํŒŒ๊ณ  ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
๋‚˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•ด์คฌ๋‹ค.

{
  "singleQuote": true,
  "semi": true,
  "tabWidth": 4,
  "printWidth": 100,
  "singleAttributePerLine": true
}
  • singleQuote
    • ์Œ๋”ฐ์˜ดํ‘œ๊ฐ€ ์•„๋‹Œ ์ž‘์€ ๋”ฐ์˜ดํ‘œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • semi
    • ์ฝ”๋“œ ๋์— ํ•ญ์ƒ ์„ธ๋ฏธ์ฝœ๋ก ์€ ๋ถ™์ธ๋‹ค.
  • tabWidth
    • ํƒญ๊ฐ„๊ฒฉ. ๋‚˜๋Š” 4์นธ์œผ๋กœ ํ–ˆ๋‹ค.
  • printWidth
    • ์ค„ ๋ฐ”๊ฟˆํ•  ์ตœ๋Œ€ ์ค„ ๊ธธ์ด
  • singleAttributePerLine
    • html ์†์„ฑ์„ ์ด์–ด ์“ฐ์ง€ ์•Š๊ณ  ๊ฐ๊ฐ ํ•œ ์ค„๋งˆ๋‹ค ์ž‘์„ฑํ•œ๋‹ค.

๋‚˜๋Š” ํŒ€ ์ฝ”๋“œ ์˜ํ–ฅ์œผ๋กœ ์ด ์„ค์ •์ด ์ต์ˆ™ํ•ด์„œ ํŒŒ์ผ์„ ๋”ฐ๋กœ ํŒŒ์คฌ๋‹ค.
์ด ์˜ต์…˜ ์™ธ์—๋„ ๋‹ค๋ฅธ ์˜ต์…˜๋„ ์ง€์ • ๊ฐ€๋Šฅํ•˜๋‹ค. (์ž์„ธํžˆ)

๐Ÿšจ Prettier ์ ์šฉ ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค๋ฉด?

์„ค์น˜ ํ•˜๊ณ  ๋‚˜๋‹ˆ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋–ด๋‹ค.

 

Error: Failed to load plugin 'prettier' declared in 'package.json » @vue/eslint-config-prettier': Cannot find module 'eslint-plugin-prettier'

 

ํ•ด์„ํ•ด๋ณด๋‹ˆ, eslint-plugin-prettier ๋ผ๋Š” ๋ชจ๋“ˆ์ด ์—†๋‹ค๊ณ  ํ•œ๋‹ค.
๋‹น์—ฐํ•˜๋‹ค. ์•ˆ ๊น”์•„์คฌ๋‹ค.

 

๐Ÿ’ก eslint-plugin-prettier

ESLint ๋Š” ์ฝ”๋“œ ๋ฒ„๊ทธ๋ฅผ ์žก์Œ๊ณผ ๋™์‹œ์— ํฌ๋งทํ„ฐ ์—ญํ• ๋„ ํ•ด ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,
์ฝ”๋“œ ์Šคํƒ€์ผ ํฌ๋งทํ„ฐ์ธ Prettier ์™€ ์ถฉ๋Œํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด eslint-plugin-prettier ์ด๋‹ค.
Prettier ๊ทœ์น™๋“ค์„ ESLint ๊ทœ์น™์— ์ถ”๊ฐ€ํ•˜๋Š” ํŒจํ‚ค์ง€์ด๋‹ค.
eslint --fix ๋งŒ ์‹คํ–‰ํ•ด์ค˜๋„ prettier --write๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š” ์—†์ด Prettier ๊นŒ์ง€ ์ ์šฉ์‹œ์ผœ์ค€๋‹ค.

 

ํ•ด๊ฒฐ๋ฒ•์„ ์•Œ์•„๋ณด๊ธฐ์— ์•ž์„œ,
์ด ์—๋Ÿฌ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํ™˜๊ฒฝ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.
(๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ 'Failed to load plugin 'prettier' declared in 'package.json'...' ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค.)


์•„๋ž˜์—์„œ ์„ค๋ช…ํ•  ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค๋ฅธ ์—๋Ÿฌ๋„ ๋†’์€ ํ™•๋ฅ ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค๐Ÿ˜Ž
์ฐจ๊ทผ์ฐจ๊ทผ ์‚ฝ์งˆํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณด์ž.

 

๋จผ์ € ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ํ›„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์›์ธ์€ ๋‘๊ฐ€์ง€์ด๋‹ค.

  1. ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋ฒ„์ „ ํ˜ธํ™˜์ด ๋˜์ง€ ์•Š์•„์„œ
  2. ํ•„์š”ํ•œ(์˜์กดํ•ด์•ผํ•˜๋Š”) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„์„œ.

์ด๋Ÿด ๋•Œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด npm info ๋ช…๋ น์–ด์ด๋‹ค.
npm info๋Š” ๋ง ๊ทธ๋Œ€๋กœ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด์ด๋‹ค.

 

์„ค์น˜ํ•˜๊ณ ์ž ํ–ˆ๋˜ @vue/eslint-config-prettier ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ info ๋ช…๋ น์–ด๋กœ ์•Œ์•„๋ณด์ž.

๋งŽ์€ ์ •๋ณด๊ฐ€ ๋‚˜์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์•Œ์•„์•ผํ•  ์ •๋ณด๋Š” dependencies ์™€ latest ๋ฒ„์ „์ด๋‹ค.
์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๋ฒ„์ „ ํ˜ธํ™˜ ๋ฌธ์ œ์™€ ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ถ€์žฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ค„ ํ‚ค์›Œ๋“œ๋“ค์ด๋‹ค.

 

๋‹ค๋ฅธ ์ •๋ณด๋“ค์€ ๋”ฑํžˆ ํ•„์š” ์—†์–ด์„œ, ์˜ต์…˜์„ ์ •ํ•ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

 

ํ•„์š”ํ•œ ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™•์ธ

$ npm info [๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ช…] peerDependecies

์—ญ๋Œ€ ๋ฆด๋ฆฌ์ฆˆ ๋ฒ„์ „ ํ™•์ธ

$ npm info [๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ช…] versions

@vue/eslint-config-prettier ์˜ ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์ž,
eslint 7.28.0 ๋ฒ„์ „ ์ด์ƒ๊ณผ, prettier 2.0.0 ์ด์ƒ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋‚˜์™”๋‹ค.

 

package.json์„ ํ™•์ธํ•ด๋ณด๋‹ˆ,

    "eslint": "^6.7.2",
    "prettier": "^2.7.1",

prettier ์˜ ๋ฒ„์ „์€ ์ถฉ์กฑํ–ˆ์ง€๋งŒ, eslint์˜ ๋ฒ„์ „์ด ํ•œ์ฐธ ๋‚ฎ์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


์ด๋Ÿด ๋•, ๊ธฐ์กด์˜ eslint ๋ฅผ ๋ฒ„์ „์—…ํ•ด์ค˜๋„ ๋˜๊ธด ํ•˜์ง€๋งŒ,
vue cli๋กœ ์ธํ•ด ์ž๋™ ์„ค์น˜๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—ฌ์„œ ๋‹ค๋ฅธ ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „ ๋˜ํ•œ ์ˆ˜์ •ํ•ด์•ผํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์—,
์„ค์น˜ํ•˜๊ณ ์žํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „์„ ์ตœ์‹ ์ด ์•„๋‹Œ ํ˜„์žฌ ํ™˜๊ฒฝ์— ๋งž์ถฐ์„œ ๋‚ฎ์€ ๋ฒ„์ „์„ ์„ค์น˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์–ผ๋งˆ๋‚˜ ๋‚ฎ์€ ๋ฒ„์ „์„ ์„ค์น˜ํ•ด์ค˜์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์„ ๋•Œ!
versions ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

ํ™•์ธํ•ด๋ณด๋‹ˆ, ์ตœ์‹  ๋ฒ„์ „ ์ด์ „ ๋ฒ„์ „์ด 6.0.0 ์ธ ๊ฒƒ์œผ๋กœ ๋‚˜์™”๋‹ค.
6.0.0์— ๋Œ€ํ•œ ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๊ฒ€์ƒ‰ํ•ด๋ณด์•˜๋‹ค.

eslint ๊ฐ€ 5.0.0 ๋ฒ„์ „ ์ด์ƒ์ด์–ด์•ผํ•˜๊ณ ,
eslint-plugin-prettier ์˜ ๋ฒ„์ „์ด 3.1.0,
prettier ๋Š” 1.13.0 ๋ฒ„์ „ ์ด์ƒ์ด์–ด์•ผํ•œ๋‹ค.

 

์•„๊นŒ ์—๋Ÿฌ์˜ ์›์ธ์ด์—ˆ๋˜ eslint-plugin-prettier ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กด์žฌ๋ฅผ ๋“œ๋Ÿฌ๋ƒˆ๋‹ค.
eslint์™€ prettier ๋Š” ๋ชจ๋‘ ๋‚ด ํ™˜๊ฒฝ์— ์ ํ•ฉํ•œ ๋ฒ„์ „์ด๋‹ค.

 

์ฆ‰, ๋‚˜๋Š” @vue/eslint-config-prettier๋ฅผ 6.0.0 ๋ฒ„์ „์œผ๋กœ ์„ค์น˜ํ•ด์•ผํ•˜๊ณ ,
eslint-plugin-prettier@^3.1.0 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•ด์•ผํ•œ๋‹ค.

npm i @vue/eslint-config-prettier@6.0.0 eslint-plugin-prettier@^3.1.0 --dev

์„œ๋ฒ„๋ฅผ ๋Œ๋ฆฌ์ž ์˜์กด์„ฑ๋ผ๋ฆฌ์˜ ์ถฉ๋Œ์—†์ด ์•„๋ฌด ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค! ๐ŸŽ‰

๐Ÿ‘‘ JetBrains Tools ์—์„œ Prettier ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์„ค์น˜ํ•œ Prettier๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์ž, Prettier ๊ฐ€ ๋‚ด ์ฝ”๋“œ๊ฐ€ ๊ฐœํŒ์ด์—ˆ๋‹ค๊ณ  ์—ด์‹ฌํžˆ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

 

Intellij๋‚˜ Webstorm ๊ฐ™์€ JetBrains ํˆด์—์„œ๋Š” ์ด๋ฅผ Ctrl + Shift + Alt + P ๋‹จ์ถ•ํ‚ค๋กœ ํ•œ๋ฒˆ์— ์ˆ˜์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
์ฝ”๋งจ๋“œ ๋ผ์ธ ๋ช…๋ น์–ด๋กœ๋Š” Vue CLI์˜ npm run lint๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค.

(์ด ๋ช…๋ น์–ด๋Š” ์ •ํ™•ํžˆ๋Š” eslint --fix ์™€ prettier --write ๋ฅผ ํ•จ๊ป˜ ๊ตฌ๋™์‹œํ‚จ๋‹ค.)

 

ํ•˜์ง€๋งŒ ๋งค๋ฒˆ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๊ธฐ์—” ๊ท€์ฐฎ์œผ๋‹ˆ, ํˆด์—์„œ ์ž๋™ ํฌ๋งท์ด ๋˜๋„๋ก ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

Prettier ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‹ค์šด

๋จผ์ €, Settings(ctrl + alt + s) - Plugins ์—์„œ Prettier ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‹ค์šดํ•ด์ค€๋‹ค.

 

Settings - Languages & Frameworks - JavaScript - Prettier

Settings - Languages & Frameworks - JavaScript - Prettier ์—์„œ

Prettier package ๋ฅผ npm install ํ•ด์ค€ Prettier ๊ฒฝ๋กœ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.

 

๋ฆฌํฌ๋งท/์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ Prettier ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์œผ๋ฉด ํ•ด์„œ,

"On 'Reformat Code' action" ๊ณผ "On save" ์ฒดํฌ๋ฐ•์Šค์— ๋ชจ๋‘ ์ฒดํฌํ•œ๋‹ค.

Settings - Tools - Actions on Save

Settings - Tools - Actions on Save ์—์„œ

์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์€ ๋™์ž‘์„ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๋‚˜๋Š” ์•„๋ž˜ ๋‚ด์šฉ์„ ์ฒดํฌํ•ด์ฃผ์—ˆ๋‹ค.

 

  •  Reformat code
    • ์ฝ”๋“œ๋ฅผ ํฌ๋งทํŒ… ์‹œํ‚จ๋‹ค.
  • Rearrange code
    • ์ฝ”๋“œ๋ฅผ ์žฌ์ •๋ ฌ ์‹œํ‚จ๋‹ค.
  • Run code cleanup
    • ์ฝ”๋“œ ์Šคํƒ€์ผ ์œ„๋ฐ˜์„ ์ฆ‰์‹œ ์ œ๊ฑฐ
  • Run eslint --fix
    • ESLint ์‹คํ–‰ ๋ฐ ํฌ๋งทํŒ…
  • Run Prettier
    • Prettier ์‹คํ–‰ ๋ฐ ํฌ๋งทํŒ…

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•ด๋‘๋ฉด ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ESLint/Prettier ๋ฆฌํฌ๋งท์ด ๋  ๊ฒƒ์ด๋‹ค. ๐ŸŽ‰


์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„  Vue CLI ํ”„๋กœ์ ํŠธ์— ESLint/Prettier ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค!

๋Œ“๊ธ€/ํ•˜ํŠธ/ํ”ผ๋“œ๋ฐฑ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค๐Ÿฅฐ

 

์ฐธ์กฐ

 

Seize the day!

Spring MVC | Spring Boot | Spring Security | Mysql | Oracle | PostgreSQL | Vue.js | Nuxt.js | React.js | TypeScript | JSP | Frontend | Backend | Full Stack | ์ž๊ธฐ๊ณ„๋ฐœ | ๋ฏธ๋ผํด ๋ชจ๋‹ | ์ผ์ƒ