
재사용 가능한 코드 블록


SFC
컴포넌트의 템플릿(HTML), 로직(JS) 및 스타일(CSS)을 하나의 파일로 묶어낸 특수한 파일 형식 (*.vue 파일)
<template>
<div>
<p class="greeting">{{ msg }}</p>
</div>
</template>
<script setup>
import { ref } from 'vue'
const msg = ref('Hello')
</script>
<style scoped>
.greeting {
color: crimson;
}
</style>
-> 언어 블록의 작성 순서는 상관 없으나 일반적으로 template -> script -> style 순서로 작성
-> 변수 및 함수는 동일한 컴포넌트의 템플릿에서 자동으로 사용 가능

프론트 엔드 개발 도구
-> 빠른 개발 환경을 위한 빌드 도구와 개발 서버를 제공
-> Vite는 이러한 빌드 프로세스를 수행하는 데 사용되는 도구
vite 프로젝트 생성
$ npm create vue@latest
프로젝트 설정 관련 절차 진행

프로젝트 폴더 이동
$cd vue-project
패키지 설지
$npm install

Vue 프로젝트 서버 실행
$npm run dev

Vue 프로젝트 실행 결과


NPM
Node.js의 기본 패키지 관리자

Chrome의 V8 JavaScript 엔진을 기반으로 하는 Server-Side 실행 환경
기존에 브라우저 안에서만 동작할 수 있었던 JavaScript를
브라우저가 아닌 서버 측에서도 실행할 수 있게 함
-> 프론트엔드와 백엔드에서 동일한 언어로 개발할 수 있게 됨
NPM을 활용해 수많은 오픈 소스 패키지와 라이브러리를 제공하여
개발자들이 손쉽게 코드를 공유하고 재사용할 수 있게 함
프로그램을 구성하는 독립적인 코드 블록(*.js 파일)
-> *.js 파일 하나가 하나의 모듈
여러 모듈과 파일을 하나(혹은 여러 개)의 번들로 묶어 최적화하여
애플리케이션에서 사용할 수 있게 만들어주는 도구
->[참고] Vite는 Rollup이라는 Bundler를 사용하며 개발자가 별도로 기타 환경설정에 신경 쓰지 않도록 모두 설정해두고 있음



-> package-lock.json과 함께 프로젝트의 의존성을 관리하고, 버전 충돌 및 일관성을 유지하는 역할







<template>
<div>
<h1>App.vue</h1>
<MyComponent />
</div>
</template>
<script setup>
</script>
<template>
<div>
<h2>MyComponent</h2>
</div>
</template>
<script setup>
</script>
<template>
<div>
<h1>App.vue</h1>
<MyComponent />
</div>
</template>
<script setup>
// import MyComponent from './components/MyComponent.vue'
import MyComponent from '@/components/MyComponent.vue'
</script>
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

-> Vue의 ref()와 Lifecycle Hooks 함수를 사용해 간접적으로 접근하여 조작할 것
<template>
<input ref="input">
</template>
<script setup>
import { ref, onMounted } from 'vue'
// 변수명은 템플릿 ref 값과 일치해야 함
const input = ref(null)
onMounted(() => {
console.log(input.value) // <input>
})
</script>
Composition API
Option API
<template>
<button @click="increment">{{ count }}</button>
</template>
<script setup>
import { ref, onMounted } from 'vue'
const input = ref(0)
function increment() {
count.value++
}
onMounted(() => {
console.log(`숫자 세기의 초기값은 ${ count.value }`)
})
</script>
<template>
<button @click="increment">{{ count }}</button>
</template>
<script setup>
export default {
data() {
return {
count: 0
}
},
method: {
increment() {
this.count++
}
},
mounted() {
console.log(`숫자 세기의 초기값은 ${ this.count }`
}
}
</script>
<template>
<button @click="increment">{{ count }}</button>
</template>
<script setup>
import { ref, onMounted } from 'vue'
const input = ref(0)
function increment() {
count.value++
}
onMounted(() => {
console.log(`숫자 세기의 초기값은 ${ count.value }`)
})
</script>
<template>
<button @click="increment">{{ count }}</button>
</template>
<script setup>
export default {
data() {
return {
count: 0
}
},
method: {
increment() {
this.count++
}
},
mounted() {
console.log(`숫자 세기의 초기값은 ${ this.count }`
}
}
</script>
from
<!-- bad -->
<template>
<h2>Heading</h2>
<p>Paragraph</p>
<p>Paragraph</p>
</template>
to
<!-- good -->
<template>
<div>
<h2>Heading</h2>
<p>Paragraph</p>
<p>Paragraph</p>
</div>
</template>
<style scoped></style>
-> 이는 부모가 레이아웃 목적으로 자식 목적으로 자식 컴포넌트 최상위 요소의 스타일을 지정할 수 있도록 의도적으로 설계된 것
<!-- App.vue -->
<template>
<h1>App.vue</h1>
<MyComponent />
</template>
<style scoped>
div {
color: red;
}
</style>
<!-- MyComponent.vue -->
<template>
<div>
<h2>MyComponent</h2>
</div>
</template>

-> 프론트엔드 앱의 사용 목적이 점점 더 복잡해짐에 따라, 단순 파일 유형으로만 분리하게 될 경우 프로젝트의 목표를 달성 하는데 도움이 되지 않게 됨
