vite+vue3+ts中使用require.context | 报错require is not defined | 获取文件夹中的文件名

vite+vue3+ts中使用require.context|报错require is not defined|获取文件夹中的文件名

目录

一、问题背景

如题在vite+vue3+ts中使用required.context时报错如下:

代码:需求为获取文件夹中的后缀为.vue的文件相对路径

js 复制代码
const files = require.context('@/views', true, /\.vue$/)
const result = []
files.keys().forEach((key) => {
    result.push({
        label: key.replace(/(\.\/|\.vue)/g, ''),
        value: key.replace(/(\.\/|\.vue)/g, '')
    })
})

报错如下

按照网上搜到的解决方案在代码中加入两行代码(如下)后,产生新的报错如下:

js 复制代码
import { createRequire } from 'module';
const require = createRequire(import.meta.url);

二、报错原因

require.context()webpack用来查找文件内容的,在vite中不适用。webpack官网对require.context的详解如下:

网址 : requirecontext

三、解决方法

vite中可以使用import.meta.glob()方法实现导入资源,注意import.meta.globEager()已弃用。

官网详解

网址import.meta.glob

修改后可用的代码如下

js 复制代码
// 获取src/pages下的vue文件地址
searchFiles () {
    const files = import.meta.glob( '@/pages/**/*.vue', { eager: true })
    console.log('files',files);
    const result = []
    Object.keys(files).forEach(fileName=>{
        // console.log('fileName',fileName);
        result.push({
            label: fileName.replace(/(\.\/|\.vue)/g, ''),
            value: fileName.replace(/(\.\/|\.vue)/g, '')
        })
    })
    this.vue_files = result
    console.log('vue files',this.vue_files);
}

打印出的files格式如下:如果想获得文件的相对路径,则用Object.keys()获取到files对象的key值即可

注:/**的意思是匹配所有文件夹及里面的子文件夹,相当于reqiure.context中第二个参数useSubdirectories = true的作用。

复制代码
/**的意思是所有文件夹及里面的子文件夹
/*是所有文件夹,不含子文件夹
相关推荐
kisloy17 小时前
【反爬虫】极验4 W参数逆向分析
java·javascript·爬虫
XPoet17 小时前
AI 编程工程化:MCP——给你的 AI 员工打通外部能力
前端·后端·ai编程
夏雪之晶莹18 小时前
JSON语法结构
javascript
笨笨狗吞噬者18 小时前
小程序包体积分析利器 -- vite-plugin-component-insight
前端·微信小程序·uni-app
吴声子夜歌18 小时前
Vue3——v-for指令
前端·javascript·vue
你的牧游哥18 小时前
Cursor IDE Rules / Skills / Subagents 前端项目配置全指南
前端·ide
音仔小瓜皮18 小时前
【Vue】什么时候用Ref?什么时候用shallowRef?
前端·javascript·vue.js
码喽7号18 小时前
vue学习五:前端路由VueRouter
前端·vue.js·学习
史迪仔011218 小时前
[QML] 交互事件深度解析:鼠标、键盘、拖拽
前端·c++·qt
ZC跨境爬虫18 小时前
海南大学交友平台开发实战 day11(实现性别图标渲染与后端数据关联+Debug复盘)
前端·python·sqlite·html·json