제 1장 나만의 Vue.js 라우터 만들기

업데이트: Link

1. 나만의 Vue.js 라우터 만들기

나만의 라우터 만들기 시리즈 의 4부 중 1부
알렉스 조버 모랄레스씀

아마도 당신은 프론트엔드 세계에서 한동안 라우터를 사용해 왔을 것입니다. 하지만… 직접 라우터를 작성한 적이 있습니까? 라우터의 기초를 아십니까? 그냥 작동하는 것처럼 보일 수 있지만 내부적으로 라우터는 여러 가지를 처리해야 합니다.

라우터는 라우팅을 담당하는 구성 요소입니다. 라우팅은 여러 목적지로 가는 길을 찾는 작업으로 정의할 수 있습니다. 이것은 다른 영역에 적용됩니다.

예를 들어 엘리베이터의 라우터는 숫자 5가 있는 버튼을 누르면 5층으로 이동합니다.

웹 개발에서 라우팅의 두 가지 주요 영역을 볼 수 있습니다.

  • 백엔드: 라우터가 URL 패턴과 일치하는 올바른 컨트롤러를 호출합니다.
  • 프런트 엔드: 라우터는 URL 패턴과 일치하는 해당 구성 요소를 뷰에 로드합니다.

이 시리즈에서는 라우터의 메커니즘을 이해하기 위해 Vue.js를 사용하여 자체 프론트 엔드 라우터를 만드는 방법을 살펴보겠습니다.

기본 라우터 구성 요소 만들기

먼저 경로에 사용할 구성 요소 Home 및 Articles 를 생성해 보겠습니다. 내용은 중요하지 않습니다. 해당 경로에서 무언가를 보여주기 위한 것일 뿐이므로 다음과 같은 것으로 충분합니다.

<!-- Home.vue -->
<template>
  <div>Home</div>
</template>

<!-- Articles.vue -->
<template>
  <div>Articles</div>
</template>

Vue.js는 컴포넌트 기반 프레임워크이므로 라우터를 만드는 간단한 방법은 컴포넌트를 사용하는 것입니다. 구성 요소 기반 도구에 대해 작업한 모든 프론트 엔드 개발자가 이해할 수 있기 때문에 그렇게 하는 것이 더 보편적입니다.

경로 정의

앱 라우터 를 만드는 것부터 시작하겠습니다. 라우터 구성 요소 자체가 될 vue 파일과 경로 정의:

<!-- Router.vue -->
<script>
import HomePage from "./HomePage";
import ArticlesPage from "./ArticlesPage";

const routes = {
  "/": HomePage,
  "/articles": ArticlesPage
};
</script>

저는 HomePage* 및 *ArticlesPage 구성 요소를 모두 가져오고 route 개체를 생성합니다. 이 개체는 키는 경로이고 값은 구성 요소 자체입니다. 이 방법으로 경로에 액세스하는 것은 간단하고 빠릅니다. 왜냐하면 단순히 route["/"]를 수행하여 객체 속성에 액세스하는 직접적인 작업이기 때문입니다.

더 많은 사용자 정의가 필요한 경우 이를 정의하는 다른 방법은 개체를 값으로 사용하는 것입니다.

const routes = {
  "/": {
    component: HomePage,
    default: true, // indicate if it's the default route
    name: "root"
  }
}

vue-router 와 마찬가지로 배열을 사용하여 수행할 수도 있습니다. 배열 솔루션은 나중에 반복해야 하므로 더 복잡하지만 더 유연합니다.

const routes = [
  {
    path: "/",
    component: HomePage
  }
]

// A simple way to get the component is using ES2015 array find method
const route = routes.find(route => route.path === "/");

라우터 컴포넌트 렌더링

경로가 설정되면 주어진 조건에서 컴포넌트를 렌더링할 방법이 필요합니다. Vue.js 템플릿은 우리에게 완벽한 동적 컴포넌트 를 제공합니다.

동적 구성 <component>요소를 사용하면 is 속성을 조건 으로 특수 요소 를 사용하여 구성 요소 간에 쉽게 핫스왑할 수 있습니다.

<template>
  <component :is="routedComponent"></component>
</template>

그런 다음 해당 조건을 구현해야 합니다. 그 조건은 경로에 따라 달라지므로 계산된 속성은 다음과 같은 목적에 완벽하게 맞습니다.

export default {
  data() {
    return { current: window.location.pathname };
  },
  computed: {
    routedComponent() {
      return routes[this.current];
    }
  }
};

computed 속성은 기본 경로(어떤 것과도 일치하지 않는 경로)에 대한 구성 요소를 반환하기에 좋은 위치이며 OR 연산자 를 사용하는 것만큼 쉽습니다.

routedComponent() {
  return routes[this.current] || DefaultComponent;
}

최종 Router.vue 구성 요소는 다음과 같습니다.

<!-- Router.vue -->
<template>
  <component :is="routedComponent"></component>
</template>

<script>
import HomePage from "./HomePage";
import ArticlesPage from "./ArticlesPage";

const routes = {
  "/": HomePage,
  "/articles": ArticlesPage
};

export default {
  data() {
    return { current: window.location.pathname };
  },
  computed: {
    routedComponent() {
      return routes[this.current];
    }
  }
};
</script>

대체 솔루션으로 렌더 함수(또는 JSX)가 이 경우에 완벽하게 맞습니다. 렌더 함수를 사용한 렌더링은 기본적으로 동적이기 때문입니다. 따라서 Router.js 파일에서 구성 요소를 다시 작성할 수 있습니다.

// Router.js
import HomePage from "./HomePage";
import ArticlesPage from "./ArticlesPage";

const routes = {
  "/": HomePage,
  "/articles": ArticlesPage
};

export default {
  data() {
    return { current: window.location.pathname };
  },
  computed: {
    routedComponent() {
      return routes[this.current];
    }
  },
  render(createElement) {
    return createElement(this.routedComponent);
  }
};

라우터 구성 요소 사용

응용 프로그램의 루트 구성 요소로 App.vue 구성 요소를 생성해 보겠습니다. 그런 다음 라우터 구성 요소를 가져오고 등록합니다.

<!-- App.vue -->
<template>
  <div>
    <app-router></app-router>
  </div>
</template>

<script>
import AppRouter from "./AppRouter";

export default {
  components: {
    AppRouter
  }
};
</script>

템플릿 <app-router>에서 라우터에 의해 렌더링된 구성 요소로 대체될 태그를 배치 합니다. 스크립트 섹션에서 라우터를 가져와서 앱 구성 요소에 추가합니다.

브라우저의 표시 줄에 경로를 작성하여 //articles 탐색을 실행하는 경우, 당신은 라우터에서 해당 구성 요소와 해당 내용을 볼 수 있습니다.

더 편리하게 하기 위해 App.vue 에서 경로 사이를 탐색하는 몇 가지 버튼과 메서드를 추가해 보겠습니다.

<!-- App.vue -->
<template>
  <div>
    <button @click="goTo('/articles')">Go to Articles</button>
    <button @click="goTo('/')">Go to Home</button>
    <app-router></app-router>
  </div>
</template>

<script>
import AppRouter from "./AppRouter";

export default {
  components: {
    AppRouter
  },
  methods: {
    goTo(route) {
      window.location = route;
    }
  }
};
</script>

다시 시도하고 버튼을 클릭하면 여전히 동일한 방식으로 작동합니다.
여기 에서 이 기사 의 코드와 데모 를 찾아 직접 사용해 보세요!

댓글남기기