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 24 Vue.js
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
在vue中动态修改css其中一个属性值操作
Dec 07 Vue.js
详解vue中使用transition和animation的实例代码
Dec 12 Vue.js
vue实现图书管理系统
Dec 29 Vue.js
vue实现树状表格效果
Dec 29 Vue.js
jenkins自动构建发布vue项目的方法步骤
Jan 04 Vue.js
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
vue组件的路由高亮问题解决方法
May 11 Vue.js
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
May 25 Vue.js
vue Element-ui表格实现树形结构表格
Jun 07 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
Drupal7中常用的数据库操作实例
2014/03/02 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
ThinkPHP打水印及设置水印位置的方法
2016/10/14 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
禁止你的左键复制实用技巧
2013/01/04 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
利用JS实现页面删除并重新排序功能
2016/12/09 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
Node.js的进程管理的深入理解
2019/01/09 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
2020/04/29 Javascript
用js实现放大镜效果
2020/10/28 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
2014/07/04 Python
使用Python3 编写简单信用卡管理程序
2016/12/21 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
2018/02/24 Python
基于Python pip用国内镜像下载的方法
2018/06/12 Python
Python如何调用JS文件中的函数
2019/08/16 Python
django序列化serializers过程解析
2019/12/14 Python
selenium 多窗口切换的实现(windows)
2020/01/18 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
python全栈开发语法总结
2020/11/22 Python
毕业生找工作自荐书
2014/06/30 职场文书
合作协议书格式
2014/08/19 职场文书
小学安全工作总结2015
2015/05/18 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android