淺入深出Vue之自動(dòng)化路由
在軟件開(kāi)發(fā)的過(guò)程中,"自動(dòng)化"這個(gè)詞出現(xiàn)的頻率是比較高的。 自動(dòng)化測(cè)試 , 自動(dòng)化數(shù)據(jù)映射 以及各式的代碼生成器。這些詞語(yǔ)的背后,也說(shuō)明了在軟件開(kāi)發(fā)的過(guò)程中,對(duì)于那些 重復(fù) 、 千篇一律 的事情。人們總是想讓它自己完成,來(lái)解放我們的雙手。
“懶惰”是進(jìn)步的動(dòng)力
為什么要自動(dòng)化路由
路由自動(dòng)化在于解決以下的問(wèn)題:
- 每次新建頁(yè)面時(shí)的重復(fù)操作:在路由文件中添加對(duì)應(yīng)的路由對(duì)象。
- 路由與代碼耦合:路由依賴于路由對(duì)象的硬編碼,當(dāng)某一路由發(fā)生變動(dòng)時(shí),勢(shì)必需要修改對(duì)應(yīng)的路由對(duì)象。當(dāng)路由層級(jí)、路徑發(fā)生改變時(shí),甚至可能面臨的是整個(gè)路由對(duì)象數(shù)組的重寫(xiě)。
- 路由之間進(jìn)行跳轉(zhuǎn)時(shí)的硬編碼。
目的很簡(jiǎn)單,在開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)者僅需要做兩件事即可:
- 為這個(gè)路由命名
- 在對(duì)應(yīng)的目錄下創(chuàng)建
.vue
文件
開(kāi)發(fā)過(guò)程中只需要做這兩步,無(wú)需再去關(guān)心路由對(duì)象如何編寫(xiě)。
甚至可以忽略第一步,對(duì)于小型項(xiàng)目而言。
自動(dòng)化路由規(guī)則
這些規(guī)則一部分是給開(kāi)發(fā)者看,另一部分是給程序看的:
- 路由目錄需要指定
- 路由目錄下,每一層(一個(gè)文件夾即為一層) 必須 要有一個(gè)
Layout.vue
文件,用來(lái)渲染子路由。 - 路由目錄下的組件路徑即為其對(duì)應(yīng)的路由,比如指定了
src/views
文件夾,里面的src/views/admin/users
對(duì)應(yīng)的路由即是:localhost/admin/users
。 - 路由目錄下不區(qū)分大小寫(xiě),統(tǒng)一轉(zhuǎn)換成小寫(xiě)處理。
以上便是我們制定的自動(dòng)化路由規(guī)則。
定義
先提取出三個(gè)概念:
自動(dòng)化路由的提供者,它就是 對(duì)外 開(kāi)放的接口,開(kāi)發(fā)者只需要使用它就可以。
視圖,指的是一個(gè)視圖組件的相關(guān)信息,比如路徑、名稱等等。
路由,指的是解析視圖之后對(duì)應(yīng)的路由對(duì)象,用于生成 vue-router
的路由對(duì)象。
開(kāi)始開(kāi)發(fā)
由于代碼過(guò)長(zhǎng),這里將代碼上傳至 Github
, 有興趣的童鞋可以去看看。
這里只描述一下整體流程以及關(guān)鍵部分的代碼思路。
- 先通過(guò)
require.context
獲取到指定目錄下的所有.vue
文件。 - 通過(guò)前綴以及排序操作,將其還原成目錄結(jié)構(gòu)。
- 通過(guò)還原的目錄結(jié)構(gòu),進(jìn)行解析。
- 將解析后的結(jié)構(gòu)轉(zhuǎn)換成路由對(duì)象。
其中最關(guān)鍵的地方便是通過(guò) require.context
獲取到的文件列表還原成原來(lái)的樹(shù)形結(jié)構(gòu)。
還原成樹(shù)形結(jié)構(gòu)之后就可以對(duì)應(yīng)樹(shù)形結(jié)構(gòu)進(jìn)行路由對(duì)象的生成了。
首先將文件列表進(jìn)行排序,根據(jù)文件的深度進(jìn)行排序,深度淺的在前,深的在后。
_getViews(dir) { let views = []; let keys = dir.keys(); for (let index in keys) { let path = keys[index]; let component = dir(path); views.push(View.create(path, component.default || component)) } views = views.sort((x, y) => { return x.Deep > y.Deep ? 1 : -1; }); return views; }
根據(jù)排序后的列表對(duì)目錄結(jié)構(gòu)進(jìn)行還原:
/** * 解析views,生成對(duì)應(yīng)的目錄結(jié)構(gòu) * @private */ _generateDirectory() { for (let index in this._views) { let view = this._views[index]; this._directory.addView(view); } }
addView
方法:
addView(view) { if(this.isCurrentDirectoryView(view)) { this._views.push(view); } else if(this._isInSubDirectory(view)) { this._addInSubDirectory(view); } else { let newSubDirectory = this._createSubDirectory(view); newSubDirectory.addView(view); this._subDirectory.push(newSubDirectory); } }
對(duì)于目錄還原時(shí)有三種可能:
- 這個(gè)文件就是當(dāng)前目錄下的文件
- 這個(gè)文件是當(dāng)前目錄下已有子目錄的文件
- 這個(gè)文件是當(dāng)前目錄下子目錄的文件,且為首次出現(xiàn)
將目錄還原后,就可以根據(jù)目錄生成對(duì)應(yīng)的路由對(duì)象。并且在生成時(shí)可以做一些定制化的需求,比如開(kāi)篇提出來(lái)的需求:
- 如果當(dāng)前文件是
Layout.vue
,即默認(rèn)為當(dāng)前路由的根路由 - 如果當(dāng)前文件是
Index.vue
, 即默認(rèn)為當(dāng)前層的空路由(根路由入口直接渲染)
使用方法,將 router.js
中的路由對(duì)象替換成自動(dòng)生成的即可:
import Vue from 'vue' import Router from 'vue-router' import Generator from './routerGenerator/generator'; Vue.use(Router); let generator = new Generator(require.context('./views', true, /\.vue$/)); export default new Router({ routes: [generator.generate()] })
目錄結(jié)構(gòu)如下:
效果如下:
github地址: https://github.com/WhileKing/ea-router
npm地址: https://www.npmjs.com/package/ea-router
npm包安裝使用:
npm i ea-router
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue用BMap百度地圖實(shí)現(xiàn)即時(shí)搜索功能
這篇文章主要為大家詳細(xì)介紹了vue用BMap百度地圖實(shí)現(xiàn)即時(shí)搜索功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09vue使用自定義事件的表單輸入組件用法詳解【日期組件與貨幣組件】
這篇文章主要介紹了vue使用自定義事件的表單輸入組件用法,結(jié)合實(shí)例形式詳細(xì)分析了vue.js日期組件與貨幣組件相關(guān)操作技巧及注意事項(xiàng),需要的朋友可以參考下2020-06-06vuex獲取state對(duì)象中值的所有方法小結(jié)(module中的state)
這篇文章主要介紹了vuex獲取state對(duì)象中值的所有方法小結(jié)(module中的state),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04在vue中使用echarts(折線圖的demo,markline用法)
這篇文章主要介紹了在vue中使用echarts(折線圖的demo,markline用法),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07Vue編寫(xiě)可顯示周和月模式的日歷 Vue自定義日歷內(nèi)容的顯示
這篇文章主要為大家詳細(xì)介紹了Vue編寫(xiě)可顯示周和月模式的日歷,Vue自定義日歷內(nèi)容的顯示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06前端Vue學(xué)習(xí)之購(gòu)物車項(xiàng)目實(shí)戰(zhàn)記錄
購(gòu)物車是電商必備的功能,可以讓用戶一次性購(gòu)買多個(gè)商品,下面這篇文章主要給大家介紹了關(guān)于前端Vue學(xué)習(xí)之購(gòu)物車項(xiàng)目的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07詳解IOS微信上Vue單頁(yè)面應(yīng)用JSSDK簽名失敗解決方案
這篇文章主要介紹了詳解IOS微信上Vue單頁(yè)面應(yīng)用JSSDK簽名失敗解決方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11