路径解析

Nuxt Kit 提供了一组实用工具,帮助您解析路径。这些函数允许您解析相对于当前模块的路径,即使文件名或扩展名未知。

有时候您需要解析路径:相对于当前模块、文件名或扩展名未知。例如,您可能希望添加一个与模块位于同一目录的插件。为了处理这些情况,Nuxt 提供了一组路径解析实用工具。resolvePathresolveAlias 用于解析相对于当前模块的路径。findPath 用于查找给定路径中第一个存在的文件。createResolver 用于创建相对于基础路径的解析器。

resolvePath

解析文件或目录的完整路径,遵循 Nuxt 的别名和扩展名选项。如果路径无法解析,将返回规范化后的输入路径。

使用

import { defineNuxtModule, resolvePath } from '@nuxt/kit'

export default defineNuxtModule({
  async setup () {
    const entrypoint = await resolvePath('@unhead/vue')
    console.log(`Unhead 入口点是 ${entrypoint}`)
  },
})

类型

function resolvePath (path: string, options?: ResolvePathOptions): Promise<string>

参数

path: 要解析的路径。

options: 传递给解析器的选项。此对象可以具有以下属性:

属性类型必需描述
cwdstringfalse解析路径的基础目录。默认为 Nuxt 的 rootDir。
aliasRecord<string, string>false别名对象。默认为 Nuxt 配置的别名。
extensionsstring[]false要尝试的文件扩展名。默认为 Nuxt 配置的扩展名。
virtualbooleanfalse是否解析存在于 Nuxt 虚拟文件系统中的文件(例如,作为 Nuxt 模板)。
fallbackToOriginalbooleanfalse如果解析的路径不存在,是否回退到原始路径,而不是返回规范化后的输入路径。

示例

import { defineNuxtModule, resolvePath } from '@nuxt/kit'
import { join } from 'pathe'

const headlessComponents: ComponentGroup[] = [
  {
    relativePath: 'combobox/combobox.js',
    chunkName: 'headlessui/combobox',
    exports: [
      'Combobox',
      'ComboboxLabel',
      'ComboboxButton',
      'ComboboxInput',
      'ComboboxOptions',
      'ComboboxOption',
    ],
  },
]

export default defineNuxtModule({
  meta: {
    name: 'nuxt-headlessui',
    configKey: 'headlessui',
  },
  defaults: {
    prefix: 'Headless',
  },
  async setup (options) {
    const entrypoint = await resolvePath('@headlessui/vue')
    const root = join(entrypoint, '../components')

    for (const group of headlessComponents) {
      for (const e of group.exports) {
        addComponent(
          {
            name: e,
            export: e,
            filePath: join(root, group.relativePath),
            chunkName: group.chunkName,
            mode: 'all',
          },
        )
      }
    }
  },
})

resolveAlias

解析路径别名,遵循 Nuxt 的别名选项。

类型

function resolveAlias (path: string, alias?: Record<string, string>): string

参数

path: 要解析的路径。

alias: 别名对象。如果未提供,将从 nuxt.options.alias 中读取。

findPath

尝试解析给定路径中第一个存在的文件。

使用

import { defineNuxtModule, findPath } from '@nuxt/kit'
import { join } from 'pathe'

export default defineNuxtModule({
  async setup (_, nuxt) {
    // 解析主文件 (app.vue)
    const mainComponent = await findPath([
      join(nuxt.options.srcDir, 'App'),
      join(nuxt.options.srcDir, 'app'),
    ])
  },
})

类型

function findPath (paths: string | string[], options?: ResolvePathOptions, pathType: 'file' | 'dir'): Promise<string | null>

参数

paths: 要解析的一个路径或路径数组。

options: 传递给解析器的选项。此对象可以具有以下属性:

属性类型必需描述
cwdstringfalse解析路径的基础目录。默认为 Nuxt 的 rootDir。
aliasRecord<string, string>false别名对象。默认为 Nuxt 配置的别名。
extensionsstring[]false要尝试的文件扩展名。默认为 Nuxt 配置的扩展名。
virtualbooleanfalse是否解析存在于 Nuxt 虚拟文件系统中的文件(例如,作为 Nuxt 模板)。
fallbackToOriginalbooleanfalse如果解析的路径不存在,是否回退到原始路径,而不是返回规范化后的输入路径。

createResolver

创建相对于基础路径的解析器。

观看 Vue School 关于 createResolver 的视频。

使用

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

export default defineNuxtModule({
  async setup (_, nuxt) {
    const { resolve, resolvePath } = createResolver(import.meta.url)
  },
})

类型

function createResolver (basePath: string | URL): Resolver

参数

basePath: 解析的基础路径。可以是字符串或 URL。

返回值

createResolver 函数返回一个对象,包含以下属性:

属性类型描述
resolve(path: string) => string一个函数,解析相对于基础路径的路径。
resolvePath(path: string, options?: ResolvePathOptions) => Promise<string>一个函数,解析相对于基础路径的路径,并遵循 Nuxt 的别名和扩展名选项。

示例

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

export default defineNuxtModule({
  setup (options, nuxt) {
    const resolver = createResolver(import.meta.url)

    nuxt.hook('modules:done', () => {
      if (isNuxt2()) {
        addPlugin(resolver.resolve('./runtime/plugin.vue2'))
      } else {
        addPlugin(resolver.resolve('./runtime/plugin.vue3'))
      }
    })
  },
})