模块是 Nuxt 的构建块。Kit 提供了一组工具,帮助您创建和使用模块。您可以使用这些工具创建自己的模块或重用现有模块。例如,您可以使用 defineNuxtModule 函数定义一个模块,并使用 moduleDependencies 选项指定依赖关系。
defineNuxtModule定义一个 Nuxt 模块,自动将默认值与用户提供的选项合并,安装任何提供的钩子,并调用可选的 setup 函数以获得完全控制。
import { defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
meta: {
name: 'my-module',
configKey: 'myModule',
},
defaults: {
enabled: true,
},
setup (options) {
if (options.enabled) {
console.log('My Nuxt module is enabled!')
}
},
})
export function defineNuxtModule<TOptions extends ModuleOptions> (
definition?: ModuleDefinition<TOptions, Partial<TOptions>, false> | NuxtModule<TOptions, Partial<TOptions>, false>,
): NuxtModule<TOptions, TOptions, false>
export function defineNuxtModule<TOptions extends ModuleOptions> (): {
with: <TOptionsDefaults extends Partial<TOptions>> (
definition: ModuleDefinition<TOptions, TOptionsDefaults, true> | NuxtModule<TOptions, TOptionsDefaults, true>,
) => NuxtModule<TOptions, TOptionsDefaults, true>
}
definition:一个模块定义对象或模块函数。模块定义对象应包含以下属性:
| 属性 | 类型 | 必需 | 描述 |
|---|---|---|---|
meta | ModuleMeta | false | 模块的元数据。它定义了模块名称、版本、配置键和兼容性。 |
defaults | T | ((nuxt: Nuxt) => T) | false | 模块的默认选项。如果提供的是函数,则会使用 Nuxt 实例作为第一个参数调用该函数。 |
schema | T | false | 模块选项的模式。如果提供,选项将应用于该模式。 |
hooks | Partial<NuxtHooks> | false | 要为模块安装的钩子。如果提供,模块将安装这些钩子。 |
moduleDependencies | Record<string, ModuleDependency> | ((nuxt: Nuxt) => Record<string, ModuleDependency>) | false | 对其他模块的依赖关系,带有版本约束和配置。可以是一个对象,也可以是一个接收 Nuxt 实例的函数。请参阅 示例。 |
onInstall | (nuxt: Nuxt) => Awaitable<void> | false | 模块首次安装时调用的生命周期钩子。需要在 meta.name 和 meta.version 中定义相应的值。 |
onUpgrade | (nuxt: Nuxt, options: T, previousVersion: string) => Awaitable<void> | false | 模块升级到新版本时调用的生命周期钩子。需要在 meta.name 和 meta.version 中定义相应的值。 |
setup | (this: void, resolvedOptions: T, nuxt: Nuxt) => Awaitable<void | false | ModuleSetupInstallResult> | false | 模块的 setup 函数。如果提供,模块将调用该 setup 函数。 |
configKey 使你的模块可配置在定义 Nuxt 模块时,你可以设置 configKey 来指定用户应如何在他们的 nuxt.config 中配置该模块。
import { defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
meta: {
name: 'my-module',
configKey: 'myModule',
},
defaults: {
// 模块选项
enabled: true,
},
setup (options) {
if (options.enabled) {
console.log('My Nuxt module is enabled!')
}
},
})
用户可以在 nuxt.config 中的对应键下为该模块提供选项。
export default defineNuxtConfig({
myModule: {
enabled: false,
},
})
如果你正在开发 Nuxt 模块并使用仅在特定 Nuxt 版本中受支持的 API,强烈建议包含 compatibility.nuxt。
export default defineNuxtModule({
meta: {
name: '@nuxt/icon',
configKey: 'icon',
compatibility: {
// 需要的 Nuxt 版本,使用 semver 格式
nuxt: '>=3.0.0', // 或使用 '^3.0.0'
},
},
setup () {
const resolver = createResolver(import.meta.url)
// 实现模块逻辑
},
})
如果用户尝试在与模块不兼容的 Nuxt 版本中使用你的模块,他们将在控制台收到警告。
WARN Module @nuxt/icon is disabled due to incompatibility issues:
- [nuxt] Nuxt version ^3.1.0 is required but currently using 3.0.0
.with() 获得已解析选项的类型安全当你需要对已解析/合并的模块选项进行类型安全检查时,可以使用 .with() 方法。它使 TypeScript 能够正确推断模块的默认值与传入 setup 函数的最终已解析选项之间的关系。
import { defineNuxtModule } from '@nuxt/kit'
// 定义你的模块选项接口
interface ModuleOptions {
apiKey: string
baseURL: string
timeout?: number
retries?: number
}
export default defineNuxtModule<ModuleOptions>().with({
meta: {
name: '@nuxtjs/my-api',
configKey: 'myApi',
},
defaults: {
baseURL: 'https://api.example.com',
timeout: 5000,
retries: 3,
},
setup (resolvedOptions, nuxt) {
// resolvedOptions 的类型正确推断为:
// {
// apiKey: string // 必填,无默认值
// baseURL: string // 必填,具有默认值
// timeout: number // 可选,具有默认值
// retries: number // 可选,具有默认值
// }
console.log(resolvedOptions.baseURL) // ✅ TypeScript 知道它始终定义
console.log(resolvedOptions.timeout) // ✅ TypeScript 知道它始终定义
console.log(resolvedOptions.retries) // ✅ TypeScript 知道它始终定义
},
})
不使用 .with() 时,resolvedOptions 参数将被类型化为原始的 ModuleOptions 接口,其中 timeout 和 retries 即使提供了默认值也可能为 undefined。.with() 方法使 TypeScript 能够理解默认值会使这些属性在已解析选项中变为非可选。
你可以定义在模块首次安装或升级到新版本时运行的生命周期钩子。这些钩子对于执行一次性的设置任务、数据库迁移或清理操作非常有用。
meta.name 和 meta.version。钩子使用这些值在项目的 .nuxtrc 文件中跟踪模块的安装状态。生命周期钩子在主 setup 函数之前运行,如果钩子抛出错误,会记录该错误但不会中断构建过程。
onInstall 仅在模块第一次被添加到项目时运行一次。
onUpgrade 在每次模块版本提升(使用 semver 比较)时运行——但对于每个版本提升只运行一次。
import { defineNuxtModule } from '@nuxt/kit'
import semver from 'semver'
export default defineNuxtModule({
meta: {
name: 'my-awesome-module',
version: '1.2.0', // 生命周期钩子所需
configKey: 'myAwesomeModule',
},
defaults: {
apiKey: '',
enabled: true,
},
onInstall (nuxt) {
// 仅在模块首次安装时运行
console.log('Setting up my-awesome-module for the first time!')
// 你可能想:
// - 创建初始配置文件
// - 设置数据库模式
// - 显示欢迎信息
// - 执行初始数据迁移
},
onUpgrade (nuxt, options, previousVersion) {
// 当模块升级到新版本时运行
console.log(`Upgrading my-awesome-module from ${previousVersion} to 1.2.0`)
// 你可能想:
// - 迁移配置文件
// - 更新数据库模式
// - 清理已弃用的文件
// - 显示升级说明
if (semver.lt(previousVersion, '1.1.0')) {
console.log('⚠️ 1.1.0 版本有破坏性变更 - 请查看迁移指南')
}
},
setup (options, nuxt) {
// 常规 setup 逻辑在每次构建时执行
if (options.enabled) {
// 配置模块
}
},
})
您可以使用 moduleDependencies 选项来声明对其他模块的依赖。这提供了一种可靠的方法来确保正确的设置顺序、版本兼容性和配置管理。
moduleDependencies 选项可以是一个对象或一个接收 Nuxt 实例的函数:
import { defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
meta: {
name: 'my-module',
},
moduleDependencies: {
'@nuxtjs/tailwindcss': {
// 指定版本约束(semver 格式)
version: '>=6.0.0',
// 覆盖用户设置的配置
overrides: {
exposeConfig: true,
},
// 设置默认值,但尊重用户设置
defaults: {
config: {
darkMode: 'class',
},
},
},
'@nuxtjs/fontaine': {
// 可选依赖不会被安装,但如果安装了,则确保可以设置其选项
optional: true,
defaults: {
fonts: [
{
family: 'Roboto',
fallbacks: ['Impact'],
},
],
},
},
},
setup (options, nuxt) {
},
})
您还可以使用一个函数根据 Nuxt 配置动态确定依赖项:
import { defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
meta: {
name: 'my-module',
},
moduleDependencies (nuxt) {
const dependencies: Record<string, any> = {
'@nuxtjs/tailwindcss': {
version: '>=6.0.0',
},
}
// 根据 Nuxt 配置有选择地添加依赖
if (nuxt.options.experimental?.someFeature) {
dependencies['@nuxtjs/fontaine'] = {
optional: true,
}
}
return dependencies
},
setup (options, nuxt) {
// 你的 setup 逻辑将在所有依赖初始化后运行
},
})
installModule以编程方式安装指定的 Nuxt 模块。这在您的模块依赖于其他模块时非常有用。您可以将模块选项作为对象传递给 inlineOptions,它们将被传递给模块的 setup 函数。
import { defineNuxtModule, installModule } from '@nuxt/kit'
export default defineNuxtModule({
async setup () {
// 将安装 @nuxtjs/fontaine 并使用 Roboto 字体及 Impact 作为回退
await installModule('@nuxtjs/fontaine', {
// 模块配置
fonts: [
{
family: 'Roboto',
fallbacks: ['Impact'],
fallbackName: 'fallback-a',
},
],
})
},
})
async function installModule (moduleToInstall: string | NuxtModule, inlineOptions?: any, nuxt?: Nuxt)
| 属性 | 类型 | 必需 | 描述 |
|---|---|---|---|
moduleToInstall | string | NuxtModule | true | 要安装的模块。可以是模块名称的字符串,或模块对象本身。 |
inlineOptions | any | false | 一个将传递给模块 setup 函数的模块选项对象。 |
nuxt | Nuxt | false | Nuxt 实例。如果未提供,将通过 useNuxt() 调用从上下文中检索。 |
import { defineNuxtModule, installModule } from '@nuxt/kit'
export default defineNuxtModule({
async setup (options, nuxt) {
// 将安装 @nuxtjs/fontaine 并使用 Roboto 字体及 Impact 作为回退
await installModule('@nuxtjs/fontaine', {
// 模块配置
fonts: [
{
family: 'Roboto',
fallbacks: ['Impact'],
fallbackName: 'fallback-a',
},
],
})
},
})