Nuxt.js模块系统 #

一、模块概述 #

Nuxt.js 模块是扩展 Nuxt 核心功能的方式。模块可以在构建时修改 Nuxt 配置、添加插件、注册组件等。

1.1 模块的作用 #

  • 添加新功能
  • 集成第三方服务
  • 修改构建配置
  • 添加插件和中间件
  • 注册组件和组合式函数

1.2 内置模块 #

  • @nuxtjs/tailwindcss:Tailwind CSS 集成
  • @nuxtjs/i18n:国际化支持
  • @nuxtjs/supabase:Supabase 集成
  • @nuxtjs/apollo:GraphQL 客户端

二、使用模块 #

2.1 安装模块 #

bash
pnpm add @nuxtjs/tailwindcss

2.2 配置模块 #

nuxt.config.ts

typescript
export default defineNuxtConfig({
  modules: [
    '@nuxtjs/tailwindcss',
    '@nuxtjs/i18n'
  ]
})

2.3 模块配置 #

typescript
export default defineNuxtConfig({
  modules: [
    ['@nuxtjs/tailwindcss', {
      cssPath: '~/assets/css/tailwind.css',
      configPath: 'tailwind.config.js'
    }]
  ]
})

2.4 条件加载 #

typescript
export default defineNuxtConfig({
  modules: process.env.NODE_ENV === 'development' 
    ? ['@nuxtjs/devtools']
    : []
})

三、创建本地模块 #

3.1 简单模块 #

modules/my-module.ts

typescript
import { defineNuxtModule, addPlugin, createResolver } from '@nuxt/kit'

export default defineNuxtModule({
  meta: {
    name: 'my-module',
    configKey: 'myModule'
  },
  
  setup(options, nuxt) {
    const { resolve } = createResolver(import.meta.url)
    
    addPlugin(resolve('./runtime/plugin'))
  }
})

3.2 带配置的模块 #

modules/analytics.ts

typescript
import { defineNuxtModule, addPlugin, createResolver } from '@nuxt/kit'

interface ModuleOptions {
  trackingId: string
  enabled: boolean
}

export default defineNuxtModule<ModuleOptions>({
  meta: {
    name: 'analytics',
    configKey: 'analytics'
  },
  
  defaults: {
    trackingId: '',
    enabled: true
  },
  
  setup(options, nuxt) {
    if (!options.enabled) return
    
    const { resolve } = createResolver(import.meta.url)
    
    nuxt.options.runtimeConfig.public.analytics = {
      trackingId: options.trackingId
    }
    
    addPlugin(resolve('./runtime/plugin'))
  }
})

使用:

nuxt.config.ts

typescript
export default defineNuxtConfig({
  modules: ['./modules/analytics'],
  
  analytics: {
    trackingId: 'UA-XXXXX-Y',
    enabled: true
  }
})

3.3 模块插件 #

modules/analytics/runtime/plugin.ts

typescript
export default defineNuxtPlugin((nuxtApp) => {
  const config = useRuntimeConfig()
  
  if (import.meta.client && config.public.analytics?.trackingId) {
    window.dataLayer = window.dataLayer || []
    
    function gtag(...args: any[]) {
      window.dataLayer.push(args)
    }
    
    gtag('js', new Date())
    gtag('config', config.public.analytics.trackingId)
    
    return {
      provide: {
        gtag
      }
    }
  }
})

四、模块API #

4.1 定义模块 #

typescript
export default defineNuxtModule<ModuleOptions>({
  meta: {
    name: 'module-name',
    configKey: 'moduleName',
    compatibility: {
      nuxt: '^3.0.0'
    }
  },
  
  defaults: {},
  
  async setup(options, nuxt) {
    
  }
})

4.2 Kit工具函数 #

函数 说明
addPlugin 添加插件
addImports 添加自动导入
addComponentsDir 添加组件目录
addServerHandler 添加服务端路由
addBuildPlugin 添加构建插件
extendPages 扩展页面
extendViteConfig 扩展 Vite 配置

4.3 添加自动导入 #

typescript
import { defineNuxtModule, addImports } from '@nuxt/kit'

export default defineNuxtModule({
  setup(options, nuxt) {
    addImports([
      {
        name: 'useMyFeature',
        from: resolve('./runtime/composables/useMyFeature')
      }
    ])
  }
})

4.4 添加组件 #

typescript
import { defineNuxtModule, addComponentsDir } from '@nuxt/kit'

export default defineNuxtModule({
  setup(options, nuxt) {
    addComponentsDir({
      path: resolve('./runtime/components'),
      prefix: 'My'
    })
  }
})

4.5 添加服务端路由 #

typescript
import { defineNuxtModule, addServerHandler } from '@nuxt/kit'

export default defineNuxtModule({
  setup(options, nuxt) {
    addServerHandler({
      route: '/api/my-module/data',
      handler: resolve('./runtime/server/api/data')
    })
  }
})

五、完整模块示例 #

5.1 模块结构 #

