webpack的require.context()實現路由“去中心化”管理


最近在開發一個大型vue單頁面應用的時候,項目最初是將所有的路由寫在一個router.js的文件里。

const router = new Router({
  mode: "history",
  routes: [{
      path: '/',
    name: 'Index',
    component: include('index', 'home')
  },
  {
    path: '/aboutus',
    name: 'aboutUs',
    component: include('aboutUs', 'home')
  },
  {
    path: '/feedback',
    component: include('feedback', 'home'),
    redirect: '/feedback/service',
    children: [{
      path: '/feedback/service',
      component: include('Service', 'home/feedback'),
    },
    {
      path: '/feedback/view',
      component: include('view', 'home/feedback'),
    }]
  }]
}
隨着業務代碼的增長路由很快就會嵌套更深,新增很多路由,這樣不利於后續的代碼維護。

然而require.context()是什么?

想要實現去中心化管理我們就需要使用到require.context()

然后有了require.context()這個方法,我們就可以通過正則匹配引入相應的文件模塊。

require.context(directory, useSubdirectories, regExp)

require.context()有三個參數:

  • directory:說明需要檢索的目錄
  • useSubdirectories:是否檢索子目錄
  • regExp: 匹配文件的正則表達式

使用require.context()改造后的allRouters.js文件

示例:

const routes = require.context('@/view', true, /router.js$/)
// (你創建了)一個view文件夾下面(不包含子目錄),能被require請求到,所有文件名以  .router.js 結尾的文件形成的上下文(模塊)。
 
export default routes.keys().map(key => (routes(key).default || routes(key)))

以后只要業務模塊route文件遵循統一的目錄結構,業務模塊route就能被自動關聯到這個allRouters.js里。

然后在route下index.js里引入
import Vue from 'vue'
import Router from 'vue-router'
import allRouters from './allRouters'
Vue.use(Router)
export function createRouter () {
  const router = new Router({
    'mode': 'history',
    'routes': [
    ...allRouters
    ]
  })
}...等等其他操作

這個思路也可應用於其他想要實現"去中心化"管理的功能模塊,比如vuex的store模塊。  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM