vue使用require.context实现动态注册路由


Posted in Vue.js onDecember 25, 2020

需求场景:

在日常的功能练习和调试过程中,需要一个demo项目进行功能测试,由于频繁.vue页面的同时,又要再router.js文件里面注册路由,感觉有点无聊和枯燥。基于此出发点,考虑能否自动读取文件夹下的文件进行路由注册。

借鉴思路:

参考vue的功能基础组件的自动化全局注册,看到一个require.context方法,可以读取某个文件夹下的文件信息。因此考虑,使用这个方法,获取views文件夹下的.vue页面,文件夹名称作为路由名称

require.context的使用介绍:

一个webpack的api,通过执行require.context函数获取一个特定的上下文,主要用来实现自动化导入模块,在前端工程中,如果遇到从一个文件夹引入很多模块的情况,可以使用这个api,它会遍历文件夹中的指定文件,然后自动导入,使得不需要每次显式的调用import导入模块

页面代码:

如下图示,views文件夹下的内容,都需要进行路由注册。

文件的路径有2种,(1)简单的vue功能页面,直接挂在views文件夹下;(2)复杂的页面,在views下在新建文件夹进行处理。

目前需要自动注册的路由页面,是针对“直接挂在views文件夹”下的页面。(因为views下的二级页面,暂时没有想到好的方案)

vue使用require.context实现动态注册路由

router/index.js页面代码

心路历程:

(1)一开始的想法,是想着用数组对象的方式定义好,路由名称和引入的路径地址,但是觉得还是不够自动化,新建.vue文件的时候还是需要手动添加;

(2)后来想到用使用require.context方法得到fileName,然后根据字符串裁减和拼接,得到我所需的url和文件相对路径;

例如: component: () =>import(【变量】),但是后来发现,import()里面,不能使用变量!!!!!!!!!

原因:根据es6module语法,由于import是静态执行,所以不能使用表达式和变量这些只有在运行时才能得到结果的语法结构。

(3)由由于import的使用限制,不能动态使用() =>import的语法,因此在考虑,能否直接替换掉这种异步加载引入的写法。经过分析,得出pathConfig字段里面有一个属性的内容,是指定的vue页面的default模块内容。经测试,可以使用。

pathConfig的打印内容如下示:

vue使用require.context实现动态注册路由

(4)因此“views”文件夹下的".vue"文件,引入成功,并用变量routerAry存储起来,使用concat方法把其他需要手动注册的路由信息,连接起来,进行路由注册。

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)


// 查询指定文件夹下的vue页面,自动注册路由
// 仅适用于:一个文件夹下的多个路由页面。用于简单的页面的注册
// pathConfig.default的内容,是指定的vue页面的default模块内容,等同于: () => import('xxxx')
const contextInfo = require.context('../views', false, /.vue$/);
let routerAry = []
contextInfo.keys().forEach(fileName => {
  const pathConfig = contextInfo(fileName)
  let path = "/" + fileName.substring(2,fileName.length-4)
  routerAry.push({
    path,
    component: pathConfig.default
  })
})

const routerList = [
  {
    path: "/",
    redirect: "/animate",
  },
  {
    path: "/openlayers",
    component: () => import('../views/openlayers/openlayers')
  },{
    path: "/render",
    component: () => import('../views/render/render')
  },{
    path: '/vuex',
    component: () => import('../views/vuex/vuex')
  },{
    path: "/echarts",
    component: () => import('../views/echarts/echarts')
  },{
    path: "/ztree",
    component: () => import('../views/ztree/ztree')
  },{
    path: "/ocxplayer",
    component: () => import('../views/ocxplayer/ocxplayer')
  },{
    path: "/animation",
    component: () => import('../views/animation/animation')
  },
]
const newRouterAry = routerList.concat(routerAry)
const router = new VueRouter({
  routes: newRouterAry
})
export default router

以上就是vue使用require.context实现动态注册路由的详细内容,更多关于vue 动态注册路由的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue使用vant中的checkbox实现全选功能
Nov 17 Vue.js
vue使用echarts图表自适应的几种解决方案
Dec 04 Vue.js
vue中利用three.js实现全景图的完整示例
Dec 07 Vue.js
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
vue 在单页面应用里使用二级套嵌路由
Dec 19 Vue.js
如何封装Vue Element的table表格组件
Feb 06 Vue.js
vue中三级导航的菜单权限控制
Mar 31 Vue.js
vue-element-admin项目导入和导出的实现
May 21 Vue.js
vue+springboot实现登录验证码
May 27 Vue.js
Vue中插槽slot的使用方法与应用场景详析
Jun 08 Vue.js
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 Vue.js
ant design vue的form表单取值方法
Jun 01 Vue.js
vue 使用rules对表单字段进行校验的步骤
Dec 25 #Vue.js
vue 实现基础组件的自动化全局注册
Dec 25 #Vue.js
vue 使用class创建和清除水印的示例代码
Dec 25 #Vue.js
基于vue+echarts数据可视化大屏展示的实现
Dec 25 #Vue.js
vue3使用vue-count-to组件的实现
Dec 25 #Vue.js
vue+openlayers绘制省市边界线
Dec 24 #Vue.js
vue项目中openlayers绘制行政区划
Dec 24 #Vue.js
You might like
php中json_encode中文编码问题分析
2011/09/13 PHP
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
PHP中遍历数组的三种常用方法实例分析
2019/06/24 PHP
详解php反序列化
2020/06/10 PHP
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
Node.js事件驱动
2015/06/18 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
如何在vue 中引入使用jquery
2020/11/10 jQuery
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
python文件选择对话框的操作方法
2019/06/27 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
Python中包的用法及安装
2020/02/11 Python
英国最大的在线奢侈手表零售商:Jura Watches
2018/01/29 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
黄河象教学反思
2014/02/10 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
python读取mnist数据集方法案例详解
2021/09/04 Python
MySQL七大JOIN的具体使用
2022/02/28 MySQL
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server