路由划分模块并自动引入

创建路由文件

在这里插入图片描述

主路由文件index.js 内容,这样配置后只要在router目录下按照xxx.router.js的格式创建路由文件,就可以自动加入到路由容器中

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

let routerList = []

function importAllRouter(r) {
  r.keys().forEach( keys => {
    routerList.push(r(keys).default)
  });
}

/**
 * 
 *  require.context  是webpack里面的方法  用于获取文件   
 * 第一个参数是文件目录  
 * 第二个参数是是否查看子目录  
 * 第三个参数是什么类型的文件
 * 
 * */
importAllRouter( require.context( './', false,/\.router\.js/))

const routes = [
  ...routerList , // 解构  注意这一步
  {
    path: '/',
    name: 'Home',
    component: () => import('views/Home/home')
  }
]

const router = new VueRouter({
  routes
})

export default router

其他模块路由文件,有一个主路由路径剩余全为子路由

export default {
	{
    path: '/index',
    name: 'index',
    component: () => import('views/index/index'),
    children:[

	]
  }
}

vue-router模块划分问题

路由整体结构

路由拆分指的是将路由的文件,按照模块(modules)拆分,这样方便路由的管理,更主要的是方便多人开发。具体要不要拆分,那就要视你的项目情况来定了,如果项目较小的话,也就一二十个路由,那么是拆分是非常没必要的。但倘若你开发一些功能点较多的商城项目,路由可以会有一百甚至几百个,那么此时将路由文件进行拆分是很有必要的。

src
|   
-- router  路由目录
    |
    ---- common.js          //通用路由:声明通用路由
    ---- index.js           //导出相关配置
    ---- permission.js      //权限验证
    ---- config            
           |
           ---- _import_development.js    //开发环境
           ---- _import_production.js     //生产环境
    ---- modules            //业务模块
           |
           ---- index.js    //自动化处理文件:自动引入路由的核心文件
           ---- home.js     //路由1

1、区分线上和开发环境---config

开发环境使用懒加载会导致热更新,导致更新变慢,所以开发环境使用全量默认加载,生产环境使用懒加载

1)_import_development.js

/**
 * @return  开发环境使用全量默认加载
 */
module.exports = file => require('@/views/'   file   '.vue').default

2)_import_production.js

/**
 * @return  生产环境使用懒加载
 */
module.exports = file => () => import('@/views/'   file   '.vue')

2、通用路由---common.js

const _import = require('./config/_import_'   process.env.NODE_ENV)

export default [
  // 默认页面
  {
    path: '/',
    redirect: '/index',
  },
  // 无权限页面
  {
    path: '/nopermission',
    name: '无权限页面',
    component: _import('NoPermission')
  },
  // 404
  {
    path: '*',
    name: '404',
    component: _import('404')
  }
]

3、业务模块---modules

以home.js为例

const _import = require('../config/_import_'   process.env.NODE_ENV)
/**
 * 业务模块home
 */
export default [
  // 首页
  {
    path: '/index',
    name: '首页',
    component: _import('home/index'),
    meta: {
      keepAlive: false,
      requiresAuth: true // 要求验证的页面,在此情况下其子页面也会被验证.
    },
  }
]

业务模块导出(关键部分):

modules下的index.js
/**
 * 自动化处理文件:自动引入路由的核心文件
 */
const files = require.context('.', true, /\.js$/)

let configRouters = []
/**
 * inject routers
 */
files.keys().forEach(key => {
  if (key === './index.js') return
  configRouters = configRouters.concat(files(key).default) // 读取出文件中的default模块
})
export default configRouters 

4、导出所有---index.js

import Vue from 'vue'
import Router from 'vue-router'
import RouterModule from './modules' // 引入业务逻辑模块
import RouterCommon from './common' // 引入通用模块
 
import { routerMode } from '@/config/urls.js'
 
Vue.use(Router)
 
const router = new Router({
  mode: routerMode, // history模式需要服务端支持
  scrollBehavior(to, from, savedPosition) {
    if (savedPosition) { //如果savedPosition存在,滚动条会自动跳到记录的值的地方
      return savedPosition
    } else {
      return { x: 0, y: 0 } //savedPosition也是一个记录x轴和y轴位置的对象
    }
  },
  routes: [
    ...RouterCommon,
    ...RouterModule,
  ]
})
 
export default router

5、权限验证---permission.js

import Vue from 'vue'
import router from './index'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

NProgress.configure({
  easing: 'ease', // 动画方式    
  speed: 500, // 递增进度条的速度    
  showSpinner: false, // 是否显示加载ico    
  trickleSpeed: 200, // 自动递增间隔    
  minimum: 0.3 // 初始化时的最小百分比
})

const cancelAxios = (next) => {
  let axiosPromiseArr = window.__axiosPromiseArr;
  if (!!axiosPromiseArr && axiosPromiseArr.length) {
    // console.log(axiosPromiseArr);
    let len = axiosPromiseArr.length;
    while (len--) { //从后向前终止请求,并删除 cancelToken,避免数组索引带来的问题
      axiosPromiseArr[len].cancel('cancel');
      axiosPromiseArr.splice(len, 1);
    }
    //或者:window.__axiosPromiseArr = [];
  }
  next();
}

