Skip to content
← Todas las preguntas
Intermedio

¿Cómo funcionan los módulos de Nuxt y cuándo crearías uno?

NuxtArquitectura

Los módulos de Nuxt son plugins que se ejecutan en tiempo de build y extienden el framework. Pueden registrar componentes, composables, rutas de servidor, plugins y modificar la configuración de Nuxt/Vite. El ecosistema está lleno de ellos: @nuxt/ui, @nuxt/image, @nuxtjs/i18n, @pinia/nuxt.

Usar módulos

Instala y añade a nuxt.config.ts:

ts
export default defineNuxtConfig({
  modules: [
    '@nuxt/ui',
    '@pinia/nuxt',
    ['@nuxt/image', { provider: 'cloudinary' }]
  ]
})

Eso es todo. Los componentes, composables y plugins del módulo quedan disponibles automáticamente.

Crear un módulo

Usa defineNuxtModule con los helpers de @nuxt/kit:

ts
// modules/analytics/index.ts
import { defineNuxtModule, addPlugin, createResolver } from '@nuxt/kit'

export interface ModuleOptions {
  trackingId: string
  enabled?: boolean
}

export default defineNuxtModule<ModuleOptions>({
  meta: {
    name: 'analytics',
    configKey: 'analytics'
  },
  defaults: {
    enabled: true
  },
  setup(options, nuxt) {
    if (!options.enabled) return

    const { resolve } = createResolver(import.meta.url)

    nuxt.options.runtimeConfig.public.analyticsId = options.trackingId

    addPlugin({
      src: resolve('./runtime/plugin'),
      mode: 'client'
    })
  }
})
ts
// modules/analytics/runtime/plugin.ts
export default defineNuxtPlugin((nuxtApp) => {
  const config = useRuntimeConfig()

  nuxtApp.hook('page:finish', () => {
    trackPageView(config.public.analyticsId)
  })
})
ts
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['~/modules/analytics'],
  analytics: {
    trackingId: 'UA-123456'
  }
})

Qué pueden registrar los módulos

Helper de @nuxt/kitRegistra
addComponentUn componente global
addComponentsDirUn directorio de componentes
addImportsUn composable/utilidad con auto-importación
addImportsDirUn directorio de auto-importaciones
addPluginUn plugin de cliente/servidor/universal
addServerHandlerUna ruta de servidor Nitro
ts
setup(options, nuxt) {
  const { resolve } = createResolver(import.meta.url)

  addComponent({
    name: 'AnalyticsBanner',
    filePath: resolve('./runtime/components/AnalyticsBanner.vue')
  })

  addImports({
    name: 'useTracking',
    from: resolve('./runtime/composables/useTracking')
  })

  addServerHandler({
    route: '/api/analytics',
    handler: resolve('./runtime/server/api/analytics')
  })
}

Estructura de directorios de un módulo

modules/analytics/
├── index.ts              ← definición del módulo (tiempo de build)
└── runtime/
    ├── components/       ← componentes Vue
    ├── composables/      ← composables para auto-importación
    ├── server/           ← rutas de servidor Nitro
    └── plugin.ts         ← plugin de Nuxt

El directorio runtime/ contiene el código que se ejecuta en la app. Todo lo que está fuera de él solo se ejecuta en tiempo de build.

Cuándo crear un módulo vs un plugin vs un composable

NecesidadUsar
Añadir configuración en tiempo de build, registrar componentes/rutas/pluginsMódulo
Ejecutar código al iniciar la app (cliente o servidor)Plugin
Lógica reutilizable para componentes individualesComposable
Compartir funcionalidad entre varios proyectos NuxtMódulo (publicable en npm)
Integración puntual específica del proyectoPlugin o composable suele ser suficiente

Publicado bajo la licencia MIT.