Parcel & ESLint

๊ฐ•์˜ ์š”์•ฝ

Parcel

ํŠน๋ณ„ํ•œ ์„ค์ • ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ ๋„๊ตฌ

๋ฒˆ๋“ค๋Ÿฌ? ๋นŒ๋“œ?

  • ๋ฒˆ๋“ค๋Ÿฌ โ†’ ์—ฌ๋Ÿฌ๊ฐœ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ํ•ฉ์ณ์ฃผ๋Š” ๋„๊ตฌ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” HTML, CSS, JS ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ๊นŒ์ง€ ํ•œ๋‹ค. ex) TS -> JS

  • ๋ฒˆ๋“ค๋ง โ†’ ํ•˜๋‚˜์˜ ์‹œ์ž‘์ (entry point)๋กœ๋ถ€ํ„ฐ ์˜์กด์ ์ธ ๋ชจ๋“ˆ์„ ์ „๋ถ€ ์ฐพ์•„๋‚ด์„œ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฌผ๋กœ ๋ฌถ๋Š”(๋ฒˆ๋“ค) ๊ณผ์ •์„ ์˜๋ฏธํ•˜๊ณ  ์ด๊ฒƒ์„ ๋นŒ๋“œ๋ผ๊ณ ๋„ ํ•œ๋‹ค.

dist(distribute) Dir

์‹ค์ œ ํ”„๋กœ๋•ํŠธ ํ™˜๊ฒฝ์—์„œ ์„œ๋น„์Šค ๋  ๋นŒ๋“œ๋œ ๊ฒฐ๊ณผ์˜ ์ฝ”๋“œ

build ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋งค๋ฒˆ ์ƒ์„ฑ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— node_modules ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์›๊ฒฉ์ €์žฅ์†Œ์— ์˜ฌ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

๋นŒ๋“œ๋œ ๊ฒฐ๊ณผ๋ฌผ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ฝ๊ธฐ ์–ด๋ ต๊ฒŒ ๋‚œ๋…ํ™” ๋˜์–ด ์žˆ๋‹ค. ๋‚œ๋…ํ™”๋˜์žˆ์–ด๋„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•ด์„ํ•ด์„œ ๋™์ž‘ํ•˜๊ธฐ์—๋Š” ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

๋‚œ๋…ํ™”๋ฅผ ํ•˜๋Š” ์ด์œ 

์ค„๋ฐ”๊ฟˆ, ๋„์–ด์“ฐ๊ธฐ ๊ฐ™์€ ์—ฌ๋ฐฑ ๊ณต๊ฐ„ ๋ฐ ๋ณ€์ˆ˜๋ช… ๋“ฑ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์šฉ๋Ÿ‰์„ ์ฐจ์ง€ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ค„์—ฌ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ

์ด ๊ณผ์ •์ด ์ผ์–ด๋‚˜๋ฉด ์‚ฌ๋žŒ์ด ๋ณด๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ๊ฐ€ ๋˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘์‹œํ‚ค๋Š”๊ฒŒ ๋ชฉ์ ์ด๋ผ ์ƒ๊ด€์—†๋‹ค

์„ค์ •์ด ํ•„์š”์—†๋‹ค์ง€๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ์ข‹์€ ์„ค์ •

  1. parcel ๋ฒˆ๋“ค๋Ÿฌ๋Š” ๋นŒ๋“œํ•  ๋•Œ ๊ฒฐ๊ณผ์ ์œผ๋กœ main ์˜ต์…˜์— ์˜ํ–ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฑฐํ•˜์ž.

  2. package.json ํŒŒ์ผ์— source ์†์„ฑ ์ถ”๊ฐ€. ๋งค๋ฒˆ ๋ฒˆ๋“ค๋งํ•  ๋•Œ ์ผ์ผํžˆ ๋„์šธ ํƒ€๊ฒŸ์„ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์€ ๊ท€์ฐฎ์Œ npx parcel index.html --port: 8080

//"main": "index.js", <- ์ œ๊ฑฐ
"source": "./index.html",
  1. parcel-reporter-static-files-copy ํŒจํ‚ค์ง€ ์„ค์น˜ ํ›„ .parcelrc ํŒŒ์ผ ์ž‘์„ฑ. ์ด๋ ‡๊ฒŒํ•˜๋ฉด static ํด๋”์˜ ํŒŒ์ผ์„ ์ •์  ํŒŒ์ผ๋กœ Serving ํ•  ์ˆ˜ ์žˆ๋‹ค.(์ด๋ฏธ์ง€ ๋“ฑ Assets)

{
  "extends": ["@parcel/config-default"],
  "reporters": ["...", "parcel-reporter-static-files-copy"]
}

๋นŒ๋“œ + ์ •์  ์„œ๋ฒ„ ์‹คํ–‰

npx parcel build

npx server ./dist

ESLint

๋ฆฐํŠธ(lint), ๋ฆฐํ„ฐ(linter)๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜,๋ฒ„๊ทธ,์Šคํƒ€์ผ ์˜ค๋ฅ˜, ์˜์‹ฌ์Šค๋Ÿฌ์šด ๊ตฌ์กฐ์ฒด์— ํ‘œ์‹œ(flag)๋ฅผ ๋‹ฌ์•„ ๋†“๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋“ค์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์™œ ์‚ฌ์šฉํ•˜๋‹ˆ?

  • ์Šคํƒ€์ผ ํ†ต์ผ

  • ์ž ์žฌ์  ๋ฌธ์ œ ๋ฐœ๊ฒฌ

  • ๋ฒ ์ŠคํŠธ ํ”„๋ ‰ํ‹ฐ์Šค(์ฝ”๋”ฉ ์ปจ๋ฒค์…˜) ์ถ”์ฒœ โ†’ ์ตœ์‹  ํŠธ๋ Œ๋“œ ํ•™์Šต ํ™œ์šฉ

  • ์ผ๊ด€์„ฑ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์ •์  ํ”„๋กœ๊ทธ๋žจ ๋ถ„์„

์‹ค์ œ ์‹คํ–‰ ์—†์ด ์ปดํ“จํ„ฐ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ

๋ฆฐํŠธ๊ฐ€ ์ •์  ํ”„๋กœ๊ทธ๋žจ ๋ถ„์„์— ์†ํ•œ๋‹ค.

.vscode/setting.json

ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ด JS/TS ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ESLint๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฌธ์ œ์ ์„ ๊ณ ์น˜๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅ

{
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  }
}

์„ค์ •(์•„์ƒฌ Ver)

CLI

npm run check // ํƒ€์ž… ์ฒดํฌ ๊ฒ€์‚ฌ
// -> "check": "tsc --noEmit",
npm run lint // ๋ฆฐํŠธ ๊ฒ€์‚ฌ
// -> "lint": "eslint --fix --ext .js,.jsx,.ts,.tsx .",

ํ‚ค์›Œ๋“œ

Vite(๋น„ํŠธ)

  • ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ์˜ ๋Š๋ฆฐ ๋นŒ๋“œ ์†๋„๋กœ ์ธํ•œ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ์ €ํ•˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Go์–ธ์–ด ๊ธฐ๋ฐ˜์˜ ES Build ํˆด

  • Go์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ์˜ ๋นŒ๋“œ ์†๋„๋ณด๋‹ค ๋งŽ๊ฒŒ๋Š” 100๋ฐฐ ์ด์ƒ ๋น ๋ฆ„

  • ES Build๋Š” ๋นŒ๋“œ๋งŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋กœ ๋นŒ๋“œ ์™ธ ๋” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋“ค์„ ๋Œ€์ฒดํ•˜๊ธฐ ํž˜๋“ค์—ˆ์Œ

  • ES Build๋ฅผ ์•ˆ์“ฐ๊ธฐ์—” ๋„ˆ๋ฌด ์•„๊นŒ์šด ์ฐฐ๋‚˜์— Vue.js๋ฅผ ๋งŒ๋“  Evan you๊ฐ€ ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ์˜ ๊ธฐ๋Šฅ + ES Build๋ฅผ ๊ฒฐํ•ฉํ•œ ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ ํˆด์„ ๊ฐœ๋ฐœํ•œ๊ฒŒ Vite์ด๋‹ค.

Lint(๋ฆฐํŠธ)

lint๋Š” ๋ณดํ‘ธ๋ผ๊ธฐ๋ผ๋Š” ๋œป ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ถ„์•ผ์—์„œ๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์˜ค๋ฅ˜ ๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ์— ํ‘œ์‹œ(flag)๋ฅผ ๋‹ฌ์•„๋†“๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋ฌธ๋ฒ•์ ์ธ ์˜ค๋ฅ˜ ๋˜๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์„ ์ฐพ์•„์ฃผ์–ด ์ผ๊ด€๋œ ์ฝ”๋“œ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜๊ณ  ๊ฐ€๋…์„ฑ ๋†’์€ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค.

Lint๋ž€?

  • lint๋Š” ๋ณดํ‘ธ๋ผ๊ธฐ๋ผ๋Š” ๋œป

  • ๋ฌธ๋ฒ•์ ์ธ ์˜ค๋ฅ˜ ๋˜๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์„ ์ฐพ์•„์ฃผ์–ด ์ผ๊ด€๋œ ์ฝ”๋“œ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜๊ณ  ๊ฐ€๋…์„ฑ ๋†’์€ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค.

.eslintrc

  • eslint ์„ค์ •ํŒŒ์ผ

  • eslint๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„ค์ •ํŒŒ์ผ์ด ๊ผญ ํ•„์š”ํ•˜๋‹ค.

