1.vue-router是什么俊马?
它是一個vue.js下的路由組件。
2.路由是什么肩杈?
router潭袱,即“路由”。路由是一個網(wǎng)絡(luò)工程里面的術(shù)語锋恬。James F.Kurose,Keith W.Ross著.陳鳴譯.《計(jì)算機(jī)網(wǎng)絡(luò)》中有講到
路由(routing)是指分組從源到目的地時屯换,決定端到端路徑的網(wǎng)絡(luò)范圍的進(jìn)程
在WEB開發(fā)的世界里面,路由其實(shí)指的就是控制我們在瀏覽器中輸入的URL應(yīng)該走入哪個頁面中的一個組件。
3.為什么需要路由彤悔?
在最原始的ASP嘉抓,以及傳統(tǒng)的 開發(fā)中,我們在瀏覽器路徑中輸入URL晕窑,位于服務(wù)器上的WEB服務(wù)器程序(比如說Apache httpd)則會自動更加這URL抑片,找到WEB目錄下對應(yīng)的文件,通過一些解析器將服務(wù)端腳本執(zhí)行之后返回的HTML內(nèi)容發(fā)回給瀏覽器杨赤,瀏覽器將收到的HTML渲染出來敞斋。這時WEB服務(wù)器程序(比如說Apache httpd)自己就完成了這個路由功能。
比如說wordpress的后臺就是
http://www.changwei.me/wp-admin/post-new.php
直接請求對應(yīng)的php腳本疾牲,該腳本執(zhí)行之后返回HTML給瀏覽器渲染植捎。
但是現(xiàn)在越來越流行框架開發(fā)了,很多PHP項(xiàng)目都是用框架開發(fā)的阳柔,框架都遵循單一入口原則焰枢,也就是在WEB目錄下只有一個index.php文件和一些靜態(tài)資源文件,其他所有業(yè)務(wù)邏輯以及框架本身的代碼都寫在WEB目錄外面的各種文件中舌剂,所有入站請求都到達(dá)入口文件济锄,入口文件再通過請求的各種參數(shù)來判斷應(yīng)該是將請求分發(fā)給WEB目錄外的哪個文件(控制器)執(zhí)行。我們?nèi)绻行夷軌蛘业揭恍┦褂梅浅@系腜HP框架開發(fā)的網(wǎng)站霍转,觀察他們的站內(nèi)連接荐绝,各種URL上面有可能會像這種樣子
http://xxx.com/index.php?module=home&controller=passport&action=login
等等,這就是該框架通過入口文件接受module避消,controller低滩,action等參數(shù)來判斷究竟應(yīng)該把該請求分發(fā)給哪個模塊,哪個控制器沾谓,哪個操作去處理。這樣就可以十分神奇的實(shí)現(xiàn)只有一個文件就處理千千萬萬邏輯的方法戳鹅。
到了現(xiàn)在WEB2.0時代均驶,信息分享是很多用戶上網(wǎng)的主要操作,如果你的URL足夠簡短美觀枫虏,那么用戶只需要簡單的輸入URL就可以訪問對應(yīng)的網(wǎng)頁妇穴,而不用輸入一堆module,controller隶债,action之類的非IT行業(yè)的用戶看起來不明不白的單詞腾它。同時也為了SEO(搜索引擎優(yōu)化)和URL美觀,因此路由便誕生了死讹。
路由可以進(jìn)一步將類似于
http://xxx.com/index.php?module=home&controller=passport&action=login
這樣的URL簡寫成
http://xxx.com/login
這樣看起來是不是美觀了很多瞒滴。
4.Apache自帶URL重寫可以達(dá)到上述目的,為什么還需要路由?
?
如果你會問出這個問題妓忍,你一定還沒有體驗(yàn)過PHP的Laravel框架虏两。
我們看一看Laravel在輸出hello world的時候,用xphrof做性能測試的結(jié)果世剖,發(fā)現(xiàn)路由相關(guān)的操作占據(jù)了大量執(zhí)行時間定罢,從中也可以側(cè)面看出Laravel中路由的功能強(qiáng)大。
前面說了這么多旁瘫,還是沒講到路由究竟好在哪祖凫?為什么不用各種WEB服務(wù)器自帶的URL重寫功能?
首先URL重寫只是單純的正則表達(dá)式匹配請求URL酬凳,然后將請求轉(zhuǎn)發(fā)到真正的URL路徑上執(zhí)行惠况,這里從高內(nèi)聚低耦合的角度來看,URL重寫將一個WEB程序的業(yè)務(wù)邏輯分散到了WEB服務(wù)器程序和WEB程序兩個地方粱年。并且我們從Apache服務(wù)器程序換到nginx上還需要修改配置文件售滤,移植性降低了。另外我們有的時候需要對一組URL進(jìn)行一些特殊的操作台诗,比如說所有后臺操作請求都必須驗(yàn)證登錄操作完箩,在傳統(tǒng)的開發(fā)中,要么在每一個后臺操作的腳本(控制器)中寫一個驗(yàn)證操作拉队,更加高級一點(diǎn)的會include一個驗(yàn)證腳本弊知,但是怎么看還是不夠優(yōu)雅。現(xiàn)在有路由了粱快,可以將一組和后臺操作有關(guān)的URL都劃分到一個分組中秩彤,然后綁定中間件(和java中的過濾器,攔截器很像)
5.vue-router在前端開發(fā)中能帶來什么好處事哭?
前面講了這么多關(guān)于路由的好處漫雷,其實(shí)都指的是后端路由。也就是前后端不分離的項(xiàng)目中的路由△⒃郏現(xiàn)在我們是前后端分離項(xiàng)目中降盹,路由有什么用,能帶來什么好處呢谤辜?
我們先看看知乎客戶端
??這是知乎客戶端的兩個頁面蓄坏。
我們先來看看這個需求:
有一天產(chǎn)品經(jīng)理說需要開發(fā)一個像知乎一樣的SPA,要求底部有一些按鈕固定不動的底部導(dǎo)航欄丑念,頂部也有一個帶有返回按鈕的導(dǎo)航欄固定不動涡戳,點(diǎn)擊底部導(dǎo)航欄之后,中間部分的頁面應(yīng)該跳轉(zhuǎn)到對應(yīng)功能頁面脯倚,點(diǎn)擊頂部的返回按鈕之后渔彰,應(yīng)該返回到之前的頁面。
如果是傳統(tǒng)開發(fā),你肯定第一想到的是使用css的display進(jìn)行切換顯示不同的vue組件(components)實(shí)現(xiàn)胳岂。
但是我們看到知乎底部的“我的”按鈕存在一個邏輯编整,如果用戶沒有登錄,那么他會跳轉(zhuǎn)到登錄頁面乳丰,如果已經(jīng)登錄則顯示對應(yīng)頁面掌测。如果使用傳統(tǒng)開發(fā),那么就會顯得很不優(yōu)雅产园。
另外還要考慮一個情況汞斧,就是一般訪問SPA的用戶都是移動端,移動端最需要考慮的就是加載速度什燕,并且不能耗費(fèi)用戶過多流量粘勒。那么就需要讓用戶點(diǎn)擊這個按鈕之后再加載這個組件的相關(guān)代碼,以及該組件需要請求的數(shù)據(jù)屎即,最后在渲染頁面庙睡。
最后就是URL要美觀漂亮,并且URL可以動態(tài)接受參數(shù)技俐,比如說網(wǎng)易云音樂這個非常典型的SPA項(xiàng)目便使用了后端路由并且可以接受參數(shù)
http://music.163.com/#/my/m/music/playlist?id=121597667
要滿足這些需求的話乘陪,在vue.js下使用vue-router是最合適不過的了。
6.vue-router都提供了什么雕擂?
1.前端路由(編程式導(dǎo)航 · GitBook):讓頁面中的部分內(nèi)容可以無刷新的跳轉(zhuǎn)啡邑,就像原生APP一樣。
2.懶加載(懶加載 · GitBook):結(jié)合異步組件以及在組建的created鉤子上觸發(fā)獲取數(shù)據(jù)的ajax請求(數(shù)據(jù)獲取 · GitBook)可以最大化的降低加載時間井赌,減少流量消耗谤逼。
3.重定向(重定向 和 別名 · GitBook):可以實(shí)現(xiàn)某些需要根據(jù)特定邏輯改變頁面原本路由的需求,比如說未登錄狀態(tài)下訪問“個人信息”時應(yīng)該重定向到登錄頁面仇穗。
4.美化URL(HTML5 History 模式):還記得前面網(wǎng)易云音樂的URL嗎流部?
http://music.163.com/#/my/m/music/playlist?id=121597667
網(wǎng)易云音樂網(wǎng)頁版的URL里面幾乎都帶有一個#號,大家可能會疑惑纹坐,#號是URL的hash部分枝冀,并不會傳遞到服務(wù)端,那么#號起什么作用呢恰画?其實(shí)前端路由器就是通過URL的hash部分來像傳統(tǒng)的后端路由器一樣判斷某些請求需要交給哪個前端組件處理宾茂。
但是大家都會覺得URL里面帶一個#號太丑了瓷马,要是能像傳統(tǒng)WEB應(yīng)用一樣的URL多好拴还。這個時候vue-router提供的“HTML5 History 模式”就“完美”解決了這個問題。
為什么前面的完美要加上引號呢欧聘?
請參考官方文檔:
不過這種模式要玩好片林,還需要后臺配置支持。因?yàn)槲覀兊膽?yīng)用是個單頁客戶端應(yīng)用,如果后臺沒有正確的配置费封,當(dāng)用戶在瀏覽器直接訪問 http://oursite.com/user/id 就會返回 404焕妙,這就不好看了。
所以呢弓摘,你要在服務(wù)端增加一個覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態(tài)資源焚鹊,則應(yīng)該返回同一個index.html 頁面,這個頁面就是你 app 依賴的頁面韧献。
這里還要引出另一個話題末患,就是為什么前端路由的時候需要改變URL呢?前面提到了WEB2.0時代是一個信息分享的時代锤窑,如果用戶切換到了另一個頁面璧针,但是URL仍然顯示的是index.html,那么用戶想要分享這個頁面給他的朋友渊啰,他的朋友訪問到的則只是這個SPA的首頁探橱,并不是這個分享的用戶本身希望他朋友看到的頁面。因此前端路由在改變頁面的時候必須讓URL跟著一起變绘证。這樣同時也近似完美地解決了歷史上ajax導(dǎo)致瀏覽器返回前進(jìn)按鈕失效的問題隧膏。
5.前置操作,中間件迈窟,過濾器私植,攔截器(導(dǎo)航鉤子 · GitBook)
在后端路由中都有前置操作,中間件车酣,過濾器曲稼,攔截器等概念。前端路由也可以有的湖员,vue-router本身較為完美的支持了這些功能贫悄,讓你做前端SPA開發(fā)就像后端開發(fā)一樣。在第三點(diǎn)提到的用戶未登錄重定向的判斷邏輯就可以寫在這里娘摔。
6.路由元信息(路由元信息 · GitBook):后端路由中可以對路由規(guī)則進(jìn)行分組窄坦,比如說把所有需要登錄才能訪問的頁面劃分為一組。vue-router并沒有路由規(guī)則分組功能凳寺,但是它提供了路由元信息鸭津,可以在元信息中定義一些規(guī)則,在路由鉤子中再去判斷這些規(guī)則肠缨,進(jìn)行相應(yīng)的操作逆趋。
7.滾動位置控制(滾動行為 · GitBook):相對于官方翻譯的滾動行為,我更喜歡自己將他翻譯為“滾動位置控制”晒奕,官方文檔對于它的作用已經(jīng)講的比較通俗易懂了闻书,大家可以參閱官方文檔學(xué)習(xí)名斟。