vue3 + ts + vite + pinia 封装动态路由

我这个是纯前端的 目前项目在搭建阶段 所以可能有些不足 希望能给大伙带来一点参考

老规矩 直接上代码

router/indnex.ts

注意,这个是无 # 号路由模式

lStorage:封装一个浏览器缓存方法 同等于 localStorage,set 等价于 setItem,get 等价于 getItem
SYSTEM_ROUTES:全局路由,存储浏览器缓存用的
getRoutes:模拟接口获取需要注入的路由数据
import {
   
	RouteRecordRaw,
	createRouter,
	createWebHistory, // 使用HTML5 History API,无'#'
	// createWebHashHistory, // 用于不支持HTML5 History API的环境,带'#'
} from 'vue-router'

import {
    getRoutes } from '@/api/test'
import {
    store } from '@/store/index'
import {
    lStorage } from '@/utils/storage'

// 全局布局导入
const Layout = () =>
	import(/* webpackChunkName: "layout" */ '@/page/layout/index.vue').then(
		(m) => m.default
	)
	
// 静态路由表 - 确保每个路由对象遵循正确的类型定义
const staticRoutes: RouteRecordRaw[] = [
	// 对于重定向路由,明确指定redirect属性
	{
   
		path: '/',
		redirect: '/home',
	},
	{
   
		path: '/404',
		component: () => import('@/page/error/404.vue'),
		meta: {
    hidden: true, title: '404' },
	},
	{
   
		path: '/:catchAll(.*)', // 不识别的path自动匹配404
		redirect: '/404',
	},
	// 对于常规路由,不包含redirect属性
	{
   
		path: '/login',
		component: () => import('@/page/login/index.vue'),
		meta: {
    hidden: true, title: '登录' },
	},
]

// 带有布局的子路由
const childRoutes = [
	{
   
		path: '/home',
		name: 'home',
		component: () => import('@/views/home/index.vue'),
		meta: {
   
			hidden: false, // 是否隐藏路由
			title: '首页', // 标题
			keepAlive: true, // 是否缓存路由组件
			icon: 'dashboard', // 图标
			hasPerm: ['viewHome'], // 权限
		},
	},
]

// 合并静态路由和带布局的子路由
const routes = [
	...staticRoutes,
	{
    path: '/', component: Layout, name: 'layout', children: childRoutes },
]

// 路由守卫
router.beforeEach(async (to, from, next) => {
   
	let res = null
	// 注入动态路由 判断是否被刷新过
	if (
		Array.isArray(store.routes().routes) &&
		store.routes().routes.length === 0
	) {
   
		// 如果本地有记录
		if (Array.isArray(lStorage.get('SYSTEM_ROUTES'))) {
   
			res = lStorage.get
### Vue3 + TypeScript + Vite 构建的完整项目示例 以下是几个典型的基于 Vue3TypeScriptVite 的完整项目示例,这些项目可以在 GitHub 上找到并作为学习和参考的对象: #### 1. **Vue3 Admin Template** 这是一个现代化的企业管理后台模板,使用了 Vue3ViteTypeScript 技术栈。它集成了 Element Plus 作为 UI 库,并提供了完整的国际化支持、权限控制等功能。 特点: - 基于 Vue3 的 Composition API 编写[^2]。 - 集成 ESLint 和 Prettier 进行代码质量校验[^4]。 - 提供详细的文档说明以及模块化的目录结构设计。 GitHub 地址: https://github.com/coderwhy/vue3-admin-template --- #### 2. **Naive Admin** 该项目是一个高效的前端解决方案,适用于中小型业务系统的快速开发。它采用了 Naive UI 替代传统的 Ant Design 或者 Element Plus,同时保持了高度灵活性。 亮点: - 支持多语言切换机制。 - 利用 Pinia 实现状态管理[^1]。 - Sass 文件用于全局样式定制。 GitHub 地址: https://github.com/JokerHub/naive-admin --- #### 3. **Netease Cloud Music Clone** 此项目模仿了网易云音乐的核心功能,展示了如何结合 Vue3Vite 来创建复杂的交互界面。开发者分享了自己的心得,提到最初尝试时对 Composition API 不熟悉,但最终适应后觉得非常方便[^5]。 主要技术点: - Axios 请求拦截器封装。 - 动态路由加载与懒加载策略。 - 自定义歌词解析逻辑及其渲染过程优化。 GitHub 地址: https://github.com/liuwave/netease-music --- #### 4. **Vitesse Lite** 由 Anthony Fu 开发的小巧精悍的基础框架,适合初学者入门或者小型个人作品展示用途。尽管体积较小,但它依然遵循最佳实践原则,例如启用严格模式下的 TypeScript 类型推断[^3]。 核心优势: - 内置 Dark Mode 主题切换能力。 - 即插即用式的第三方库集成方式(如 Iconify 图标集合)。 - 轻量级的同时保留扩展性。 GitHub 地址: https://github.com/antfu/vitesse-lite --- ### 总结 以上列举了几种不同类型的 Vue3 + TypeScript + Vite 项目实例,涵盖了从基础教程到实际生产环境中的应用场景。无论是想深入理解某个特定知识点还是希望借鉴整体架构思路,都可以从中受益匪浅。 ```javascript // 示例:简单演示 Vue3 中使用 TypeScript 定义 Props 的方法 import { defineComponent } from 'vue'; export default defineComponent({ props: { title: { type: String, required: true, }, }, }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值