eslint ์‹คํ–‰

  • ๊ทœ์น™ ๋ชฉ๋ก์ค‘ ์™ผ์ชฝ์— ๋ Œ์น˜ ํ‘œ์‹œ๊ฐ€ ๋ถ™์€ ๊ฒƒ์ด --fix ์˜ต์…˜์œผ๋กœ ์ž๋™ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ

npx eslint [๊ฒ€์‚ฌํ•  ํŒŒ์ผ] // --fix ์˜ต์…˜์œผ๋กœ ์ž๋™์œผ๋กœ ๊ณ ์ณ์งˆ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œํ•œํ•ด์„œ๋Š” eslint๊ฐ€ ์ˆ˜์ •ํ•ด์ค€๋‹ค.

Rules

  • ESLint๋Š” ์ฝ”๋“œ ๊ฒ€์‚ฌ ๊ทœ์น™์„ ๋ฏธ๋ฆฌ ์ •ํ•ด ๋†“์Œ

  • ESLint ์„ค์ •ํŒŒ์ผ(.eslintrc.js)์— ๊ทœ์น™์„ ์ž‘์„ฑ

  • ๊ทœ์น™์„ ์„ค์ •ํ•˜๋Š” ๊ฐ’์€ 3๊ฐ€์ง€ ("off" or 0, "warn" ๋˜๋Š” 1, "error" ๋˜๋Š” 2)

module.exports = {
  rules: {
    'no-unexpected-multiline': 'error',
  },
};

Extensible Config

  • ๊ทœ์น™์„ ์—ฌ๋Ÿฌ๊ฐœ ๋ฏธ๋ฆฌ ์ •ํ•ด ๋†“์€ ๊ฒƒ์ด eslint:recommended

  • ๊ทœ์น™ ๋ชฉ๋ก์ค‘ ์™ผ์ชฝ์— ์ฒดํฌ ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด ์ด ์„ค์ •์—์„œ ํ™œ์„ฑํ™” ๋˜์žˆ๋Š” ๊ทœ์น™๋“ค

module.exports = {
  extends: ['eslint:recommended'],
};

๊ทธ ์™ธ ๊ทœ์น™ (airbnb)

module.exports = {
  extends: ['airbnb'],
};

git hooks

git commit ๋˜๋Š” git push์™€ ๊ฐ™์€ git ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚˜๊ธฐ ์ „์— ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ git ์ด๋ฒคํŠธ ์‚ฌ์ด์— ๊ฐˆ๊ณ ๋ฆฌ(hook)๋ฅผ ๊ฑธ์–ด์ฃผ๋Š” ๊ฒƒ

  • ๊นƒ ์ปค๋งจ๋“œ ์‹คํ–‰ ์‹œ์ ์— ๋ผ์—ฌ๋“ค์ˆ˜ ์žˆ๋Š” ํ›…์„ ์ œ๊ณต

  • husky ์™€ lint-staged ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ปค๋ฐ‹์„ ํ‘ธ์‹œํ•˜๊ธฐ ์ „์— ๋ฆฐํŠธ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰

  • ์ฆ‰, ์ปค๋ฐ‹ ํ˜น์€ ๋ฆฌ๋ชจํŠธ ํ‘ธ์‹œ ์ง์ „์— ๋ฆฐํŠธ ๊ฒ€์‚ฌ๋ฅผ ํ•˜์—ฌ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•ด์•ผ๋งŒ ํ‘ธ์‹œ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉ์‹

Install

$ npm pkg set scripts.prepare="husky install"
$ npm run prepare
$ npx husky add .husky/pre-commit "npx lint-staged --no-stash"
// .husky์— pre-commit ์„ค์ •์ด ์ถ”๊ฐ€๋จ

husky

  • git hook ๋™์ž‘์— ๋Œ€ํ•œ ์ •์˜๋ฅผ .git ํŒŒ์ผ์ด ์•„๋‹Œ .husky ์—์„œ ๊ด€๋ฆฌํ•˜์—ฌ repository์—์„œ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•จ

  • .git ํŒŒ์ผ์€ ์• ์ดˆ์— .gitignore์— ๋“ฑ๋ก๋˜์–ด ์žˆ๊ณ  ๋ฐฐํฌ์ „์— ์–ด๋–ค ๋™์ž‘์„ ํ•˜๋ ค๋˜๊ฒƒ์ด ์ฝ”๋“œ์—๋Š” ์ ์šฉ์ด ์•ˆ๋  ์ˆ˜ ์žˆ์–ด์„œ .husky์—์„œ ๊ด€๋ฆฌ ํ•„์š”.

lint-staged

  • git staged ์ƒํƒœ์˜ ํŒŒ์ผ๋“ค๋งŒ ๋ญ”๊ฐ€๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

Last updated