Javascript/NuxtJS

[Nuxt3] 플러그인

kyoulho 2025. 3. 9. 15:29
728x90

Nuxt 3 플러그인은 애플리케이션 전역에서 재사용할 수 있는 기능을 제공하는 모듈입니다. 주요 용도는 다음과 같습니다:

  • API 클라이언트와 같은 전역 유틸리티 제공
  • 전역 상태 관리 (Pinia)
  • 인증 및 권한 관리
  • 글로벌 컴포넌트 및 디렉티브 등록
  • Vue 및 서드파티 라이브러리(i18n, axios 등) 초기화
  • 서버 사이드 렌더링(SSR)과 클라이언트 환경에서 코드 분기

 플러그인 사용 시 주의사항

  • 플러그인을 로드한다는 것은 defineNuxtPlugin() 함수의 매개변수(함수)를 실행한다는 것입니다.
  • 전역으로 제공하는 Helper는 신중히 선택하고, composables로 기능을 분리하는 것을 우선적으로 고려하세요.
  • SSR 환경에서는 브라우저 전용 객체(window, document) 사용 시 반드시 클라이언트 모드로 분기 처리해야 합니다.
  • 플러그인이 많을 경우 번들 크기가 커질 수 있으므로 성능 최적화를 고려해야 합니다.

언제, 어떤 플러그인 방식을 사용할까?

사용 목적 추천 방식
전역 상태 관리 Vue 플러그인 (Pinia 등)
API 클라이언트, 인증 Helper 제공 (provide)
Vue 라이브러리 초기화 (i18n 등) Vue 플러그인 (vueApp.use())
글로벌 디렉티브 추가 Vue 디렉티브 등록 (vueApp.directive)
SSR 환경 분기 처리 mode 옵션 (client/server)

 

플러그인 타입

interface NuxtPlugin {
  src: string
  mode?: 'all' | 'server' | 'client'
  order?: number
}

NuxtPlugin 인터페이스는 src와 선택적인 mode (기본값: 'all'), order 속성을 포함하고 있습니다. mode는 'all', 'server', 'client' 중 하나일 수 있으며, 이를 통해 플러그인이 작동하는 환경을 지정할 수 있습니다. 플러그인 파일에 .client.ts 또는 .server.ts 접미사를 붙이면, 해당 플러그인은 클라이언트나 서버에서만 작동하게 됩니다.

 

플러그인 작성 방법

플러그인은 plugins/ 디렉터리에 정의하며 자동으로 로드됩니다. 플러그인 작성 방법은 다음과 같이 여러 가지가 있습니다.

기본 플러그인 등록

기본적인 형태는 defineNuxtPlugin을 이용하여 정의합니다.

// plugins/simplePlugin.ts
export default defineNuxtPlugin(() => {
  console.log('Nuxt 플러그인 초기화');
});

Helper 함수 제공하기 (provide)

전역적으로 사용할 수 있는 헬퍼를 제공합니다.

⚠️ 주의: 전역적인 네임스페이스 오염을 방지하기 위해 composables을 활용하는 것을 추천합니다.

// plugins/helper.ts
export default defineNuxtPlugin(() => ({
  provide: {
    formatDate: (date: Date) => date.toLocaleDateString('ko-KR')
  }
}));
<script setup lang="ts">
const { $formatDate } = useNuxtApp();
const today = $formatDate(new Date());
</script>

<template>
  <div>{{ today }}</div>
</template>

 

Vue 플러그인 등록 (vueApp.use())

Vue 생태계에서 제공하는 플러그인(i18n, Pinia 등)을 Nuxt 3에 등록할 때 사용합니다.

// plugins/i18n.ts
import { createI18n } from 'vue-i18n';

export default defineNuxtPlugin(({ vueApp }) => {
  const i18n = createI18n({
    legacy: false,
    globalInjection: true,
    locale: 'ko',
    messages: {
      ko: { home: '홈' },
      en: { home: 'Home' }
    }
  });

  vueApp.use(i18n);
});
<template>
  <button>{{ $t('home') }}</button>
</template>

클라이언트/서버 전용 플러그인 (환경 분기)

서버 또는 클라이언트에서만 실행되는 플러그인을 작성할 수 있습니다.

// plugins/clientOnly.ts
export default defineNuxtPlugin({
  mode: 'client',
  setup() {
    console.log('클라이언트 전용 플러그인');
  }
});

// plugins/serverOnly.ts
export default defineNuxtPlugin({
  mode: 'server',
  setup() {
    console.log('서버 전용 플러그인');
  }
});

플러그인 로딩 순서 제어 (pre/post)

플러그인 간 실행 순서를 제어할 때 유용합니다.

// plugins/prePlugin.ts
export default defineNuxtPlugin({
  enforce: 'pre',
  setup() {
    console.log('가장 먼저 실행');
  }
});

// plugins/postPlugin.ts
export default defineNuxtPlugin({
  enforce: 'post',
  setup() {
    console.log('마지막에 실행');
  }
});

글로벌 디렉티브 등록

전역 디렉티브를 쉽게 추가할 수 있습니다.

// plugins/directive.ts
export default defineNuxtPlugin(({ vueApp }) => {
  vueApp.directive('focus', {
    mounted(el: HTMLElement) {
      el.focus();
    }
  });
});
<template>
  <input v-focus />
</template>
728x90

'Javascript > NuxtJS' 카테고리의 다른 글

[Nuxt3] 라우트 미들웨어  (0) 2025.03.09
[Nuxt3] 에러 핸들링  (0) 2025.03.09
[Nuxt3] navigateTo  (0) 2025.03.09
[Nuxt3] 레이아웃 프레임워크  (0) 2025.03.09
[Nuxt3] NuxtLink  (0) 2025.03.09