You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vite中获取src/pages下含子文件夹的.vue文件列表?

在Vite中递归获取pages目录下所有Vue组件的路径与名称

我的src/pages文件夹下包含多个子文件夹及若干.vue组件,此前使用Webpack时,可通过以下代码获取页面路径与名称列表:

export default require
  .context("../pages", true, /^\.\/.*\.vue$/)
  .keys()
  .map(page => page.slice(2).replace(".vue", ""))
  .filter(page => page !== "Index")
  .map(page => ({
    file: page,
    title: createTitle(page),
    path: slugify(kebabCase(page))
  }));

但Vite不支持该方式,我尝试使用const pages = import.meta.glob('../pages/*.vue'),仅能获取根目录下的文件,无法获取子文件夹内的文件。请问如何在Vite中实现该需求?


解决方案

要在Vite中递归匹配所有子文件夹内的.vue文件,核心是使用通配符**实现深度遍历,以下是具体实现:

1. 递归匹配所有Vue文件

使用import.meta.glob的递归语法,匹配pages目录下所有层级的.vue文件:

// 匹配pages目录及所有子目录下的.vue文件
const pages = import.meta.glob('../pages/**/*.vue', { eager: true })
  • **:表示匹配任意层级的子目录
  • { eager: true }:开启立即加载模式,和Webpack的require.context同步加载行为一致;若不需要同步加载,可移除该参数,此时返回的是模块的懒加载函数

2. 转换为目标格式

按照原Webpack代码的逻辑处理路径,生成包含文件路径、标题、路由路径的列表:

import { kebabCase } from 'lodash'
import slugify from 'slugify'

// 自定义标题生成函数,可根据需求调整
function createTitle(pagePath) {
  return pagePath.split('/')
    .map(segment => segment.charAt(0).toUpperCase() + segment.slice(1))
    .join(' - ')
}

export default Object.keys(pages)
  // 裁剪路径:去掉前缀'../pages/'和后缀'.vue'
  .map(page => page.replace('../pages/', '').replace('.vue', ''))
  // 排除Index页面
  .filter(page => page !== 'Index')
  // 生成目标结构
  .map(page => ({
    file: page,
    title: createTitle(page),
    path: slugify(kebabCase(page))
  }))

3. 注意事项

  • 若你的createTitle、slugify、kebabCase工具函数逻辑不变,可直接复用原代码
  • Vite的import.meta.glob返回的键是完整的相对路径,因此需要用replace('../pages/', '')替代原Webpack代码中的slice(2)

内容的提问来源于stack exchange,提问作者geoidesic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 09:03:19