๐Ÿ” ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค FE ๋ฐ๋ธŒ์ฝ”์Šค 5๊ธฐ TIL = output path | ์‚ฌ์šฉ์ž ์ด๋ฆ„ ์ด์Šˆ | scoped | props

Jun 2k (Jun2)ยท2023๋…„ 11์›” 24์ผ
1
post-thumbnail

2023.11.23 ๊ฐ•์˜

๐Ÿ’ป Intro & TMI

์ฝ”์–ดํƒ€์ž„์„ ๋งˆ์น˜๊ณ  ์˜ค๋žœ๋งŒ์— ๋ฐฐ๋“œ๋ฏผํ„ด์„ ์น˜๊ณ  ์™”๋‹ค.
๋‚ ์”จ๊ฐ€ ์ถ”์›Œ์„œ ๊ทธ๋Ÿฐ์ง€ ์–ด๊นจ๊ฐ€ ์ข€ ๋•ก๊ธด๋‹ค. ๊ทธ๋ž˜๋„ ์Šค๋งค์‹œ ๋งŽ์ด ์น˜๊ณ  ์˜ค๋‹ˆ๊นŒ ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ๋‹ค ํ’€๋ ธ๋‹ค. ๋‚ด ์‚ถ์˜ ๋‚™์ธ ๋ฐฐ๋“œ๋ฏผํ„ด ๋ชป ๋Š์–ด...

Vue์˜ ๊ฐ•์˜๋Ÿ‰์ด ์ƒ๋‹นํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ƒ๊ฐ๋ณด๋‹ค Vue์˜ ๋งค๋ ฅ๋„ ํ‘น ๋น ์ง€๋Š” ์ค‘์ด๋‹ค. ์ด๋ฒˆ ๋”ฅ๋‹ค์ด๋ธŒ๋ฅผ ์‹ ์ฒญํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ ๋‹ค์Œ ๋”ฅ๋‹ค์ด๋ธŒ ๋•Œ Vue์— ๋Œ€ํ•ด ์ข€ ๋” ์„ธ์„ธํ•˜๊ฒŒ ๊ณต๋ถ€ํ•˜๊ณ  ์ด์— ๋Œ€ํ•ด ๋ฐœํ‘œ๋ฅผ ์ง„ํ–‰ํ•ด๋ณผ๊นŒ ์ƒ๊ฐ์ค‘์ด๋‹ค.



๐Ÿง ์˜ค๋Š˜ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ๊ฒƒ

Webpack output path ์„ค์ • ์‹œ ์ฃผ์˜์‚ฌํ•ญ

Vue ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฒˆ๋“คํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๊ฐ€ Webpack์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ Webpack ๋ฒˆ๋“ค์— ๋Œ€ํ•œ ์„ค์ •์„ ์ง€์ •ํ•˜๋Š” webpack.config.js ํŒŒ์ผ์ด ์กด์žฌํ•œ๋‹ค.

// webpack.config.js ํŒŒ์ผ
const path = require('path')

module.exports = {
    entry: './src/main.js',
    ouput: {
        path: path.resolve(__dirname, 'dist'),
    }
    // ๋‹ค๋ฅธ ์„ค์ • ์†์„ฑ๋“ค์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค...
}

์ด ๋•Œ ๋ฒˆ๋“ค ์‹œ์ž‘ ๊ธฐ์ค€ ์œ„์น˜์ธ entry๋Š” ํ˜„์žฌ webpack.config.js ํŒŒ์ผ ์œ„์น˜ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ์„ ํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ์ œ์ผ ์ฒ˜์Œ ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ output ์†์„ฑ์€ ์กฐ๊ธˆ ์ƒํ™ฉ์ด ๋‹ค๋ฅด๋‹ค.
ํ˜„์žฌ ์ฝ”๋“œ์—์„œ๋Š” output ์•„๋ž˜์— ์ถ”๊ฐ€์ ์ธ ์„ค์ • ์†์„ฑ์ด ์—†์ง€๋งŒ ์‹ค์ œ๋กœ ๋ฒˆ๋“ค์„ ์ง„ํ–‰ํ•˜๋ฉด ์ˆ˜๋งŽ์€ ์„ค์ • ์†์„ฑ๋“ค์ด ์ถ”๊ฐ€๋œ๋‹ค.
์ด ์†์„ฑ๋“ค์ด ๋‹ค ์ ์šฉ๋˜๊ณ  ๋งˆ์ง€๋ง‰์— output ์†์„ฑ์ด ์ ์šฉ๋˜๋ฏ€๋กœ ๋ฒˆ๋“ค์ด ์™„๋ฃŒ๋œ ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•  ๋•Œ ํ˜„์žฌ webpack.config.js์˜ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์ž์นซ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ path.resolve๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„ __dirname ๊ธฐ์ค€์œผ๋กœ 'dist'๋ž€ ํด๋”๋ฅผ ์ƒ์„ฑํ•ด์„œ ํ•ด๋‹น ํด๋”์— ํŒŒ์ผ์ด ์œ„์น˜ํ•˜๋„๋ก ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.



์‚ฌ์šฉ์ž ์ด๋ฆ„ ์˜์–ด๋กœ ํ•ด์•ผํ•˜๋Š” ์ด์œ ...

๋‚œ ์•„์ง ์‚ฌ์šฉ์ž ์ด๋ฆ„์ด ์ต๋‘ฅ์ด๋กœ ๋˜์–ด ์žˆ๋‹ค. ๋…ธํŠธ๋ถ ์ฒ˜์Œ ์‚ด ๋•Œ๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ์ƒ๊ฐ๋„ ์•ˆํ•˜๊ณ  ์žˆ์—ˆ๋˜ ์ „์ž์ „๊ธฐ๊ณตํ•™๊ณผ ๋Œ€ํ•™์ƒ์ด์—ˆ๊ธฐ์—.. ๋ฌดํ„ฑ๋Œ€๋กœ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์ €๋ ‡๊ฒŒ ์ง€์ •ํ•ด๋ฒ„๋ ธ๋‹ค. (๊ท€์—ฝ๊ธด ํ•œ๊ฐ€..?)

์˜ค๋Š˜ ๊ฐ•์˜ ์ค‘ parcel๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ build๊ฐ€ dev ์„œ๋ฒ„ ๊ณผ์ •์„ ๋Œ๋ ค์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์žˆ์—ˆ๋‹ค.
๊ฐœ๋ฐœ์„œ๋ฒ„๋ฅผ ์ž ์‹œ ์ค‘๋‹จํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ dev ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ฐ•์‚ฌ๋‹˜๋„ ํŒŒ์ผ ๊ฒฝ๋กœ ์ƒ์— ํ•œ๊ธ€์ด๋‚˜ ๊ณต๋ฐฑ์ด ์—†์–ด์•ผ ํ•œ๋‹ค๊ณ  ์–ธ๋œป ๋งํ•ด์ฃผ์…จ๋Š”๋ฐ ์ด๋Ÿฐ ์ด์œ ์ธ ๊ฒƒ ๊ฐ™์•˜๋‹ค.

์–ด์ฉ” ์ˆ˜ ์—†์ด ๊ณ„์†ํ•ด์„œ .parcel_cache ํด๋”๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ๋นŒ๋“œํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ํ˜„์žฌ ์žˆ๋Š” ์ƒํƒœ๋‹ค...

์กฐ๋งŒ๊ฐ„ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํฌ๋งท์œผ๋กœ ์—Ž์œผ๋ฉด์„œ ์‚ฌ์šฉ์ž ์ด๋ฆ„ ์˜์–ด๋กœ ์„ค์ •ํ•ด์•ผ๊ฒ ๋‹ค ใ… ใ…  ๋ญ˜๋กœ ํ•˜์ง€? ikdungii ??



Vue ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ ์Šค์ฝ”ํ”„ ์ œ์–ด : scoped

์ปดํฌ๋„ŒํŠธ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ์— style์„ ์ง€์ •ํ•  ๋•Œ ์„œ๋กœ ์˜ค์—ผ๋˜์ง€ ๋ง์•„์•ผ ํ•  ์†์„ฑ๋“ค์ด ์กด์žฌํ•œ๋‹ค.

์ด๋Ÿด ๊ฒฝ์šฐ์— ๊ทธ๋ƒฅ style์„ ์ง€์ •ํ•˜๊ฒŒ ๋˜๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ ์š”์†Œ์—๊นŒ์ง€ style ์„ ํƒ์ž๊ฐ€ ํ•ฉ์ณ์ ธ์„œ ์›์น˜ ์•Š๋Š” ์š”์†Œ์—๋„ ์ ์šฉ๋˜์–ด๋ฒ„๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

// App.vue
<template>
  <h1>{{ msg }}</h1>
  <Hello />
</template>


// Hello.vue
<template>
  <h1>Hello</h1>
</template>

<style>
h1 {
  color: royalblue;
}
</style>

Hello.vue์— ์ ์šฉํ•œ ์Šคํƒ€์ผ์ด App.vue์˜ h1ํƒœ๊ทธ์—๋„ ์ ์šฉ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ๊ฒƒ์ด scoped ์˜ต์…˜์ด๋‹ค.


// Hello.vue
//...
<style scoped>
h1 {
  color: royalblue;
}
</style>

์œ„์™€ ๊ฐ™์ด style ํƒœ๊ทธ์— ํ•ด๋‹น ์˜ต์…˜์„ ์ง€์ •ํ•˜๋ฉด Hello.vue ์ปดํฌ๋„ŒํŠธ์—๋งŒ style ์Šค์ฝ”ํ”„๊ฐ€ ์ง€์ •๋˜๋ฏ€๋กœ ์™ธ๋ถ€๋กœ style ์†์„ฑ์ด ์˜ค์—ผ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

h1 ํƒœ๊ทธ ๋’ค์— ํŠน์ •ํ•œ data๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  css์—๋„ ์†์„ฑ์„ ํƒ์ž []๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์„œ ๋ฒ”์œ„๊ฐ€ ์ถ•์†Œ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์Šคํƒ€์ผ์˜ ๋…๋ฆฝ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ์˜ต์…˜์ด๋‹ˆ ๋ฐ˜๋“œ์‹œ ์•Œ์•„๋‘ฌ์•ผ ํ•  ๊ฐœ๋…์ด์—ˆ๋‹ค.



Vue ์ปดํฌ๋„ŒํŠธ Props ํ‘œ๊ธฐ ์‹œ ์ฃผ์˜์ 

์ปดํฌ๋„ŒํŠธ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” Props๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
ํ•˜์ง€๋งŒ template ์ƒ์—์„œ์™€ Vue ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†์„ฑ ์ƒ์—์„œ์˜ ํ‘œ๊ธฐ ์‹œ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

๋จผ์ €, template ์ƒ์—์„œ์˜ props๋Š” kebab-case๋กœ ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•ด์„œ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

<blog-post post-title="hello!"></blog-post>

์ด๋ ‡๊ฒŒ ๋„˜๊ฒจ์ค€ props๋ฅผ ํ•ด๋‹น blog-post ์ปดํฌ๋„ŒํŠธ ์ƒ์—์„œ ์ •์˜ํ•  ๋•Œ๋Š” camelCase๋กœ props ์†์„ฑ์˜ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

// App.Vue
app.component('blog-post', {
  //...
  props: ['postTitle'],
}

์ด๊ฒƒ์€ ๊ฐ ํ™˜๊ฒฝ์—์„œ props๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๋‚ด๋ถ€ ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•์ด๋ฏ€๋กœ ๊ผญ ์•”๊ธฐํ•ด์•ผ๊ฒ ๋‹ค.



๐Ÿ‘€ ๋А๋‚€์ 

๐Ÿ‘ Keep

๊ทธ๋ž˜๋„ ๋‚˜๋ฆ„ TIL์„ ๊พธ์ค€ํžˆ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋‹ค. ๋‹จ์ˆœ ๋‚ด์šฉ ์ •๋ฆฌ๊ฐ€ ์•„๋‹Œ ๊ฐ•์˜๋ณ„๋กœ ํ•ต์‹ฌ ๋‚ด์šฉ์„ ํ•˜๋‚˜๋งŒ ๋‚ด๊ฐ€ ๋ฝ‘์•„์„œ ์ด๊ฑฐ ํ•˜๋‚˜๋งŒํผ์€ ๊ผญ ๊ธฐ์–ตํ•˜์ž๋ž€ ๋งˆ์Œ์œผ๋กœ ๊ธฐ๋กํ•˜๊ณ  ์žˆ๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ํ•™์Šต ํšจ๊ณผ๊ฐ€ ๋†’์•„์ง€๋Š” ๊ฒƒ ๊ฐ™์•„ ์ข‹๋‹ค! ๊ณ„์†ํ•ด์„œ ์ด๋ ‡๊ฒŒ ๊ฐ€๋ณด์ž๊ณ !

๐Ÿ˜ฑ Problem

์–ด์ œ ๋ฐฐ๋“œ๋ฏผํ„ด์„ ์น˜๊ณ  ๋‚˜์„œ ์กฐ๊ธˆ๋งŒ ์‰ฌ์–ด์•ผ์ง€ ํ•˜๋‹ค๊ฐ€ ๊นœ๋นก ์ž ๋“ค์–ด๋ฒ„๋ ธ๋‹ค. ๋ˆˆ ๋œจ๋‹ˆ๊นŒ ์ƒˆ์†Œ๋ฆฌ๊ฐ€ ์งน์งน ใ…‹ใ…‹ใ…‹ใ…‹. ํ”ผ๋กœ๊ฐ€ ์•Œ๊ฒŒ ๋ชจ๋ฅด๊ฒŒ ์Œ“์—ฌ ์žˆ์–ด์„œ ๊ทธ๋Ÿฐ์ง€ ๊ธฐ์ ˆํ•˜๋Š” ๋นˆ๋„๊ฐ€ ์š”์ƒˆ ์žฆ๋‹ค. ํ‘น ์žค์ง€๋งŒ ์ž๋‚˜๊นจ๋‚˜(?) ๊ฑด๊ฐ• ์ฑ™๊ธฐ์ž.

๐Ÿ˜œ Try

Vue์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉด์„œ Vue๋งŒ์˜ ๋‹จ์ ์ด ์žˆ๋Š”๋ฐ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‚˜ ์†์„ฑ ๋ฐ ํ‚ค์›Œ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ํฅ๋ฏธ๋กœ์›€์„ ๋งŽ์ด ๋А๋‚€๋‹ค. ์ด๊ฒƒ๋“ค์„ TIL๋กœ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ด ์ •๋ฆฌํ•ด์„œ ๋”ฅ๋‹ค์ด๋ธŒ๋ฅผ ์ง„ํ–‰ํ•ด๋ด๋„ ์ข‹๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ ๋‹ค. ํ•ด๋ณด...์ž?



๐Ÿ˜… ํ•ด๋‹น ๋‚ด์šฉ์€ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด๋‚˜ ์˜คํ•ดํ•˜๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ค€๋น„์ค‘...

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

comment-user-thumbnail
2023๋…„ 11์›” 24์ผ

์ต๋‘ฅ์ด๋‹˜ ์˜ˆ์ œ ์ฝ”๋“œํ•˜์ด๋ผ์ดํŠธ ์•„๋งˆ html๋กœ ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์•„์š”(?)

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