Nuxt Nation 大会即将到来。加入我们,时间为 11 月 12-13 日。

路径解析

Nuxt Kit 提供了一组实用工具来帮助你解析路径。这些函数允许你解析相对于当前模块的路径,无论文件名或扩展名是否已知。

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

resolvePath

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

类型

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

参数

path

类型: string

必填: true

要解析的路径。

options

类型: ResolvePathOptions

默认值: {}

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

  • cwd (可选)
    类型: string
    默认值: process.cwd()
    当前工作目录。
  • alias (可选)
    类型: Record<string, string>
    默认值: {}
    别名映射。
  • extensions (可选)
    类型: string[]
    默认值: ['.js', '.mjs', '.ts', '.jsx', '.tsx', '.json']
    要尝试的扩展名。

示例

// https://github.com/P4sca1/nuxt-headlessui
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

类型: string

必填: true

要解析的路径。

alias

类型: Record<string, string>

默认值: {}

别名映射。如果未提供,则将从 nuxt.options.alias 中读取。

findPath

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

类型

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

interface ResolvePathOptions {
  cwd?: string
  alias?: Record<string, string>
  extensions?: string[]
}

参数

paths

类型: string | string[]

必填: true

要解析的路径或路径数组。

options

类型: ResolvePathOptions

默认值: {}

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

  • cwd (可选)
    类型: string
    默认值: process.cwd()
    当前工作目录。
  • alias (可选)
    类型: Record<string, string>
    默认值: {}
    别名映射。
  • extensions (可选)
    类型: string[]
    默认值: ['.js', '.mjs', '.ts', '.jsx', '.tsx', '.json']
    要尝试的扩展名。

pathType

类型: 'file' | 'dir'

默认值: 'file'

要解析的路径类型。如果设置为 'file',则函数将尝试解析文件。如果设置为 'dir',则函数将尝试解析目录。

createResolver

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

观看 Vue School 关于 createResolver 的视频。

类型

function createResolver (basePath: string | URL): Resolver

interface Resolver {
  resolve (...path: string[]): string
  resolvePath (path: string, options?: ResolvePathOptions): Promise<string>
}

interface ResolvePathOptions {
  cwd?: string
  alias?: Record<string, string>
  extensions?: string[]
}

参数

basePath

类型: string

必填: true

要从中解析的基本路径。

示例

// https://github.com/vuejs/pinia/blob/v2/packages/nuxt
import {
  defineNuxtModule,
  isNuxt2,
  createResolver,
} 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'))
      }
    })
  }
})