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 数据操作相关总结
Dec 17 Vue.js
手写Vue源码之数据劫持示例详解
Jan 04 Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
vue element el-transfer增加拖拽功能
Jan 15 Vue.js
vue-resource 拦截器interceptors使用详解
Jan 18 Vue.js
vue form表单post请求结合Servlet实现文件上传功能
Jan 22 Vue.js
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 Vue.js
Vue项目中如何封装axios(统一管理http请求)
May 02 Vue.js
vue3中provide && inject的使用
Jul 01 Vue.js
Vue.js中v-for指令的用法介绍
Mar 13 Vue.js
vue cli4中mockjs在dev环境和build环境的配置详情
Apr 06 Vue.js
Vue3实现简易音乐播放器组件
Aug 14 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版(1)
2006/10/09 PHP
编写php应用程序实现摘要式身份验证的方法详解
2013/06/08 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
关于php开启错误提示的总结
2019/09/24 PHP
对laravel的session获取与存取方法详解
2019/10/08 PHP
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
JS中getYear()和getFullYear()区别分析
2014/07/04 Javascript
js中将String转换为number以便比较
2014/07/08 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
2017/03/04 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
原生JS+Canvas实现五子棋游戏实例
2017/06/19 Javascript
JS实现的简单四则运算计算器功能示例
2017/09/27 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
微信小程序云开发 生成带参小程序码流程
2019/05/18 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
vue实现抽屉弹窗效果
2020/11/15 Javascript
使用IPython下的Net-SNMP来管理类UNIX系统的教程
2015/04/15 Python
Python爬取网易云音乐热门评论
2017/03/31 Python
python数据封装json格式数据
2018/03/04 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
python zip()函数的使用示例
2020/09/23 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
为什么Runtime.exec(“ls”)没有任何输出?
2014/10/03 面试题
数控加工专业毕业生自荐信
2013/09/27 职场文书
领导接待方案
2014/03/13 职场文书
化学教育专业自荐信
2014/07/04 职场文书
党校学习心得体会范文
2014/09/09 职场文书
张思德观后感
2015/06/09 职场文书
Pandas自定义选项option设置
2021/07/25 Python