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 组件注册
Nov 20 Vue.js
vuex页面刷新导致数据丢失的解决方案
Dec 10 Vue.js
Vue——解决报错 Computed property "****" was assigned to but it has no setter.
Dec 19 Vue.js
vue导入.md文件的步骤(markdown转HTML)
Dec 31 Vue.js
vue动态设置路由权限的主要思路
Jan 13 Vue.js
聊聊vue 中的v-on参数问题
Jan 29 Vue.js
详解Vue.js 可拖放文本框组件的使用
Mar 03 Vue.js
vue backtop组件的实现完整代码
Apr 07 Vue.js
Vue实现动态查询规则生成组件
May 27 Vue.js
vue实现列表拖拽排序的示例代码
Apr 08 Vue.js
vue 自定义组件添加原生事件
Apr 21 Vue.js
Vue ECharts实现机舱座位选择展示功能
May 15 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实现图象锐化代码
2007/06/14 PHP
php中使用DOM类读取XML文件的实现代码
2011/12/14 PHP
php使用百度翻译api示例分享
2014/01/31 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
2017/09/28 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
一段利用WSH修改和查看IP配置的代码
2008/05/11 Javascript
js实现拉伸拖动iframe的具体代码
2013/08/03 Javascript
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
JavaScript实现网页加载进度条代码超简单
2015/09/21 Javascript
PHP7新特性简述
2017/06/11 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
vue实现随机验证码功能的实例代码
2019/04/30 Javascript
Javascript通过控制类名更改样式
2019/05/24 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
[01:03:59]2018DOTA2亚洲邀请赛3月30日 小组赛B组VGJ.T VS Secret
2018/03/31 DOTA
使用Python脚本操作MongoDB的教程
2015/04/16 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
django缓存配置的几种方法详解
2018/07/16 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
Python IDLE或shell中切换路径的操作
2020/03/09 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
分享一个H5原生form表单的checkbox特效代码
2018/02/26 HTML / CSS
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
运动鞋、街头服装、手表和手袋的实时市场:StockX
2020/11/25 全球购物
学校感恩教育活动总结
2014/07/07 职场文书
民族团结演讲稿范文
2014/08/27 职场文书
学校国庆节活动总结
2015/03/23 职场文书
工伤调解协议书
2016/03/21 职场文书
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS
「月刊Comic Alive」2022年5月号封面公开
2022/03/21 日漫
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers