Vue 09-1 Vue-CLI & router Project ๊ฐœ๋…

Seungju Hwangยท2021๋…„ 1์›” 12์ผ
0

Vue

๋ชฉ๋ก ๋ณด๊ธฐ
10/18
post-thumbnail

Vue CLI Project

ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด vue ๊ตฌ์กฐ์™€ vue router์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.

Vue 06-2 ์ฐธ์กฐํ•ด์„œ vue-cli๋ฅผ ์„ค์น˜ํ–ˆ๋‚˜์š”?


๐Ÿ”ต ๊ตฌ์กฐ

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ

$vue create my-project

node_modules

  • npm์œผ๋กœ node.js ํ™˜๊ฒฝ์˜ ์—ฌ๋Ÿฌ ์˜์กด์„ฑ ๋ชจ๋“ˆ
  • g ์˜ต์…˜์„ ์ค€ ๊ฒฝ์šฐ๋Š” ์ „์—ญ ์˜์—ญ์— ์„ค์น˜๋˜๊ณ  ํ•ด๋‹น ์˜ต์…˜์„ ๋นผ๋ฉด ํ”„๋กœ์ ํŠธ ํด๋” ๋‚ด๋ถ€(local)์— ์ƒ์„ฑ๋œ๋‹ค.
  • ์ ˆ๋Œ€๋กœ git์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ์•ˆ๋˜๋Š” ํด๋”

public/index.html

  • The file public/index.html is a template that will be processed with html-webpack-plugin.
  • Vue ์•ฑ์˜ ๋ผˆ๋Œ€๊ฐ€ ๋˜๋Š” html ํŒŒ์ผ
  • main.js์—์„œ $mount('#app') ๋งˆ์šดํŠธ์˜ ๋Œ€์ƒ์ด ๋˜๋Š” DOM Element๊ฐ€ ์กด์žฌํ•œ๋‹ค.
  • ์‹ค์ œ ๋ฐฐํฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด npm run buildํ•œ ๊ฒฐ๊ณผ๋ฌผ์€ ์ด html ๋ฌธ์„œ ํ•œ ์žฅ์— ๋ชจ๋‘ ๋ฌถ์ด๊ฒŒ ๋œ๋‹ค.

package.json

  • ์ผ๋ฐ˜์ ์œผ๋กœ node_modules ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— package.json์˜ ๋‚ด์šฉ์„ ํ˜„์žฌ์˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด npm์„ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.
$ npm install
  • script
    - vue์—์„œ ์‚ฌ์šฉํ•  ๋ช…๋ น์–ด script
  • dependencies
    - Dev + Production Level์—์„œ๊นŒ์ง€ ํ™œ์šฉ ํ•  ๋ชจ๋“ˆ
    - ๋ฒ„์ „์„ ๊ฐ™์ด ๋ช…์‹œ
  • devDependencies
    - Development Level์—์„œ๋งŒ ํ™œ์šฉ ํ•  ๋ชจ๋“ˆ

package-lock.json

  • Describe a single representation of a dependency tree such that teammates, deployments, and continuous integration are guaranteed to install exactly the same dependencies.
  • node_modules ์— ์„ค์น˜๋˜๋Š” ๋ชจ๋“ˆ๊ณผ ๊ด€๋ จํ•ด์„œ ๋ชจ๋“  ์˜์กด์„ฑ์„ ์•Œ์•„์„œ ์„ค์ •ํ•œ๋‹ค. โ†’ ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์‚ฌ์šฉ ํ•  ํŒจํ‚ค์ง€์˜ ๋ฒ„์ „์„ ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • npm install ๋ช…๋ น์–ด์— ์ƒ์„ฑ๋œ๋‹ค. โ†’ ์ฆ‰, ๊ทธ ์ˆœ๊ฐ„์— ์ตœ์‹  ์ •๋ณด๋ฅผ ๋ฐ˜์˜ํ•œ ์˜์กด์„ฑ ๋ชจ๋“ˆ์„ ์ ๊ฒ€ํ•˜๋Š” ๊ฒƒ.
    • ์ด๋ ‡๊ฒŒ ์งง์€ ์ˆœ๊ฐ„์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํ˜‘์—… ๊ฐœ๋ฐœ ๊ณผ์ • ๊ฐ„์˜ ์˜์กด์„ฑ ํŒจํ‚ค์ง€ ์ถฉ๋Œ ๋“ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

babel.config.js

  • ๋ฐ”๋ฒจ ์„ค์ •๊ณผ ๊ด€๋ จ๋œ ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€๋Š” ํŒŒ์ผ

src/

  • assets/
    • webpack์— ์˜ํ•ด ๋นŒ๋“œ๋œ ์ •์  ํŒŒ์ผ
  • components/
    • ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ
    • ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„ฃ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

App.vue

  • ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ

main.js

  • Webpack์ด ๋นŒ๋“œ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ง„์ž…์ (Entry Point)
  • ์‹ค์ œ ๋‹จ์ผ ํŒŒ์ผ์—์„œ DOM๊ณผ Data๋ฅผ ์—ฐ๊ฒฐ ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ž‘์—…์ด ์ด๋ฃจ์–ด์ง€๋Š” ํŒŒ์ผ
    • DOM์— mountํ•˜๋Š” ์ž‘์—…
  • Vue ์ „์—ญ์—์„œ ํ™œ์šฉ ํ•  ๋ชจ๋“ˆ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ

๐Ÿ”ต Vue Router

url์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค!

$vue add router

ํ™˜๊ฒฝ์„ค์ •

Vue CLI ํ™˜๊ฒฝ์—์„œ๋Š” ํŽธํ•˜๊ฒŒ ๋ช…๋ น์–ด ํ•œ์ค„๋งŒ ์ž…๋ ฅํ•˜๋ฉด ์„ค์น˜ ๊ฐ€๋Šฅ

  • ์ค‘๊ฐ„์— commit ์—ฌ๋ถ€๋ฅผ ๋ฌผ์–ด๋ณด๋Š” ๊ฒƒ์€ ์„ ํƒ์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด ๋˜๊ณ  History๋ชจ๋“œ๋ฅผ ๋ฌผ์–ด๋ณด๋Š” ๊ฒƒ์€ ๋ฌด์กฐ๊ฑด Y
  • router๋ฅผ ์„ค์ •ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ „์— commit์„ ํ†ตํ•ด ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ์œ ๋„ํ•˜๋Š” ๊ฒƒ

History mode vs Hash mode

  1. SPA

๋‹จ์ผ ํŽ˜์ด์ง€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋Š” ๊ฒƒ์€ ๋ง ๊ทธ๋Œ€๋กœ ์‘๋‹ต ๋ฐ›์€ ํ•˜๋‚˜์˜ htmlํŒŒ์ผ์—์„œ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  JavaScript๋ฅผ ํ™œ์šฉํ•ด ๋‚ด์šฉ๋งŒ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด ๋•Œ ์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์€ ์‹ค์ œ ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‚ด์šฉ(์ปดํฌ๋„Œใ…Œ)๋งŒ ๋ณ€๊ฒฝ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

  • ์ฃผ์†Œ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฉด ๋˜์ง€ ์•Š์•„? โ†’ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์ฃผ์†Œ๊ฐ€ ์ด๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์–ด์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • HTML ๋‚ด์šฉ์€ ๋ณ€ํ™”ํ•˜์ง€๋งŒ ๊ฐ™์€ ํŽ˜์ด์ง€์— ๋จธ๋ฌด๋Š” ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ URI์˜ ๋ณ€ํ™”๋ฅผ ํ†ตํ•ด ๋งˆ์น˜ ๋ฐ”๋€Œ๋Š” ํ™”๋ฉด์— ๋งž์ถฐ ํŽ˜์ด์ง€๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋งŒ๋“ฆ.
์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด Hash์™€ History 2๊ฐ€์ง€์ด๋‹ค.


  1. Hash (#) ๋ชจ๋“œ
  • ํŠน์ •ํ•œ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  Enter๋ฅผ ์น˜๋Š” ํ–‰์œ„๋Š” Server์—๊ฒŒ ์š”์ฒญ(GET)์„ ๋ณด๋‚ด๋Š” ํ–‰์œ„์ด๋‹ค.
  • ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฑด endpoint๋กœ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๊ณ  ๊ทธ์— ๋งž๋Š” HTML์„ ๋ฐ›์•„์•ผํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋ฒ„์—์„œ URL์„ ๋งŒ๋“ค์–ด ๋†“์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. ์ฆ‰ ,Server๊ฐ€ URL์„ ๋งŒ๋“œ๋Š” ์ฃผ์ฒด๊ฐ€ ๋œ๋‹ค.
  • Hash ๋ชจ๋“œ๋Š” ํ”„๋ ˆ๊ทธ๋จผํŠธ(#) ๋’ค์— ์˜ค๋Š” ๋ฌธ์ž์—ด์€ ๊ฒฝ๋กœ๋กœ ์ธ์‹ํ•˜์ง€ ์•Š๋Š” ํŠน์ง•์„ ํ™œ์šฉํ•ด ๋งˆ์น˜ URL์ด ๋ณ€ํ™”ํ•˜์ง€๋งŒ ์‹ค์ œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›์ง€ ์•Š๋Š” ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ
  • ํ•˜์ง€๋งŒ # ์ด ์ฃผ์†Œ ์•ˆ์— ํฌํ•จ๋œ ๊ฑด ์‚ฌ์šฉ์ž์—๊ฒŒ ์–ด์ƒ‰ํ•จ์„ ์ค„ ์ˆ˜ ์žˆ์–ด ์ตœ๊ทผ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

  1. History ๋ชจ๋“œ
  • HTML5 ์ŠคํŽ™์ค‘ ํ•˜๋‚˜์ธ history API๋ฅผ ์‚ฌ์šฉํ•ด์„œ router๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.
  • History API์˜ pushState ๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด API๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ํžˆ์Šคํ† ๋ฆฌ๋Š” ๋‚จ๊ธฐ์ง€๋งŒ ์‹ค์ œ ํŽ˜์ด์ง€๋Š” ์ด๋™ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค!
profile
๊ธฐ๋กํ•˜๋Š” ์Šต๊ด€์€ ์‰ฝ๊ฒŒ ๋ฌด๋„ˆ์ง€์ง€ ์•Š์•„์š”.

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