[Vue] 3. vue-cli를 이용한 프로젝트 생성
vue-cli를 이용해서 우선 쉽게 만들고 어떻게 생겼는지 확인해보자
6. vue-cli를 이용한 프로젝트 생성
Vue에서는 React, Angular처럼 기본적으로 프레임워크를 생성해주는 vue-cli이 있다. vue-cli를 통해 빠르게 프로젝트를 생성해보겠습니다.
6-1. vue-cli이란?
vue-cli에서는 여러가지 템플릿을 지원해주고 있는데
이 포스팅에서는 webpack으로 진행하겠습니다.
우선은 node.js를 설치를 하면 npm도 설치되어있는 상태이기 때문에 cmd창에서 아래와 같이 입력해보자.
vue-cli를 이용한 프로젝트 생성/실행
//1. vue-cli 전역 설치
npm install -g vue-cli
//2. webpack 템플릿을 이용한 my-project명 프로젝트 생성
vue init webpack my-project
//3. my-project 이동
cd my-project
//4. project 실행 명령
npm run dev
- 설치 중 물어보는데 엔터치고, Yes 하면서 설치 진행
- npm run dev 입력 시 빌드가 되면서 서버가 실행
- 아래와 같이 메시지가 뜨면 http://localhost:8080에 접속
Your application is running here: http://localhost:8080
6-2. vue-cli로 생성된 프로젝트 구조와 파일
my-project 구조와 파일을 보면 여러 파일들이 있는데 우선 가볍게 보면
my-project 구조
biild // webpack 빌드 관련 설정파일 관리하는 폴더
config // 프로젝트에서 사용되는 설정파일 관리하는 폴더
node_modules // npm으로 설치된 의존성 라이브러리들을 관리한는 폴더
src
└─ assets // css/js 등을 관리하는 폴더
└─ components // Vue컴포넌트들을 관리하는 폴더
└─ router // vue-router 설정을 하는 폴더
└─ App.vue // App을 설정하는 컴포넌트
└─ main.js // 가장 먼저 실행되는 js파일
index.html
package.json
package.json (일부분)
npm은 프로젝트에 대한 설정을 package.json에서 관리하고 이 파일에 JSON형식으로 작성해서 프로젝트에 대한 설정 및 의존성 관리를 함. (maven에 pom.xml처럼 의존성 모듈을 관리하는 개념)
"dependencies": {
"vue": "^2.5.2",
"vue-router": "^3.0.1"
},
index.html
index.html 파일하나에서 .vue/.js로 만든 각 컴포넌트들을 이벤트에 따라 id=”app”에 렌더링/바인딩 하면서 SPA개념이 구현된다.
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>my-project</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
src/main.js
export된 모듈들을 import해서 Vue 인스턴스 생성과 마운팅
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
Vue.config.productionTip = false
// Vue인스턴스 생성
new Vue({
el: '#app', // id가 app인 div태그에 Vue 컴포넌트 마운팅
router, // vue-router
components: { App }, // App 컴포넌트
template: '<App/>' // App 템플릿
})
src/App.vue
vue-router를 통한 컴포넌트를 마운팅
<template>
<div id="app">
<img src="./assets/logo.png">
// vue-router로 컴포넌트 노출영역
<router-view/>
</div>
</template>
<script>
export default {
name: 'App'
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
router/index.js
vue-router를 통해 각 정의된 컴포넌트를 라우트에 매핑한 후에 해당 주소에 따라 화면에 렌더링
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component: HelloWorld
}
]
})
components/HelloWorld.vue
실제로 하나의 모듈 개념인 컴포넌트 생성
<template>
<div class="hello">
<h1>{ { msg } }</h1>
<h2>Essential Links</h2>
<ul>
<li><a href="https://vuejs.org" target="_blank">Core Docs</a></li>
<li><a href="https://forum.vuejs.org" target="_blank">Forum</a></li>
<li><a href="https://chat.vuejs.org" target="_blank">Community Chat</a></li>
<li><a href="https://twitter.com/vuejs" target="_blank">Twitter</a></li>
<br>
<li><a href="http://vuejs-templates.github.io/webpack/" target="_blank">Docs for This Template</a></li>
</ul>
<h2>Ecosystem</h2>
<ul>
<li><a href="http://router.vuejs.org/" target="_blank">vue-router</a></li>
<li><a href="http://vuex.vuejs.org/" target="_blank">vuex</a></li>
<li><a href="http://vue-loader.vuejs.org/" target="_blank">vue-loader</a></li>
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank">awesome-vue</a></li>
</ul>
</div>
</template>
<script>
// 컴포넌트 내용 정의
export default {
// 해당 Vue파일을 HelloWorld 라는 컴포넌트 이름
name: 'HelloWorld',
// data 바인딩
data () {
return {
// template안에 msg에 data 바인딩
msg: 'Welcome to Your Vue.js App'
}
}
}
</script>
<!-- 각 컴포넌트 마다 따로 css를 설정할 수 있다. -->
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h1, h2 {
font-weight: normal;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>
참고