• vue项目实际开发的问题及实用技巧分享(三)


    前两篇文章内容是针对具体组件和业务内容部分,本篇就讲讲vue项目路由模块的优化技巧和方式

    首先来看下我们初始构建vue-cli项目时原本的router/index.js文件

    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. import HelloWorld from '@/components/HelloWorld'
    4. Vue.use(Router)
    5. export default new Router({
    6. routes: [
    7. {
    8. path: '/',
    9. name: 'HelloWorld',
    10. component: HelloWorld
    11. },
    12. ]
    13. })

    沿着这个逻辑我们再新增一个组件就在router里引入对应的组件,现在在src文件下新建我们的业务模块文件夹pages,然后在pages下新建main/index文件并把页面挂载到’/main’路由上

    1. import Main from '@/pages/main'
    2. {
    3. path: '/main',
    4. name: 'Main',
    5. component: Main
    6. }

    如果我们这个main涉及的业务非常繁杂,我们就得不断在main文件下不断加组件然后挂在/main路由下

     然后我们引用就得不断在/main下加children子项

    1. import Child1 from '@/pages/main/mainChild/index1'
    2. import Child2 from '@/pages/main/mainChild/index2'
    3. import Child3 from '@/pages/main/mainChild/index3'
    4. {
    5. path: '/main',
    6. name: 'Main',
    7. component: Main,
    8. children:[
    9. {
    10. path: '/main/child1',
    11. name: 'mainChild1',
    12. component: Child1
    13. },
    14. {
    15. path: '/main/child2',
    16. name: 'mainChild2',
    17. component: Child2
    18. },
    19. {
    20. path: '/main/child3',
    21. name: 'mainChild3',
    22. component: Child3
    23. },
    24. ]
    25. }

    现在我们再加入其他业务mine,car等,再看看router/index内容

    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. import HelloWorld from '@/components/HelloWorld'
    4. import Forms from '@/pages/forms'
    5. import Login from '@/pages/login'
    6. import Main from '@/pages/main/index'
    7. import Child1 from '@/pages/main/mainChild/index1'
    8. import Child2 from '@/pages/main/mainChild/index2'
    9. import Child3 from '@/pages/main/mainChild/index3'
    10. import Car from '@/pages/car/index'
    11. import CarChild1 from '@/pages/car/mainChild/index1'
    12. import CarChild2 from '@/pages/car/mainChild/index2'
    13. import CarChild3 from '@/pages/car/mainChild/index3'
    14. import Mine from '@/pages/mine/index'
    15. import MineChild1 from '@/pages/mine/mainChild/index1'
    16. import MineChild2 from '@/pages/mine/mainChild/index2'
    17. import MineChild3 from '@/pages/mine/mainChild/index3'
    18. import forms from '@/pages/forms'
    19. Vue.use(Router)
    20. export default new Router({
    21. routes: [
    22. {
    23. path: '/',
    24. name: 'HelloWorld',
    25. component: HelloWorld
    26. },
    27. {
    28. path: '/main',
    29. name: 'Main',
    30. component: Main,
    31. children:[
    32. {
    33. path: '/main/child1',
    34. name: 'mainChild1',
    35. component: Child1
    36. },
    37. {
    38. path: '/main/child2',
    39. name: 'mainChild2',
    40. component: Child2
    41. },
    42. {
    43. path: '/main/child3',
    44. name: 'mainChild3',
    45. component: Child3
    46. },
    47. ]
    48. },,
    49. {
    50. path: '/car',
    51. name: 'Car',
    52. component: Car,
    53. children:[
    54. {
    55. path: '/car/child1',
    56. name: 'CarChild1',
    57. component: CarChild1
    58. },
    59. {
    60. path: '/car/child2',
    61. name: 'CarChild2',
    62. component: CarChild2
    63. },
    64. {
    65. path: '/car/child3',
    66. name: 'CarChild3',
    67. component: CarChild3
    68. },
    69. ]
    70. },
    71. {
    72. path: '/mine',
    73. name: 'Mine',
    74. component: Mine,
    75. children:[
    76. {
    77. path: '/mine/child1',
    78. name: 'MineChild1',
    79. component: Child1
    80. },
    81. {
    82. path: '/mine/child2',
    83. name: 'MineChild2',
    84. component: Child2
    85. },
    86. {
    87. path: '/mine/child3',
    88. name: 'MineChild3',
    89. component: Child3
    90. },
    91. ]
    92. },
    93. {
    94. path: '/forms',
    95. name: 'forms',
    96. component: Forms
    97. },
    98. {
    99. path: '/login',
    100. name: 'login',
    101. component: Login
    102. },
    103. ]
    104. })

    如果业务不复杂,组件极少的情况下,这样写也OK,但是通常情况下,我们实际的项目业务内容复杂,几个组件是根本不可能处理完所有的业务逻辑,会产出大量的业务组件。

    如果都这样写,会大大提高我们的维护成本,而且由于每个vue文件使用import导入时会自动加载,会增加性能开销,而且这样写由于路由列表太长,不同模块的路由都凑在了一起,对单页面应用的Vue 来说,这样使用 webpcak 打包后的文件很大,当进入首页时,加载的资源过多,页面会出现白屏的情况,不利于用户体验。针对这些问题我们就需要对router/index内容进行优化处理

    首先,使用路由懒加载来引入各个路由模块,把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应的组件,这样就会更加高效

    {path: '/',name: 'HelloWorld', component: ()=>import('@/components/HelloWorld')},

    然后,对各个不同业务类型的路由对应组件进行拆分,新增modules文件,将拆分后的路由放入

     再在router/index分别引入

    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. import main from './modules/main'
    4. import car from './modules/car'
    5. import mine from './modules/mine'
    6. Vue.use(Router)
    7. console.log(car)
    8. export default new Router({
    9. routes: [
    10. {path: '/',name: 'HelloWorld', component: ()=>import('@/components/HelloWorld')},
    11. main,
    12. car,
    13. mine
    14. ]
    15. })

    这样一个简单的分离就完成了,但是这样写后续的业务代码加一个就得引入一个,原则上基础路由是不让后续再加入当然最好,我们可以将router/index.js作为一个基础路由,后续的模块自动加入。我们再新增一个路由中转allWork.js来处理

    allWork.js

    1. /*
    2. 路由配置地址
    3. ---------------
    4. 动态引入加载路由模块,用动态导入代替静态导入
    5. 注意:
    6. 路由不要放在router文件下的index里面了
    7. 路由导入不要再直接使用import引入
    8. ---------------
    9. */
    10. const modulesFiles = require.context('./modules', true, /\.js$/)
    11. const modules = modulesFiles.keys().reduce((modules, modulePath) => {
    12. const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
    13. const value = modulesFiles(modulePath)
    14. modules[moduleName] = value.default
    15. return modules
    16. }, {})
    17. let allRouter =[]
    18. let keys = Object.keys(modules)
    19. for (let key of keys) {
    20. let v = modules[key]
    21. if(Array.isArray(v)){//加入路由模块js为数组
    22. modules[key].forEach(i=>{
    23. allRouter.push(i)
    24. })
    25. }else{
    26. allRouter.push(modules[key])
    27. }
    28. }
    29. export default [
    30. ...allRouter,
    31. ]

    router/index.js

    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. import allRoutes from './allWork'
    4. Vue.use(Router)
    5. /**
    6. * 如果非全局使用页面 请不要在这里添加任何路由
    7. * 添加路由 --> allWork.js文件内添加
    8. */
    9. export default new Router({
    10. routes: [
    11. {path: '/',name: 'HelloWorld', component: ()=>import('@/components/HelloWorld')},
    12. ...allRoutes,
    13. ]
    14. })
    注:require.context用于模块的批量导入,类同于import引入同一文件夹下多个文件
    参数(directory,useSubdirectories,regExp)
    1.directory: 读取文件的路径
    2.useSubdirectories: 是否遍历文件的子目录 
    3.regExp: 匹配文件的正则表达式
    其返回是一个函数,是该文件夹下的匹配文件的执行环境

    以上就是个人对vue路由的一些简单优化,希望大家多多指正

  • 相关阅读:
    Spring读取.xml和通过Java类配置对比
    ChromaDB教程
    前端-layui动态渲染表格行列与复杂表头合并
    解决ubuntu无法上网问题
    .NET(C#、VB)APP开发——Smobiler平台控件介绍:MediaView
    数学建模学习(82):模拟退火算法(SA,matlab版本)
    CY3.5/CY5/CY5.5/CY7/CY7.5荧光标记壳多糖/壳质/角素Chitin
    计算机网络工程师多选题系列——计算机网络
    基于stm32单片机智能交通灯设计Proteus仿真
    云组机命名
  • 原文地址:https://blog.csdn.net/tan1071923745/article/details/126854043