text
modules/
└── my-analytics/
    ├── index.ts
    ├── runtime/
    │   ├── plugin.ts
    │   ├── composables/
    │   │   └── useAnalytics.ts
    │   └── components/
    │       └── Analytics.vue
    └── types.ts

5.2 模块入口 #

modules/my-analytics/index.ts

typescript
import { defineNuxtModule, addPlugin, addImports, addComponentsDir, createResolver } from '@nuxt/kit'

interface AnalyticsOptions {
  trackingId: string
  enabled?: boolean
  debug?: boolean
}

export default defineNuxtModule<AnalyticsOptions>({
  meta: {
    name: 'my-analytics',
    configKey: 'analytics',
    compatibility: {
      nuxt: '^3.0.0'
    }
  },
  
  defaults: {
    enabled: true,
    debug: false
  },
  
  async setup(options, nuxt) {
    if (!options.enabled) return
    
    const { resolve } = createResolver(import.meta.url)
    
    nuxt.options.runtimeConfig.public.analytics = {
      trackingId: options.trackingId,
      debug: options.debug
    }
    
    addPlugin(resolve('./runtime/plugin'))
    
    addImports([
      {
        name: 'useAnalytics',
        from: resolve('./runtime/composables/useAnalytics')
      }
    ])
    
    addComponentsDir({
      path: resolve('./runtime/components'),
      prefix: 'Analytics'
    })
    
    if (options.debug) {
      console.log('[Analytics Module] Initialized with tracking ID:', options.trackingId)
    }
  }
})

5.3 模块插件 #

modules/my-analytics/runtime/plugin.ts

typescript
export default defineNuxtPlugin(() => {
  const config = useRuntimeConfig()
  
  if (!import.meta.client || !config.public.analytics?.trackingId) return
  
  const script = document.createElement('script')
  script.async = true
  script.src = `https://www.googletagmanager.com/gtag/js?id=${config.public.analytics.trackingId}`
  document.head.appendChild(script)
  
  window.dataLayer = window.dataLayer || []
  
  function gtag(...args: any[]) {
    window.dataLayer.push(args)
  }
  
  gtag('js', new Date())
  gtag('config', config.public.analytics.trackingId)
  
  return {
    provide: {
      gtag,
      trackEvent: (event: string, params?: Record<string, any>) => {
        gtag('event', event, params)
      }
    }
  }
})

5.4 组合式函数 #

modules/my-analytics/runtime/composables/useAnalytics.ts

typescript
export const useAnalytics = () => {
  const { $gtag, $trackEvent } = useNuxtApp()
  
  const trackPageView = (path: string) => {
    $gtag('config', useRuntimeConfig().public.analytics.trackingId, {
      page_path: path
    })
  }
  
  const trackEvent = (event: string, params?: Record<string, any>) => {
    $trackEvent(event, params)
  }
  
  return {
    trackPageView,
    trackEvent
  }
}

5.5 使用模块 #

nuxt.config.ts

typescript
export default defineNuxtConfig({
  modules: ['./modules/my-analytics'],
  
  analytics: {
    trackingId: 'G-XXXXXXXXXX',
    enabled: true,
    debug: process.env.NODE_ENV === 'development'
  }
})

六、发布模块 #

6.1 package.json #

json
{
  "name": "nuxt-my-module",
  "version": "1.0.0",
  "main": "./dist/module.mjs",
  "types": "./dist/types.d.ts",
  "exports": {
    ".": {
      "import": "./dist/module.mjs",
      "require": "./dist/module.cjs",
      "types": "./dist/types.d.ts"
    }
  },
  "files": [
    "dist"
  ],
  "peerDependencies": {
    "nuxt": "^3.0.0"
  },
  "keywords": [
    "nuxt",
    "nuxt3",
    "nuxt-module"
  ]
}

6.2 构建配置 #

typescript
import { defineBuildConfig } from 'unbuild'

export default defineBuildConfig({
  entries: ['./src/module'],
  clean: true,
  declaration: true,
  externals: ['nuxt', '@nuxt/kit']
})

七、最佳实践 #

7.1 模块命名 #

  • 使用 nuxt- 前缀
  • 使用 kebab-case
  • 描述性名称

7.2 配置设计 #

typescript
interface ModuleOptions {
  enabled?: boolean
  apiKey?: string
  features?: {
    featureA?: boolean
    featureB?: boolean
  }
}

7.3 类型安全 #

typescript
declare module '@nuxt/schema' {
  interface NuxtConfig {
    myModule?: ModuleOptions
  }
  interface RuntimeConfig {
    public: {
      myModule: {
        apiKey: string
      }
    }
  }
}

八、总结 #

本章介绍了 Nuxt.js 模块系统:

  • 使用和配置模块
  • 创建本地模块
  • 模块 API 和 Kit 工具函数
  • 完整模块示例
  • 发布模块

模块系统是扩展 Nuxt.js 功能的强大方式,下一章我们将学习服务端渲染。

最后更新:2026-03-28