본문 바로가기
Dev/Vue.js

[Vue.js] Today I Learned - 라우터 & 컴포넌트 설계

by dev_jsk 2020. 10. 26.
728x90
반응형

뷰 라우터 설치 및 연결

뷰 라우터 설치

npm i vue-router

뷰 라우터 연결

1. src/routes/index.js에 VueRouter 생성

import Vue from 'vue';
import VueRouter from 'vue-router';
// VueRouter 사용
Vue.use(VueRouter);
// VueRouter 인스턴스 생성 및 export
export default new VueRouter();

2. src/main.js에 VueRouter 모듈 등록

import Vue from 'vue';
import App from './App.vue';
// VueRouter import
import router from '@/routes/index';
Vue.config.productionTip = false;
new Vue({
render: h => h(App),
// VueRouter 연결
router,
}).$mount('#app');

페이지 컴포넌트 생성 및 연결

컴포넌트 생성

1. src/viewsLoginPage.vue, SignupPage.vue 생성

<!-- LoginPage -->
<template>
<div>login</div>
</template>
<script>
export default {};
</script>
<style></style>
<!-- SignupPage -->
<template>
<div>
signup
</div>
</template>
<script>
export default {};
</script>
<style></style>

컴포넌트 연결

1. src/routes/index.js에 페이지 컴포넌트 등록

import Vue from 'vue';
import VueRouter from 'vue-router';
// 컴포넌트 import
import LoginPage from '@/views/LoginPage.vue';
import SignupPage from '@/views/SignupPage.vue';
Vue.use(VueRouter);
export default new VueRouter({
// routes속성 이용하여 경로와 컴포넌트 등록
routes: [
{
path: '/login',
component: LoginPage,
},
{
path: '/signup',
component: SignupPage,
},
],
});

라우팅 동작 확인

1. src/App.vue<router-link>, <router-view> 사용

<template>
<div>
<header>
<!-- to: 이동할 페이지 경로 지정 -->
<router-link to="/login">로그인</router-link> |
<router-link to="/signup">회원가입</router-link>
</header>
<!-- router-view: router-link를 통해 이동한 페이지를 보여주는 영역 -->
<router-view></router-view>
</div>
</template>
<script>
export default {};
</script>
<style></style>

2. 동작 확인

코드 스플리팅 소개 및 적용

코드 스플리팅 소개

코드 스플리팅은 싱글 페이지 애플리케이션의 성능을 향상시키는 방법이다. 싱글 페이지 애플리케이션은 초기 실행 시 필요한 웹 자원을 모두 다운 받는 특징이 있는데 코드 스플리팅을 활용하게 되면 초기 로딩시에 모든 웹 자원을 다운받지 않고 필요한 시점에 다운받아 성능을 향상시킬 수 있다.

코드 스플리팅 적용

1. src/routes/index.js에 코드 스플리팅 적용

import Vue from 'vue';
import VueRouter from 'vue-router';
// import LoginPage from '@/views/LoginPage.vue';
// import SignupPage from '@/views/SignupPage.vue';
Vue.use(VueRouter);
export default new VueRouter({
routes: [
{
path: '/login',
// dynamic import를 이용하여 해당 경로로 접근시 웹 자원을 다운 및 사용
component: () => import('@/views/LoginPage.vue'),
},
{
path: '/signup',
component: () => import('@/views/SignupPage.vue'),
},
],
});

초기 진입 페이지 설정

리다이렉트 소개

특정 URL로 접근 시 지정된 URL로 이동하게 하는 것

리다이렉트 설정

1. src/routes/index.js에 리다이렉트 설정

import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter);
export default new VueRouter({
routes: [
{
// '/' 요청시 '/login'으로 전환
path: '/',
redirect: '/login',
},
{
path: '/login',
component: () => import('@/views/LoginPage.vue'),
},
{
path: '/signup',
component: () => import('@/views/SignupPage.vue'),
},
],
});

없는 페이지 접근 시 라우터 처리

없는 페이지 접근 시 처리 방법

뷰 라우터에 등록되지 않은 path를 통해 접근할 때 오류를 알려주는 컴포넌트를 표시하도록 등록된 경로 이외에 모든 경로를 지칭하는 *를 사용하여 오류 컴포넌트를 등록한다.

 

방법

1. src/routes/index.js에 오류 컴포넌트 등록

import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter);
export default new VueRouter({
routes: [
{
path: '/',
redirect: '/login',
},
{
path: '/login',
component: () => import('@/views/LoginPage.vue'),
},
{
path: '/signup',
component: () => import('@/views/SignupPage.vue'),
},
{
// 위에 등록된 path이외의 모든 path
path: '*',
component: () => import('@/views/NotFoundPage.vue'),
},
],
});

2. src/views/NotFoundPage.vue 생성

<template>
<div>
Page is not found
</div>
</template>
<script>
export default {};
</script>
<style></style>

3. 동작 확인

Mode: History 설정

History 모드 사용 시

URL 중간에 있는 #(해시)을 제거해준다.

History 모드 사용 시 단점 (참고)

URL에 #(해시)가 존재하지 않기 때문에 서버가 해당 정보가 있는지 없는지 알지 못한다. 그렇기 때문에 배포시에 각 서버에 맞게 포괄적인 대체 경로를 추가 설정을 해야 한다. (참고)

History 모드 설정

1. src/routes/index.js에 history 모드 설정

import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter);
export default new VueRouter({
// history 모드 설정
mode: 'history',
routes: [
{
path: '/',
redirect: '/login',
},
{
path: '/login',
component: () => import('@/views/LoginPage.vue'),
},
{
path: '/signup',
component: () => import('@/views/SignupPage.vue'),
},
{
path: '*',
component: () => import('@/views/NotFoundPage.vue'),
},
],
});

2. 동작 확인

 

728x90
반응형

댓글