Today I Learned ... Vue.js
🙋♂️ Reference Book
DAY 01 - 220528
- Vue.js 란?
- 개발환경 구성
- Vue CLI로 프로젝트 생성
- Vue-router (라우팅)
Vetur
.vue
에 한해서 Syntax Highlighting 지원.❗️ Vue CLI 란?
- 자동으로 프로젝트를 생성해줌.
- react의 CRA와 유사함.
- 단, 여러 옵션으로 생성 가능 + UI도 있어 편리함.
$ npm install -g @vue/cli
$ vue create vue-project
파일명이 vue-project인 프로젝트 생성함.
후에 몇가지 질문을 하는데, y / Default(Vue3) 순으로 선택한 후 엔터를 누른다.
🛠 manually select시
- ESLint + Standard Config
- Lint on save (저장시점에 Lint 적용)
- Babel / Router / Vuex / Linter, Formatter 선택
$ cd vue-project
$ yarn serve
yarn serve -- --port 3000
과 같이 입력하면 됨.├── public
└── src
├── assets
└── components
한 컴포넌트에 HTML / JS / CSS 가 포함되어 있다.
html | js | css |
---|---|---|
<template> | <script> | <style> |
$ vue ui
localhost:8000 이 열리면서 프로젝트 매니저가 실행됨.
SPA 에서는 페이지를 이동할 때 마다 서버에 요청(X) / 미리 갖고있던 페이지를 라우팅하여 화면 갱신(O)
url 주소에 따라 페이지가 전환됨.
$ vue add router
-> vue-router
가 설치된다.
yarn serve
를 해보면 vue-router의 사용 예시가 자동으로 추가되어있다.
<template>
<nav>
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
</nav>
<router-view/>
</template>
...
router-link 라는 element가 있고, to
라는 props 안에 path가 들어있다.
개발자도구를 보면, router-link
는 anchor 태그이다.
-> 마치 react-router-dom의 Link
.router-link-exact-active
라는 클래스가 자동으로 부여된다.router 디렉터리의 index.js를 살펴보자.
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'
const routes = [
{
path: '/',
name: 'home',
component: HomeView
},
{
path: '/about',
name: 'about',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
}
]
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes
})
export default router
vue-router
의 createRouter로 라우터를 생성한다.
router 객체는 history
와 route
값을 갖는다.
-> routes는 객체로 이루어잔 배열이다. (각 route를 객체로 나타낸 배열)
-> History는 createWebHistory로 생성한다.
각 route는 path, name, component 필드를 갖는다. (필수)
(name : 식별자 역할 / component : 해당 path에 렌더링할 컴포넌트명)
{
path: '/about',
name: 'about',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
}
-> /* webpackChunkName: "about" */
라는 주석 사용시
라우트 레벨에서 코드스플리팅을 하고 별도의 chunk 파일을 만들어 리소스를 로드함.
🙋♂️ 차이점
청크파일 O - 해당 url에 접근하기 전까지는 vue 파일 임포트 X
청크파일 X - 해당 path에 접근하지 않더라도 이미 vue 파일을 임포트.
= 비동기 컴포넌트.
prefetch
기능이 사용됨.-> [결론] 초기 렌더링은 오히려 prefetch를 사용하지 말자.
정말 필요한 컴포넌트에 대해서만 적용하자. (첫 화면 제외한 컴포넌트에서 리소스가 매우 큰 경우)
Vue.config.js
파일 생성하기.
module.exports = {
chainWebpack: (config) => {
config.plugins.delete('prefetch');
},
};
import(/* webpackPrefetch: true */ './views/About.vue');
사용자의 접속 빈도가 낮은 컴포넌트 (+용량 큰경우) - prefetch
- 사용자 접속 시점에 리소스 다운받음.
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
createApp(App).use(router).mount('#app')
createApp(App)
은 -> App.vue를 인스턴스화 하는 것..use(router)
: 라우터 사용 (router은 history, routes 존재).mount('#app
) : index.html의 #app에 마운트시킴.