路径解析
Nuxt Kit 提供了一组实用工具,帮助您解析路径。这些函数允许您解析相对于当前模块的路径,即使文件名或扩展名未知。
有时候您需要解析路径:相对于当前模块、文件名或扩展名未知。例如,您可能希望添加一个与模块位于同一目录的插件。为了处理这些情况,Nuxt 提供了一组路径解析实用工具。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
: 传递给解析器的选项。此对象可以具有以下属性:
属性 | 类型 | 必需 | 描述 |
---|---|---|---|
cwd | string | false | 解析路径的基础目录。默认为 Nuxt 的 rootDir。 |
alias | Record<string, string> | false | 别名对象。默认为 Nuxt 配置的别名。 |
extensions | string[] | false | 要尝试的文件扩展名。默认为 Nuxt 配置的扩展名。 |
virtual | boolean | false | 是否解析存在于 Nuxt 虚拟文件系统中的文件(例如,作为 Nuxt 模板)。 |
fallbackToOriginal | boolean | false | 如果解析的路径不存在,是否回退到原始路径,而不是返回规范化后的输入路径。 |
示例
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
: 传递给解析器的选项。此对象可以具有以下属性:
属性 | 类型 | 必需 | 描述 |
---|---|---|---|
cwd | string | false | 解析路径的基础目录。默认为 Nuxt 的 rootDir。 |
alias | Record<string, string> | false | 别名对象。默认为 Nuxt 配置的别名。 |
extensions | string[] | false | 要尝试的文件扩展名。默认为 Nuxt 配置的扩展名。 |
virtual | boolean | false | 是否解析存在于 Nuxt 虚拟文件系统中的文件(例如,作为 Nuxt 模板)。 |
fallbackToOriginal | boolean | false | 如果解析的路径不存在,是否回退到原始路径,而不是返回规范化后的输入路径。 |
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'))
}
})
},
})