在vite中根据view中的文件自动生成路由(vue3)

news/2024/11/18 8:38:39/

前景提要:在实现这个功能的过程中:我碰到了三个问题
1.在vite中无法使用fs模块
2.vite不支持动态更改,需要去下载插件,其实我下载了还是没有用
3.动态路由中不可以使用别名,因为解析不到

首先展示我是怎么实现的

直接上代码了,注释里面有,主要是要去vite官网学一下glob的用法,我的代码已经尽量精简了,注释掉的代码可看可不看,做实验用的。
这里我封装成了一个方法,但是你需要自己逐步实验
这个文件的文件路径是src/utils/routerGlob.js

export function getRouterList() {// 第一个注意这个文件路径,这里很重要,不然你获取不到const fileObject = import.meta.glob('../views/**/*.vue')let fileList = []for (let fileListItem in fileObject) {let name = fileListItem.replace(/..\/views\//, '').replace(/\/.*.vue/, '').toLocaleLowerCase()// 这里面不能够采用别名,推测是不能解析到// let routerUrl = fileListItem.replace(/../, '@')//为什么要这样子写fileObject[fileListItem],这里的话vite会自动帮你引入这个组件,你不使用vite提供的方法去引入,不好意思,我真没找到其他方法。let routerUrl = fileObject[fileListItem]let listItem = { name, routerUrl }fileList.push(listItem)}return fileList
}

然后是router/index.js


import { createRouter, createWebHistory } from "vue-router"
import { getRouterList } from '../until/routerGlob'
const fileObject = import.meta.glob('../views/**/*.vue')
const fileList = getRouterList()
const routes = [{path: "/",name: "Home",component: () => import("@/views/home/index.vue"),},
]
fileList.forEach(item => {routes.push({path: `/${item.name}`,name: item.name,component: item.routerUrl,})})
console.log(routes)const router = createRouter({history: createWebHistory(),routes
})
router.beforeEach((to, from, next) => {next();
})
export default router

我这样子已经实现了,这是我的git地址

git地址啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,点击这里
然后是那三个问题
1.fs是node的内置模块,除非你自己抄源码过来,重写一遍,可以用。
2.vite中是支持动态更改的,但是你需要用人家的东西Glob这个方法。
3.别名用不了,这就是一个字符,解析不到。

都看到这里了我就补充一下我用fs写的(参考了一下某位大佬的,不过碰到了一丢丢问题,忘记截图错误了,后面都解决了,好像是__dirname不对劲)

//创建文件目录
import fs from 'fs'
import path from 'path'
import {fileURLToPath } from 'url'
//读取的时候要用第二个str,创建,删除的时候用第一个str
// let str = path.join(__dirname, "abc");
const __filenameNew=fileURLToPath(import.meta.url)
const __dirnameNew=path.dirname(__filenameNew)
let str = path.join(__dirnameNew, "../views");
let dirList=[]
//创建文件目录:
/*fs.mkdir(str, function (err) {if (err) {console.log("创建目录失败");} else {console.log("创建目录成功");}
})*///删除文件目录:
/*fs.rmdir(str, function (err) {if (err) {console.log("删除目录失败");} else {console.log("删除目录成功");}
})*///读取文件目录
fs.readdir(str, function (err, files) {if (err) {console.log("读取目录失败");} else {// console.log(files);files.forEach(function (obj) {// 获取每一完整的目录文件// 如果这里的str替换成了__dirnameNew会在当前目录下查找// 这里的第一个参数相当于一个绝对路径,第二个参数相当于在一个绝对路径中进行操作// cd ../views 这样子的一个操作let filepath = path.join(__dirnameNew, '../views/' + obj)// 获取文件状态// let stats = fs.statSync(filepath);// if (stats.isFile()) {//     console.log("是一个文件",obj);// } else if (stats.isDirectory()) {//     console.log("是一个目录",obj);// }})}
})

http://www.ppmy.cn/news/4170.html

相关文章

JSP运动会信息网站

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 模块划分:通知类型、通知信息、裁判信息、运动员信息、项目类型、项目 信息、场地信息、项目安排、报名信息…

python采集付费论文批量下载 并保存到文档,毕设论文再也不愁......

嗨害大家好鸭! 我是小熊猫鸭~ 大家是不是在写毕业论文的时候 需要参考某一段的内容 要用到复制粘贴,但是吧,某文库就需要付费, 就老难受了… 我们今天就来解决这个"老难受" 环境使用: python 3.8 pych…

JVM Java内存模型(JMM)

很多人将Java内存结构与Java内存模型傻傻分不清,Java内存模型是Java memory model(JMM)的意思。简单地说,JMM定义了一套在多线程的环境下读写共享数据(比如成员变量、数组)时,对数据的可见性、有…

傻白入门芯片设计,盘点GPU业界的大佬(十五)

在PC个人电脑时代,英特尔(Inter)是无可争议的芯片巨头,凭借着X86架构在数据中心CPU中的压倒性地位,一度垄断全球90%的市场份额。然而在人工智能时代,以英伟达(NVIDIA)为首的GPU、AI芯…

早餐店+饮品+烘焙,如何做多群体早中晚生意?

早餐吃好、午餐吃饱、晚餐少吃,如今早餐店已经不再局限于豆浆油条、鸡蛋面包,同时还有饮品,芳芳珍早鲜奶店是一家早餐店,30个SKU销量很高,一天中有近75%的销售都集中在早餐场景。 这家早餐店是如何做的? 01…

5G基站射频传导测试研究与应用

【摘 要】基站是5G网络中的重要节点,其RF(射频)性能与其网络覆盖范围和服务质量高度相关。详细介绍了5G基站的射频测试标准,并通过对测试项目物理意义和实际影响的分析,给出了射频传导测试方法以及测试环境构建中的注意事项,通过对实际基站的测试及对其结果的分析,指出…

Servlet转发与重定向

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:JAVA开发者…

c拾遗-二级指针、数组内函数

1、c语言中二级指针 用途1:一般被用在多维数组的环境中,一个二级指针可以指向一个二维数组; 用途2:二级指针作为函数参数使用时,可以通过函数修改实参指针值的目的。 对于第二点用途的理解: c语言的函数调…