티스토리 뷰

728x90

Nuxtjs에는 정해진 디렉터리 별 목적이 있습니다. 그 목적을 알고 사용해야 원하는 결과물 얻을 수 있습니다.

 

aseets

컴파일되지 않아야 하는 css, sass, image, fonts를 넣는 디렉터리입니다.

 

static

서버 루트에 직접 매핑되어 바뀌지 않을 파일을 넣는 디렉터리입니다. 대표적으로 파비콘(favicon) 있습니다.

static 폴더 아래 파비콘이 존재하면 http://localhost:3000/favicon.ico 형태로 접근 가능합니다.

 

pages

애플리케이션의 view와 routes와 관련 있는 중요한 디렉터리입니다.

언더바(_)로 파일명이 시작할 경우 동적으로 라우팅 됩니다.

예를 들어 pages/todo/create.vue 형태로 구성하면 localhost/todo/create로 접근하면 해당 페이지가 노출됩니다.

특정 id 값을 가진 todo를 보고 싶다면 pages/todo/_id.vue 형태로 구성하면 localhost/todo/1로 접근하면 됩니다.

 

layouts

특정 page의 layout을 변경하고 싶을 때 사용합니다.

layouts 폴더 아래에 정의해두고 각 페이지에서 layout 값을 변경하여 사용할 수 있습니다.

header, footer는 같고 콘텐츠 영역만 변경되어야 하는 경우 사용하면 편리합니다.

layouts/default.vue 생성하면 모든 pages에 동일하게 적용됩니다.

 

layouts/blog

<template>
  <div>
    <Header />
    <Nuxt />
    <Footer />
  </div>
</template>

pages/post

<script>
export default {
  layout: 'blog',
  // OR
  layout (context) {
    return 'blog'
  }
}
</script>

 

components

Vue.js 컴포넌트를 넣은 디렉터리입니다.

 

store

Vuex Store를 넣는 디렉터리입니다. Vuex Store는 Nuxt.js와 함께 제공되지만 기본적으로 비활성화되어 있습니다.

이 디렉터리에 index.js 파일을 만들면 스토어가 활성화됩니다.

 

middleware

미들웨어를 사용하면 페이지 또는 페이지 그룹 (레이아웃)을 렌더링 하기 전에 실행할 수 있는 사용자 정의 기능을 정의할 수 있습니다.

기명 방식과 무기명 방식이 있습니다.

 

기명 방식은 다음처럼 사용합니다. 별도의 미들웨어 파일을 생성한 후

 

middleware/authenticated.js

export default function ({ store, redirect }) {
  // If the user is not authenticated
  if (!store.state.authenticated) {
    return redirect('/login')
  }
}

사용할 곳에 middleware 속성으로 추가합니다. 한 개는 아래처럼 문자열로 여러 개는 배열로 추가합니다.

<template>
  <h1>Secret page</h1>
</template>

<script>
  export default {
    middleware: 'authenticated'
  }
</script>

무기명 방식은 별도의 파일을 생성하지 않고 다음과 같이 middleware 속성에 직접 구현합니다.

<template>
  <h1>Secret page</h1>
</template>

<script>
  export default {
    middleware({ store, redirect }) {
      // If the user is not authenticated
      if (!store.state.authenticated) {
        return redirect('/login')
      }
    }
  }
</script>

 

plugins

최상위 Vue.js 애플리케이션을 인스턴스 화하기 전에 실행할 자바 스크립트 플러그인이 포함되는 디렉터리입니다.

외부 Vue 플러그인에 함수 또는 상수 추가할 수 있습니다. plugins /에 파일을 만들고 매번 Vue.use()를 사용해서 추가해야 하고 nuxt.config.js의 플러그인에 경로를 추가해야 합니다.

 

nuxtjs/aixos 같은 외부 패키지를 추가할 때

아래 코드는 500 에러가 발생할 경우 sorry 페이지로 리다이렉트 합니다. 동작을 플러그인에 추가했습니다.

nuxt.config.js의 modules에 axios를 추가하면 $axios로 접근 가능합니다.

plugins/axios.js

export default function ({ $axios, redirect }) {
  $axios.onError(error => {
    if (error.response.status === 500) {
      redirect('/sorry')
    }
  })
}

nuxt.config.js

module.exports = {
  modules: ['@nuxtjs/axios'], // 그냥 axios는 안됨
  plugins: ['~/plugins/axios.js']
}

pages/index.vue

아래처럼 사용 가능합니다.

<template>
  <h1>{{ post.title }}</h1>
</template>

<script>
export default {
    async asyncData ({ $axios, params }) {
      const  post  = await $axios.$get(`https://api.nuxtjs.dev/posts/${params.id}`)
      return { post }
    }
}
</script>

pages/index.vue

axios 모듈을 import 해서 사용하는 경우에는 아래처럼 사용 가능합니다.

 

<script>
import axios from 'axios'

export default {
    async asyncData ({ params }) {
      const { data: post }  = await axios.get(`https://api.nuxtjs.dev/posts/${params.id}`)
      return { post }
    }
}
</script>

 

Vue 플러그인을 사용할 경우

해당 플러그인을 import 한 후 Vue.use로 등록해서 사용합니다.

plugins/vue-tooltip.js

import Vue from 'vue'
import VTooltip from 'v-tooltip'

Vue.use(VTooltip)

 

그리고 plugins 목록에 추가합니다.

 

export default {
  plugins: ['~/plugins/vue-tooltip.js']
}

 

$root 및 컨텍스트에 삽입

애플리케이션 전체에서 사용되는 플러그인인 경우 다음처럼 사용 가능합니다.

plugins/hello.js

export default ({ app }, inject) => {
  // Inject $hello(msg) in Vue, context and store.
  inject('hello', msg => console.log(`Hello ${msg}!`))
}
export default {
  plugins: ['~/plugins/hello.js']
}

example-component.vue

export default {
  mounted() {
    this.$hello('mounted')
    // will console.log 'Hello mounted!'
  },
  asyncData({ app, $hello }) {
    $hello('asyncData')
    // If using Nuxt <= 2.12, use 👇
    app.$hello('asyncData')
  }
}

store/index.js

export const state = () => ({
  someValue: ''
})

export const actions = {
  setSomeValueToWhatever({ commit }) {
    this.$hello('store action')
    const newValue = 'whatever'
    commit('changeSomeValue', newValue)
  }
}

클릭하거나 어떤 특정한 동작을 했을 때 로그를 쌓고 싶다면 이 방법을 활용해 봐도 좋겠네요.

 

 

 

728x90
댓글