Разрешение путей

Исходный код
Утилиты Nuxt Kit для разрешения путей: относительно модуля, с неизвестным именем файла или расширением.

Часто нужно получить абсолютный путь: относительно текущего модуля, при неоднозначном имени или без известного расширения — например подключить плагин из каталога модуля. Для этого в Kit есть resolvePath и resolveAlias (пути и алиасы), 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Базовый каталог разрешения. По умолчанию — rootDir Nuxt.
aliasRecord<string, string>falseОбъект алиасов. По умолчанию — из конфигурации Nuxt.
extensionsstring[]falseРасширения файлов для перебора. По умолчанию — из конфигурации Nuxt.
virtualbooleanfalseРазрешать файлы из VFS 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: опции резолвера (см. resolvePath):

СвойствоТипОбязательноОписание
cwdstringfalseБазовый каталог разрешения. По умолчанию — rootDir Nuxt.
aliasRecord<string, string>falseОбъект алиасов. По умолчанию — из конфигурации Nuxt.
extensionsstring[]falseРасширения для перебора. По умолчанию — из конфигурации Nuxt.
virtualbooleanfalseУчитывать файлы в VFS Nuxt.
fallbackToOriginalbooleanfalseПри отсутствии файла вернуть исходный путь вместо нормализованного входного.

createResolver

Создаёт объект с методами разрешения путей относительно базового каталога.

Видео Vue School о createResolver и путях к ресурсам.

Использование

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

export default defineNuxtModule({
  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>Как resolve, плюс алиасы и расширения 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'))
      }
    })
  },
})