router.beforeEach((to, from, next) => {
  // 每次切换页面时,调用进度条
  NProgress.start();
  if (to.matched.some(record => record.meta.requiresAuth)) { // 哪些需要验证
    if (!sessionStorage.getItem("token")) { // token存在条件   
      next({
        path: '/nopermission', // 验证失败要跳转的页面
        query: {
          redirect: to.fullPath // 要传的参数
        }
      })
    } else {
      cancelAxios(next);
    }
  } else {
    cancelAxios(next);
  }
})

router.afterEach((to, from) => {
  // 在即将进入新的页面组件前,关闭掉进度条
  NProgress.done()
  document.title = to.name || ''
})

export default router

使用方式:

main.js

import router from './router/permission'

new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。

vue路由划分模块并自动引入方式的更多相关文章

  1. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  2. 关闭iOS原生MPVolumeView音频路由菜单

    我正在使用MPVolumeView允许用户在使用我的应用程序时控制他喜欢的音频路径.该代码显示了该视图:当用户点击音频路由按钮时,会出现一个带有可用选项的菜单.问题:显示音量视图的屏幕可能需要隐藏,因为我的应用程序处理各种事件,我想同时隐藏音频路由菜单我的问题:有没有人知道是否可以手动关闭MPVolumeView的音频路由选择菜单而无需用户按下取消按钮?解决方法在iOS8上,您可以使用以下使用私有API的代码

  3. iOS:使用蓝牙音频输出(kAudioSessionProperty_OverrideCategoryEnableBluetoothInput)AudioSession

    >如果有可用的A2DP设备,我的音频路由将始终自动切换到kAudioSessionOutputRoute_BluetoothA2DP路由.如何防止此路线更改?我希望你们中的一些人可以帮助我解决这些问题.这对我对CoreAudio的整体理解,特别是AudioSession框架,真的有帮助.解决方法AudioSession是一项棘手的业务.1.BluetoothHFPaudiooutputisonlypossibleincaseofAudioSessionkAudioSessionCategory_PlayA

  4. Swift3.0 Swift2.3 获取IP地址 获取网关地址

    最近需要在Swift项目中获取路由器的网关地址,在网上找了半天的代码也没发现太多有价值的东西,而且大多都是OC代码,很少有Swift的相关代码,只找到了一个通过Swift代码获取设备IP的代码,最后实在没办法只能曲线救国了。下面上代码:思路就是把获取到的设备IP地址的最后一位手动修改为”1”,前面三位不需要修改,比如我的手机ip地址是192.168.31.212,所以网关地址就是192.168.31.1。最近苹果更新了Swift3.0,这里更新一下代码。

  5. Swift3.0服务端开发(二) 静态文件添加、路由配置以及表单提交

    今天博客中就来聊一下Perfect框架的静态文件的添加与访问,路由的配置以及表单的提交。也就是webroot的文件目录变地方了。后方的尾随闭包是对响应的处理。action的地址就是我们在服务器端配置的路由地址“127.0.0.1:8181/login”,而表单提交的方式是POST。

  6. Swift Web 开发之 Vapor - 路由二

    路由参数Vapor提倡使用类型安全的路由参数来接收数据,我们可以在路由方法中使用Swift类型来指定参数类型,Vapor会在内部解析并将参数返回给闭包以供使用,非常方便。Swift中处处有协议,路由参数也是如此,我们所见例子中的Int其实就是Vapor给实现了StringInitializable协议,当然String也已经默认实现。throw另外一大特性就是可以直接在路由中抛出异常,我们可以throw任何遵从Swift.Error协议的对象,当然Vapor已经为我们封装好了几个常用的Error来方便我们

  7. swift – Singleton模式和正确使用Alamofire的URLRequestConvertible

    如果是这样,我该如何设置经理的基础?此外,如果我使用这个管理器//这可以与上面显示的路由器结构一起工作?我是Alamofire图书馆的新手,迅速。然而,当您获得超过6或7例的情况下,这很快就会变得很快。首先,您的模型对象需要符合RouterObject协议。最后一个问题是您无法直接在Routerenum中存储baseURL或OAuthToken。但是,如果您只是使用默认会话触发网络,那么sharedInstance可能就足够了。

  8. Android VPNService路由排除

    我正在使用OpenVPN和ICS附带的新VpnServiceAPI有没有办法从VPN隧道中定义IP地址的排除?

  9. android – 如何以编程方式在蓝牙和手机之间选择媒体音频

    我需要有一组按钮,其操作类似于JB拨号器中的媒体输出选择器,它将选择“耳机”“扬声器”和“电话听筒”.我可以打开和关闭扬声器,但是在标准手机和蓝牙耳机之间进行媒体输出之间的切换使我望而却步.我如何构建和选项,如控制媒体输出的拨号器?

  10. vue自定义加载指令v-loading占位图指令v-showimg

    这篇文章主要为大家介绍了vue自定义加载指令和v-loading占位图指令v-showimg的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部