라우팅이란?
- 클라이언트에서 url 주소에 따라 페이지가 전환 되는것
- Vue 프로젝트 내부에서 미리 url 주소를 정의하고, 각 주소마다 Vue 페이지를 연결해놓음
Vue-Rounter 설치
- vue 에서 제공하는 공식 플러그인 vue-router를 이용해 라우팅을 쉽게 구현 가능
kalva@RT-PC:~/vue-project$ vue add router
WARN There are uncommitted changes in the current repository, it's recommended to commit or stash them first.
? Still proceed? Yes
- @vue/cli-plugin-router 가 설치됨
- src 폴더에 router, views 폴더와 파일이 생성됨
App.vue 파일
kalva@RT-PC:~/vue-project$ cat src/App.vue
<template>
<nav>
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
</nav>
<router-view/>
</template>
...
router/index.js 파일
kalva@RT-PC:~/vue-project$ cat src/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
- routes 배열에 2개의 라우트가 등록되어 있다.
- Home 컴포넌트
- About 컴포넌트
{
path: '/',
name: 'home',
component: HomeView
},
- path : 브라우저에서 접속하는 url 주소
- component : 지정된 path 로 접속했을때 보여줄 vue 컴포넌트
- component: HomeView => import HomeView from '../views/HomeView.vue'
{
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')
}
- // route level code-splitting
- 라우트 레벨에서 코드를 분할하는 방법
- // this generates a separate chunk (about.[hash].js) for this route
- 이 라우트에 대한 chunk 파일이 분리되어 생성됨
- // which is lazy-loaded when the route is visited.
- 이 라우트에 방문했을때 lazy-load(자연 로드) 됨
- component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
- 라우트 레벨에서 코드를 분할한 후 별도의 chunk 파일을 생성하고, 이 라우트를 방문했을때 리소스를 로드함, 컴포넌트 import 시 /* webpackChunkName: "about" */ 라는 주석으로 chunk 파일 이름을 정의해서 chunk 파일은 about 이라는 이름으로 생성된다.
- 두가지 방식의 차이
- 첫번째 : 사용자가 해당 path에 접근하지 않더라도 이미 vue 파일을 import
- 두번째 : path에 접근해야 vue 파일을 import
Lazy Load 적용
Lazy Load
- 리소스를 컴포넌트 단위로 분리하여 컴포넌트, 라우터 단위로 필요한 것들만 다운 받을 수 있게 하는 방법
Vue 에서 Lazy Load 사용시 주의사항
- Vue CLI3 부터 prefetch 기능 추가됨
- prefetch 기능
- 미래에 사용될수 있는 리소스를 캐시에 저장해서 사용자 접속시 빠르게 리소스 제공
- 비동기 컴포넌트로 정의된 모든 리소스를 캐시에 담아두는 비용 발생
- 분리된 chunk 파일 각각에 대한 request 가 발생, 각각의 파일을 다운로드 받아서 캐시에 저장함
- prefetch 기능은 랜더링 시간을 줄여주는데, 잘못 사용시 랜더링 시간이 늘어남
- Vue CLI 에서 prefetch 기능은 기본값으로 true 설정, Lazy Load가 적용된 컴포넌트는 모두 prefetch 기능이 적용되어 캐시에 저장됨
- prefetch 기능 사용시
- request 요청수 증가됨, 비동기 컴포넌트로 정의돈 모든 리소스를 캐시에 담기위해 Request 요청 수가 많아짐
- 애플리케이션의 첫화면 접속시 랜더링 속도가 느려질 수 있음
- 첫 화면에서 사용되는 리소스를 가장 나중에 다운받음, 다른 화면에 대한 리소스를 모두 내려받고 나서야 첫 화면에서 사용되는 리소스를 내려 받음
- prefetch 기능 미사용시
- 요청 수 prefetch 사용시보다 줄어듬
- 라우터가 이동될 때마다 해당 라우터에서 필요한 리소스를 가져옴
- 한번 가져온 리소스는 다시 요청하지 않음
- 초기 랜더링은 prefetch 미사용시 더 빠르게 로딩됨
- prefetch 기능은 다른 화면에서 사용될 리소스를 미리 내려 받아서, 애플리케이션에서 화면 전환시 빠른 성능을 가져온다는 장점을 이용하기 위해서 사용함
- 필요한 컴포넌트에 대해서 prefetch 기능 적용 권장
- 라우터를 통해 이동되는 컴포넌트에서 사용되는 리소스가 크지 않을 경우 prefetch 기능을 사용하지 않더라도 사용자 접속 시점에 다운받도 충분히 매끄럽게 동작함
prefetch 기능을 끄는 방법
- Vue.config.js 파일을 생성하고 다음 코드 추가
vi vue-project/vue.config.js
module.exports={
chainWebpack: config=>{
config.plugins.delete('prefetch'); //prefetch 삭제
}
};
※ vue 가 업데이트 되면서 기본 값이 prefetch를 사용하지 않는것으로 변경됨
prefetch를 사용하고 싶은 경우
- 라우터에 webpachPrefetch:true를 넣어준다.
component: () => import(/* webpackChunkName: "about"*/ /* webpackPrefetch: true */ '../views/AboutView.vue')
routes/index.js, main.js 파일
- routes/index.js 의 첫 번째 줄에는 라우팅을 처리하기 위해 vue-router를 import 한다.
# routes/index.js
import { createRouter, createWebHistory } from 'vue-router'
- 이렇게 정의된 router 는 main.js 에 등록해서 사용함
# main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
createApp(App).use(router).mount('#app')
- import router from './router' 를 통해 router/index.js 파일이 import 됨
- createApp(App).use(router).mount('#app')
- createApp(App) 최상위 컴포넌트인 App.vue 로 app를 생성하고, use(router) 코드를 추가하여 App.vue에서 router가 사용될 수 있도록 추가하고 App.vue 를 public 폴더의 index.html 에 정의되어 있는 id="app"인 htmlelement 에 마운트시킴
컴포넌트
- 조합하여 화면을 구성할 수 있는 블록
'Dev' 카테고리의 다른 글
Vue 컨포넌트 - 데이터 바인딩 (2) (0) | 2023.07.01 |
---|---|
Vue 컨포넌트 - 데이터 바인딩 (1) (0) | 2023.06.27 |
Vue 컴포넌트 (0) | 2023.06.26 |
Vue CLI 설치, 프로젝트 생성 (0) | 2023.06.25 |
# 윈도우 11 WSL2 설치 (0) | 2023.06.18 |