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+Element实现增删改查的示例源码
Nov 23 Vue.js
vue3.0中setup使用(两种用法)
Dec 02 Vue.js
vuex Module将 store 分割成模块的操作
Dec 07 Vue.js
利用Vue实现简易播放器的完整代码
Dec 30 Vue.js
vue element和nuxt的使用技巧分享
Jan 14 Vue.js
Vue实现简单计算器
Jan 20 Vue.js
vue使用过滤器格式化日期
Jan 20 Vue.js
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
vue Element-ui表格实现树形结构表格
Jun 07 Vue.js
教你部署vue项目到docker
Apr 05 Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 Vue.js
vue实现简易音乐播放器
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用户指南-cookies部分
2006/10/09 PHP
PHP+Tidy-完美的XHTML纠错+过滤
2007/04/10 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
createElement动态创建HTML对象脚本代码
2008/11/24 Javascript
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
js获得页面的高度和宽度的方法
2014/02/23 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
javascript中HTMLDOM操作详解
2014/12/11 Javascript
jQuery使用fadeout实现元素渐隐效果的方法
2015/03/27 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
React快速入门教程
2017/01/17 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
用Python实现换行符转换的脚本的教程
2015/04/16 Python
使用Python发送各种形式的邮件的方法汇总
2015/11/09 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
如何将 awk 脚本移植到 Python
2019/12/09 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
Django执行源生mysql语句实现过程解析
2020/11/12 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
培训主管岗位职责
2014/02/01 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
财产分割协议书范本
2014/11/03 职场文书
租车协议书
2015/01/27 职场文书
艺术节开幕词
2015/01/28 职场文书
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS
Python函数对象与闭包函数
2022/04/13 Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python