ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Vue Lazy load 적용하기
    개발/Front-end 2021. 8. 24. 20:45
    728x90

     

     이번 시간에는 Vue Router 설정 중 Lazy Loading Routes를 사용하는 실습을 진행하겠습니다. 해당 실습은 vuejs 가이드 문서를 참고해서 만들었습니다.

    만약 Lazy Load에 대한 개념이 어렵다면 이전 게시물인 Vue Lazy Load(비동기 컴포넌트)란? 에 대한 포스팅을 읽고 오시는 것을 추천합니다.

    1. Vue 기본 CLI 세팅

    1-1. Vue CLI 설치

    아래는 vue cli를 설치하는 명령어입니다.

    $ npm install -g @vue/cli

     

     

    1-2. Default 옵션으로 프로젝트 설치하기

    해당 옵션으로 프로젝트를 생성하는 경우 기본적으로 설정된 값으로 설치가 됩니다.

    1-2-1. vue 프로젝트 생성

    vue create [프로젝트 명] 명령어를 실행합니다. 여기서 프로젝트 명은 'vue-lazy-load '입니다.

    $ vue create vue-lazy-load

    아래 그림과 같이 Default (Vue 3) 옵션을 선택해 줍니다.

    https://blog.kakaocdn.net/dn/bbNtFl/btrbPcofo3l/VY2GfqmHmnNAzNy2DnUyMk/img.png

    1-2-2. vue router 설치

    아래 명령어로 vue 라우터 플러그인을 설치해 줍니다.

    $ cd vue-lazy-load
    $ vue add router

    history mode는 URL의 해쉬 값 제거 속성으로 사용 여부 y(사용)를 사용하는 경우 url 경로가 #이 아닌 / 로 변경됩니다.

    1-2-3. vue 프로젝트 실행

    해당 프로젝트로 이동 후, npm run serve 명령어로 프로젝트를 실행해 줍니다.

    $ npm run serve

    http://localhost:8080/ 에 접속을 하여 아래 그림과 같이 웹 사이트 결과를 확인해줍니다.


    2. lazy-loaded 사용 안 하는 경우 

    /src/router/index.js 파일에 아래와 같이 작성합니다. about 부분을 아래와 같이 변경합니다.

    import { createRouter, createWebHistory } from 'vue-router'
    import Home from '../views/Home.vue'
    import About from '../views/About.vue'
    
    const routes = [
      {
        path: '/',
        name: 'Home',
        component: Home
      },
      {
        path: '/about',
        name: 'About',
        component: About
      },
    
    ]
    
    const router = createRouter({
      history: createWebHistory(process.env.BASE_URL),
      routes
    })
    
    export default router

    오른쪽 마우스 검사 - network를 통해보면 About 페이지를 이동해도 app.js만 보이고 있습니다.

    이는 SPA(싱글 페이지 애플리케이션)이 적용된 것을 확인할 수 있습니다.


    3. lazy-loaded 사용한 경우 

    /src/router/index.js 파일에 아래와 같이 작성합니다. about 부분을 아래와 같이 변경합니다.

    import { createRouter, createWebHistory } from 'vue-router'
    import Home from '../views/Home.vue'
    
    const routes = [
      {
        path: '/',
        name: 'Home',
        component: Home
      },
      {
        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/About.vue')
      }

    아래 사진을 보면 Home 메뉴에서는 app.js를 요청하고, About 메뉴 클릭 시, about.js를 요청합니다. lazy-load가 적용되었습니다. 


    4. 동일한 Chunk로 컴포넌트 그룹핑하기

    동일한 라우트에 사용되는 모든 컴포넌트를 하나의 비동기 Chunk로 묶을 수 있습니다. 이를 위해 특별한 주석 문법을 사용하고, Chunk 이름만 주석에 제공해 주면 됩니다. 특별한 주석은 예를 들면 /* webpackChunkName: "num" */ 를 의미합니다.

    4-1. vue-lazy-load/src/App.vue 수정

    여러 메뉴를 생성해줍니다.

    <template>
      <div id="nav">
        <router-link to="/">Home</router-link> |
        <router-link to="/about">About</router-link> |
        <router-link to="/one">One</router-link> |
        <router-link to="/two">Two</router-link> |
        <router-link to="/three">Three</router-link>
      </div>
      <router-view/>
    </template>
    
    <style>
    #app {
      font-family: Avenir, Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
    }
    
    #nav {
      padding: 30px;
    }
    
    #nav a {
      font-weight: bold;
      color: #2c3e50;
    }
    
    #nav a.router-link-exact-active {
      color: #42b983;
    }
    </style>

    4-2. views 폴더에 컴포넌트 생성

    • One.vue
    <template>
      <div class="one">
        <h1>This is an one page</h1>
      </div>
    </template>
    • Two.vue
    <template>
      <div class="two">
        <h1>This is an two page</h1>
      </div>
    </template>
    • Three.vue
    <template>
      <div class="three">
        <h1>This is an three page</h1>
      </div>
    </template>

    4-3. /src/router/index.js 파일 수정

    one, two, three를 라우터에 추가해줍니다. 해당 라우터는 특별한 주석을 /* webpackChunkName: "num" */ 로 동일하게 하여 그룹핑해 줍니다.

    import { createRouter, createWebHistory } from 'vue-router'
    import Home from '../views/Home.vue'
    
    const routes = [
      {
        path: '/',
        name: 'Home',
        component: Home
      },
      {
        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/About.vue')
      },
      {
        path: '/one',
        name: 'One',
        component: () => import(/* webpackChunkName: "num" */ '../views/One.vue')
      },
      {
        path: '/two',
        name: 'Two',
        component: () => import(/* webpackChunkName: "num" */ '../views/Two.vue')
      },
      {
        path: '/three',
        name: 'Three',
        component: () => import(/* webpackChunkName: "num" */ '../views/Three.vue')
      }
    
    ]
    
    const router = createRouter({
      history: createWebHistory(process.env.BASE_URL),
      routes
    })
    
    export default router

    4-4. 결과

    아래와 같이 Home 메뉴는 app.js 호출하고, About 메뉴 클릭 시 about.js 호출합니다. 여기서 자세히 봐야 할 부분은 그룹핑된 One, Two, Three 메뉴입니다. 이는 One에서 num.js 호출하고 그 뒤로는 호출하지 않는 것을 확인할 수 있습니다.

     

    이번 시간에는 Vue Lazy load 사용 안 한 경우, Vue Lazy load 사용한 경우를 비교하고 동일한 chunk로 컴포넌트 그룹핑을 해보았습니다.

     

    '개발 > Front-end' 카테고리의 다른 글

    Vue 컴포넌트 Basic  (0) 2021.08.24
    Vue Lazy Load(비동기 컴포넌트)란?  (0) 2021.08.24
    Vue Router  (0) 2021.08.24
    2. Vue CLI로 Vue 프로젝트 생성하기  (1) 2021.08.11
    Vue.js 는 무엇인가?  (0) 2021.08.09

    댓글

Designed by Tistory.