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 相关文章推荐
深入了解Vue3模板编译原理
Nov 19 Vue.js
vue监听滚动事件的方法
Dec 21 Vue.js
vue中配置scss全局变量的步骤
Dec 28 Vue.js
Vue.extend 登录注册模态框的实现
Dec 29 Vue.js
vue调用微信JSDK 扫一扫,相册等需要注意的事项
Jan 03 Vue.js
使用vue3重构拼图游戏的实现示例
Jan 25 Vue.js
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 Vue.js
vue脚手架项目创建步骤详解
Mar 02 Vue.js
关于Vue Router的10条高级技巧总结
May 06 Vue.js
Vue全家桶入门基础教程
May 14 Vue.js
详解Vue slot插槽
Nov 20 Vue.js
vue动态绑定style样式
Apr 20 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
Zend公司全球首推PHP认证
2006/10/09 PHP
curl实现站外采集的方法和技巧
2014/01/31 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
2016/10/20 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
javascript动态改变img的src属性图片不显示的解决方法
2010/10/20 Javascript
jQuery源码分析-04 选择器-Sizzle-工作原理分析
2011/11/14 Javascript
js DOM 元素ID就是全局变量
2012/09/20 Javascript
javascript 回调函数详解
2014/11/11 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
2016/05/27 Javascript
如何利用模板将HTML从JavaScript中抽离
2016/10/08 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
使用vux实现上拉刷新功能遇到的坑
2018/02/08 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
JavaScript命名空间模式实例详解
2019/06/20 Javascript
[03:03]2014DOTA2国际邀请赛 EG战队专访
2014/07/12 DOTA
[06:09]辉夜杯主赛事开幕式
2015/12/25 DOTA
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python使用PIL缩放网络图片并保存的方法
2015/04/24 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
django实现用户注册实例讲解
2019/10/30 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
用python批量移动文件
2021/01/14 Python
毕业生自我鉴定
2013/12/04 职场文书
上班上网检讨书
2014/01/29 职场文书
ktv周年庆活动方案
2014/08/18 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
投标单位介绍信
2015/05/05 职场文书