23.7.3 TIL

๊น€์ง„์ฃผยท2023๋…„ 7์›” 3์ผ
0

TJL(Today Jinju Learned)

๋ชฉ๋ก ๋ณด๊ธฐ
17/35

๐Ÿ“Œ Linting๊ณผ Formatting

๐Ÿ“– ๋ฆฐํŒ…(Linting)์€ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ž ์žฌ์ ์ธ ์˜ค๋ฅ˜, ๋ฒ„๊ทธ, ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ ์œ„๋ฐ˜ ๋“ฑ์˜ ๋ฌธ์ œ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฆฐํŠธ ๋„๊ตฌ(ex: ESLint, JSLint, Pylint)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฉฐ, ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ํŠนํ™”๋œ ๊ทœ์น™๊ณผ ๊ทœ์น™ ์„ธํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฐํŠธ๋Š” ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ๊ณผ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๋ฉฐ, ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ์˜ˆ๋ฐฉํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.
ex) ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ์˜ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„๋‚ด๊ฑฐ๋‚˜, ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์— ๋งž์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“– ํฌ๋งทํŒ…(Formatting)์€ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ์™€ ์„œ์‹์„ ์ผ๊ด€๋˜๊ฒŒ ์ •๋ฆฌํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ ํฌ๋งทํŒ… ๋„๊ตฌ(ex: Prettier, Black, clang-format)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์„œ์‹ํ™”ํ•˜๊ฑฐ๋‚˜ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํฌ๋งทํŒ…์€ ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ผ๊ด€๋œ ์Šคํƒ€์ผ๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฉฐ, ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์—์„œ ์ผ๊ด€๋œ ์„œ์‹์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
ex) ๋“ค์—ฌ์“ฐ๊ธฐ, ์ค„ ๋ฐ”๊ฟˆ, ๊ณต๋ฐฑ์˜ ์‚ฌ์šฉ ๋“ฑ์„ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•˜์—ฌ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.


๐Ÿ“Œ ์‚ฌ์šฉ๋ฒ•

eslint / prettier
vscode์— ๊ฐ๊ฐ ์„ค์น˜๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.

๐Ÿ“Œ eslint ์„ค์น˜ ๋ฐฉ๋ฒ•

$ npm init @eslint/config

์š”๋กœ์ฝ”๋กฌ ์„ค์น˜๋ฅผ ํ–ˆ๋‹ค.
package.json์€ ์ฃผ์„์„ ๋‹ฌ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— js๋กœ ์„ ํƒํ–ˆ๋‹ค.

โš ๏ธ ์ž˜๋ชป ์„ ํƒ ํ–ˆ์„ ๋•Œ ๋‹ค์‹œ ์„ค์น˜ ํ•˜๋Š” ๋ฒ•

$ npm remove eslint

bash์— ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•œ ํ›„
.eslintrc.js ํŒŒ์ผ์„ ์‚ญ์ œํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค.

๐Ÿ“Œ eslint ํ™˜๊ฒฝ๊ตฌ์„ฑ

module.exports = {
    "env": {
        "browser": true,
        "es2021": true,
        "node": true
    },
    "extends": "eslint:recommended",
    "overrides": [
        {
            "env": {
                "node": true
            },
            "files": [
                ".eslintrc.{js,cjs}"
            ],
            "parserOptions": {
                "sourceType": "script"
            }
        }
    ],
    "parserOptions": {
        "ecmaVersion": "latest",
        "sourceType": "module"
    },
    "rules": {
        "no-unused-vars": "warn"
    }
}

๐Ÿ“Œ prettier ์„ค์น˜ ๋ฐฉ๋ฒ•

$ npm i -D prettier

prettier ํ™˜๊ฒฝ๊ตฌ์„ฑ

.prettierrc.js์˜ ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค.

module.exports = {
  // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‹ ๋งค๊ฐœ๋ณ€์ˆ˜ () ์ƒ๋žต ์—ฌ๋ถ€ (ex: (a) => a)
  arrowParens: 'always',
  // ๋‹ซ๋Š” ๊ด„ํ˜ธ(>) ์œ„์น˜ ์„ค์ •
  // ex: <div
  //       id="unique-id"
  //       class="contaienr"
  //     >
  htmlWhitespaceSensitivity: 'css',
  bracketSameLine: false,
  // ๊ฐ์ฒด ํ‘œ๊ธฐ ๊ด„ํ˜ธ ์‚ฌ์ด ๊ณต๋ฐฑ ์ถ”๊ฐ€ ์—ฌ๋ถ€ (ex: { foo: bar })
  bracketSpacing: true,
  // ํ–‰ํญ ์„ค์ • (์ค„ ๊ธธ์ด๊ฐ€ ์„ค์ • ๊ฐ’๋ณด๋‹ค ๊ธธ์–ด์ง€๋ฉด ์ž๋™ ๊ฐœํ–‰)
  printWidth: 80,
  // ์‚ฐ๋ฌธ ๋ž˜ํ•‘ ์„ค์ •
  proseWrap: 'preserve',
  // ๊ฐ์ฒด ์†์„ฑ key ๊ฐ’์— ์ธ์šฉ ๋ถ€ํ˜ธ ์‚ฌ์šฉ ์—ฌ๋ถ€ (ex: { 'key': 'xkieo-xxxx' })
  quoteProps: 'as-needed',
  // ์„ธ๋ฏธ์ฝœ๋ก (;) ์‚ฌ์šฉ ์—ฌ๋ถ€
  semi: true,
  // ์‹ฑ๊ธ€ ์ธ์šฉ ๋ถ€ํ˜ธ(') ์‚ฌ์šฉ ์—ฌ๋ถ€
  singleQuote: true,
  // ํƒญ ๋„ˆ๋น„ ์„ค์ •
  tabWidth: 2,
  // ๊ฐ์ฒด ๋งˆ์ง€๋ง‰ ์†์„ฑ ์„ ์–ธ ๋’ท ๋ถ€๋ถ„์— ์ฝค๋งˆ ์ถ”๊ฐ€ ์—ฌ๋ถ€
  trailingComma: 'es5',
  // ํƒญ ์‚ฌ์šฉ ์—ฌ๋ถ€
  useTabs: false,
};

๐Ÿค” vscode์—์„œ ์„ค์น˜ํ•˜๊ณ  npm์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด์ ?
์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์ง€๋งŒ ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ์‹œ๊ฐ์ ์ธ ํšจ๊ณผ๋กœ ๋ณด๊ธฐ ์œ„ํ•ด์„œ ์„ค์น˜ ํ•˜๊ณ  ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์„ค์น˜ํ•œ๋‹ค.


๐Ÿ“Œ devDependencies์™€ Dependencies ์ฐจ์ด์ 

devDependencies โ†’ ๋‹จ์ˆœํžˆ ๊ฐœ๋ฐœ์šฉ์œผ๋กœ๋งŒ ํ•„์š”ํ•œ ๊ฒƒ, ๋ฐฐํฌ ์‹œ ํฌํ•จ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์šฉ๋Ÿ‰์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

dependencies โ†’ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๋นŒ๋“œ๋  ๋•Œ ํ”„๋กœ์ ํŠธ ์•ˆ์— ๊ผญ ๋“ค์–ด๊ฐ€์žˆ์–ด์•ผ ๋œ๋‹ค๋Š” ๋œป

๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด,
devDependencies๋Š” ๊ฐœ๋ฐœ ์‹œ์—๋งŒ ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ํฌํ•จํ•˜๋Š” ๋ฐ˜๋ฉด, dependencies๋Š” ์‹ค์ œ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ํฌํ•จํ•œ๋‹ค.

์ด๋Š” ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ๊ณผ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์‚ฌ์ด์˜ ์ฐจ์ด๋ฅผ ๋ฐ˜์˜ํ•˜๋ฉฐ, ํ”„๋กœ์ ํŠธ์˜ ๋ฐฐํฌ ๋ฐ ์‹คํ–‰์„ ์œ„ํ•œ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.

๐Ÿ“Œ npx ๊ณผ npm ์ฐจ์ด์ 

npm โžก๏ธ ๋„์„œ๊ด€
npm -g โžก๏ธ ์ฑ…์„ ๊ตฌ๋งค
npx โžก๏ธ ์ฑ…์„ ์—ด์–ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ / ํ•œ๋ฒˆ ๋ณผ ์ˆ˜๋„ ์žˆ์Œ / ํšŒ์›์ œ ๊ฐ™์€ ๋Š๋‚Œ
package.json โžก๏ธ ์ฑ…์„ ๋นŒ๋ ธ๋‹ค๋Š” ์ˆ˜๊ธฐ๋กœ ์“ด ๋ช…๋ถ€ (์ง€์›Œ์งˆ ์ˆ˜๋„ ์žˆ์Œ)
package-lock.json โžก๏ธ ์ˆ˜๊ธฐ๋กœ ์“ด ๋ช…๋ถ€๋ฅผ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅ
"scripts"์— ๋“ค์–ด์žˆ์œผ๋ฉด npx๊ฐ€ ์•„๋‹Œ npm์œผ๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉ!!

const liveServer = require('live-server');

const params = {
  port:5500,
  host:'localhost',
  root: './client',
  open:false
}

liveServer.start(params);

ํŒŒ์ผ์— ์ž‘์„ฑํ•œ ํ›„ ๋…ธ๋“œ๋กœ ๋ผ์ด๋ธŒ ์„œ๋ฒ„ ์‹คํ–‰ํ•˜๊ธฐ

profile
์ง„์ฃผ๋ง๋”ฉ๋™๐ŸŽต

0๊ฐœ์˜ ๋Œ“๊ธ€