层
Nuxt Kit 提供了多种实用工具,帮助您处理层(Layers)及其目录结构。
Nuxt 层提供了一种强大的方式,可以在项目中共享和扩展功能。在模块中使用层时,通常需要访问每个层的目录路径。Nuxt Kit 提供了 getLayerDirectories 实用工具,用于访问 Nuxt 应用中所有已解析的层目录路径。
getLayerDirectories
获取 Nuxt 应用中所有层的已解析目录路径。该函数提供了一种结构化的方式来访问层目录,而无需直接访问私有的 nuxt.options._layers 属性。
使用
import { defineNuxtModule, getLayerDirectories } from '@nuxt/kit'
export default defineNuxtModule({
setup () {
const layerDirs = getLayerDirectories()
// Access directories from all layers
for (const [index, layer] of layerDirs.entries()) {
console.log(`Layer ${index}:`)
console.log(` Root: ${layer.root}`)
console.log(` App: ${layer.app}`)
console.log(` Server: ${layer.server}`)
console.log(` Pages: ${layer.appPages}`)
// ... other directories
}
},
})
类型
// @errors: 2391
import type { Nuxt } from '@nuxt/schema'
// ---cut---
function getLayerDirectories (nuxt?: Nuxt): LayerDirectories[]
interface LayerDirectories {
/** Nuxt rootDir (`/` by default) */
readonly root: string
/** Nitro source directory (`/server` by default) */
readonly server: string
/** Local modules directory (`/modules` by default) */
readonly modules: string
/** Shared directory (`/shared` by default) */
readonly shared: string
/** Public directory (`/public` by default) */
readonly public: string
/** Nuxt srcDir (`/app/` by default) */
readonly app: string
/** Layouts directory (`/app/layouts` by default) */
readonly appLayouts: string
/** Middleware directory (`/app/middleware` by default) */
readonly appMiddleware: string
/** Pages directory (`/app/pages` by default) */
readonly appPages: string
/** Plugins directory (`/app/plugins` by default) */
readonly appPlugins: string
}
参数
nuxt (可选):用于获取层信息的 Nuxt 实例。如果未提供,函数将使用当前的 Nuxt 上下文。
返回值
getLayerDirectories 函数返回一个 LayerDirectories 对象数组,每个对象对应应用中的一个层。
层优先级排序:层按优先级排序,其中:
- 第一个层是用户/项目层(最高优先级)
- 靠前的层会覆盖靠后的层
- 基础层排在数组最后(最低优先级)
这种排序方式与 Nuxt 的层解析系统一致,即用户定义的配置和文件优先于基础层中的配置和文件。
LayerDirectories:包含层已解析目录路径的对象。
| 属性 | 类型 | 描述 |
|---|---|---|
root | string | 层的根目录(等同于 rootDir) |
服务器 | string | 用于 Nitro 服务端代码的 server 目录 |
modules | string | 本地模块目录 |
shared | string | 供客户端和服务端共同使用的共享目录 |
app | string | 层的源码目录(等同于 srcDir) |
public | string | 存放静态资源的 public 目录 |
appLayouts | string | Vue 布局组件的 layouts 目录 |
appMiddleware | string | 路由中间件的 middleware 目录 |
appPages | string | 基于文件系统的路由 pages 目录 |
appPlugins | string | Nuxt 插件的 plugins 目录 |
示例
处理来自所有层的文件
// @errors: 2307
// ---cut---
import { defineNuxtModule, getLayerDirectories } from '@nuxt/kit'
import { resolve } from 'pathe'
import { globby } from 'globby'
export default defineNuxtModule({
async setup () {
const layerDirs = getLayerDirectories()
// Find all component files across layers
// Note: layerDirs[0] is the user layer (highest priority)
// Later layers in the array have lower priority
const componentFiles = []
for (const [index, layer] of layerDirs.entries()) {
const files = await globby('**/*.vue', {
cwd: resolve(layer.app, 'components'),
absolute: true,
})
console.log(`Layer ${index} (${index === 0 ? 'user' : 'base'}):`, files.length, 'components')
componentFiles.push(...files)
}
},
})
添加来自多个层的模板
import { addTemplate, defineNuxtModule, getLayerDirectories } from '@nuxt/kit'
import { basename, resolve } from 'pathe'
import { existsSync } from 'node:fs'
export default defineNuxtModule({
setup () {
const layerDirs = getLayerDirectories()
// Add a config file from each layer that has one
for (const dirs of layerDirs) {
const configPath = resolve(dirs.app, 'my-module.config.ts')
if (existsSync(configPath)) {
addTemplate({
filename: `my-module-${basename(dirs.root)}.config.ts`,
src: configPath,
})
}
}
},
})
尊重层优先级
import { defineNuxtModule, getLayerDirectories } from '@nuxt/kit'
import { resolve } from 'pathe'
import { existsSync, readFileSync } from 'node:fs'
export default defineNuxtModule({
setup () {
const layerDirs = getLayerDirectories()
// Find the first (highest priority) layer that has a specific config file
// This respects the layer priority system
let configContent = null
for (const dirs of layerDirs) {
const configPath = resolve(dirs.app, 'my-config.json')
if (existsSync(configPath)) {
configContent = readFileSync(configPath, 'utf-8')
console.log(`Using config from layer: ${dirs.root}`)
break // Use the first (highest priority) config found
}
}
// Alternative: Collect configs from all layers, with user layer taking precedence
const allConfigs = {}
for (const dirs of layerDirs.reverse()) { // Process from lowest to highest priority
const configPath = resolve(dirs.app, 'my-config.json')
if (existsSync(configPath)) {
const config = JSON.parse(readFileSync(configPath, 'utf-8'))
Object.assign(allConfigs, config) // Later assignments override earlier ones
}
}
},
})
检查特定于层的目录
import { defineNuxtModule, getLayerDirectories } from '@nuxt/kit'
import { existsSync } from 'node:fs'
import { resolve } from 'pathe'
export default defineNuxtModule({
setup () {
const layerDirs = getLayerDirectories()
// Find layers that have a specific custom directory
const layersWithAssets = layerDirs.filter((layer) => {
return existsSync(resolve(layer.app, 'assets'))
})
console.log(`Found ${layersWithAssets.length} layers with assets directory`)
},
})
getLayerDirectories 函数通过 WeakMap 进行缓存,以避免对相同的层重复计算目录路径,从而在多次调用时提高性能。此函数返回的目录路径始终包含尾部斜杠,以保持一致性。