如何用vite动态导入vue的路由配置详解

 更新时间:2025年04月29日 08:27:16   作者:星极天下第一  
这篇文章主要介绍了如何用vite动态导入vue的路由配置的相关资料,动态导入路由模仿了uniapp的页面配置文件结构,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在Vue应用中,通过路由可以实现不同页面之间的切换,同时也可以实现页面之间的传参和控制页面的显示与隐藏。但是我们在开发的过程中,会发现在路由配置中的路由配置和我们的项目结构高度重复,在我们修改页面文件结构时非常的麻烦与复杂,这时候,如果可以动态的导入路由,就可以大大提示我们项目的可维护性。

我们在开发中会经常听见一句话,约定大于配置,路由的动态导入也是这句话应用的一种,我们这里动态导入路由模仿了在uniapp进行小程序开发的页面配置文件,要求有以下几点:

  • 所有的页面都必须配置到/src/pages文件夹下;
  • 所有的页面文件层级必须是/src/pages/页面文件夹名称/;
  • 所有的页面文件中必须有page.ts作为配置文件和index.vue作为页面入口文件;

结构展示如下:

page.ts文件展示:

//home的page.ts
export default {
  title: '首页',
  menuOrder: 1,
  childrens: [
    `../pages/homechildren`
  ]
}
//homechildren的page.ts
export default {
  title: '首页的子组件',
  menuOrder: 1,
  isChild: true,
}
//login的page.ts
export default {
  title: '登录',
  menuOrder: 2
}

此时我们要通过vite的函数import.meta.glob()和import()扫描pages文件夹动态生成路由,代码如下:

//路由配置文件
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'

const pages = import.meta.glob('../pages/**/page.ts', {
  eager: true,
  import: 'default'
})

const components = import.meta.glob('../pages/**/index.vue')

const getChildRoutes = async (childrens: string[]) => {
  const res = [];

  for (const item of childrens) {
    const pageModule = await import(`${item}/page.ts`);
    const componentModule = await import(`${item}/index.vue`);

    const routePath = item.replace('../pages/', '').replace('/page.ts', '') || '/';
    const name = routePath.split('/').filter(Boolean).join('-') || 'index';

    res.push({
      path: routePath,
      name,
      component: componentModule.default,
      meta: pageModule.default
    });
  }

  return res;
};

const routes = Object.entries(pages).filter(([path, meta]: [string, any]) => !meta.isChild).map(([path, meta]: [string, any]) => {
  const compPath = path.replace('page.ts', 'index.vue')
  path = path.replace('../pages', '').replace('/page.ts', '') || '/';
  const name = path.split('/').filter(Boolean).join('-') || 'index';

  return {
    path,
    name,
    component: components[compPath],
    meta: meta,
    children: !!meta.childrens ? getChildRoutes(meta.childrens) : []
  } as RouteRecordRaw
})

const router = createRouter({
  history: createWebHistory(),
  routes: routes,
})

//路由重定向
router.beforeEach((to, from, next) => {
  if (to.path === '/') {
    next('/home')
  } else if (!routes.some(route => route.path === to.path)) {
    next('/home')
  } else {
    next()
  }
  
})

export {
  router
}

效果展示:

路由对象展示:

总结 

到此这篇关于如何用vite动态导入vue的路由配置的文章就介绍到这了,更多相关vite动态导入vue路由配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue中添加语音播报功能的实现

    vue中添加语音播报功能的实现

    本文主要介绍了vue中添加语音播报功能的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • vue为自定义路径设置别名的方法

    vue为自定义路径设置别名的方法

    这篇文章介绍了vue为自定义路径设置别名的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • vue 获取视频时长的实例代码

    vue 获取视频时长的实例代码

    这篇文章主要介绍了vue 获取视频时长的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • 详解Vue 单文件组件的三种写法

    详解Vue 单文件组件的三种写法

    这篇文章主要介绍了详解Vue 单文件组件的三种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • vue使用原生swiper代码实例

    vue使用原生swiper代码实例

    这篇文章主要介绍了vue使用原生swiper代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Vue使用Multiavatarjs生成自定义随机头像的案例

    Vue使用Multiavatarjs生成自定义随机头像的案例

    这篇文章给大家介绍了Vue项目中使用Multiavatarjs生成自定义随机头像的案例,文中通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-10-10
  • vue.js路由mode配置之去掉url上默认的#方法

    vue.js路由mode配置之去掉url上默认的#方法

    今天小编就为大家分享一篇vue.js路由mode配置之去掉url上默认的#方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • vue窗口变化onresize详解

    vue窗口变化onresize详解

    这篇文章主要介绍了vue窗口变化onresize,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Vue动态组件实现异常处理方法

    Vue动态组件实现异常处理方法

    Vue3动态组件怎么进行异常处理?下面本篇文章带大家聊聊Vue3 动态组件异常处理的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • Vue3项目中env文件的配置和使用指南

    Vue3项目中env文件的配置和使用指南

    在现代前端开发中,项目通常需要在不同的环境中运行,例如开发环境、测试环境和生产环境,每个环境可能需要不同的配置,通过使用 .env 文件,可以方便地管理这些环境变量,避免硬编码配置,本文给大家介绍了Vue3项目中env文件的配置指南,需要的朋友可以参考下
    2025-03-03

最新评论