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 表单输入框不支持focus及blur事件的解决方案
Nov 17 Vue.js
基于vue项目设置resolves.alias: '@'路径并适配webstorm
Dec 02 Vue.js
Vue实现点击当前行变色
Dec 14 Vue.js
vue+openlayers绘制省市边界线
Dec 24 Vue.js
基于vue的video播放器的实现示例
Feb 19 Vue.js
Vue基本指令实例图文讲解
Feb 25 Vue.js
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
开发一个封装iframe的vue组件
Mar 29 Vue.js
详解vue身份认证管理和租户管理
May 25 Vue.js
简单聊聊Vue中的计算属性和属性侦听
Oct 05 Vue.js
Vue elementUI表单嵌套表格并对每行进行校验详解
Feb 18 Vue.js
vue ant design 封装弹窗表单的使用
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
有道搜索和IP138的IP的API接口(PHP应用)
2012/11/29 PHP
jQuery新闻滚动插件 jquery.roller.js
2011/06/27 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
jquery图片不完全按比例自动缩小的简单代码
2013/07/29 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
jQuery is()函数用法3例
2014/05/06 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
JavaScript中Boolean对象的属性解析
2015/10/21 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
jQuery操作复选框(CheckBox)的取值赋值实现代码
2017/01/10 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
Python3写入文件常用方法实例分析
2015/05/22 Python
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
python 2.7.13 安装配置方法图文教程
2018/09/18 Python
python中字典按键或键值排序的实现代码
2019/08/27 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
2020/03/09 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
String和StringBuffer的区别
2015/08/13 面试题
服务行业个人求职的自我评价
2013/12/12 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
综合素质评价自我评价
2015/03/06 职场文书
教你使用vscode 搭建react-native开发环境
2021/07/07 Javascript
css实现左上角飘带效果的完整代码
2022/03/18 HTML / CSS