透過 100 多個技巧學習 Nuxt!

解析

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

建立相對於基本路徑的解析器。

觀看關於 createResolver 的 Vue School 影片。

類型

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'))
      }
    })
  }
})