一、概念概述
1轴咱、網(wǎng)絡工程術語——
路由(routing)是指分組從源到目的地時铭乾,決定端到端路徑的網(wǎng)絡范圍的進程剪廉。
路由是指路由器從一個接口上收到數(shù)據(jù)包,根據(jù)數(shù)據(jù)包的目的地址進行定向并轉發(fā)到另一個接口的過程炕檩。
路由器通過動態(tài)維護路由表來反映當前的網(wǎng)絡拓撲斗蒋,并通過網(wǎng)絡上其他路由器交換路由和鏈路信息來維護路由表。
2笛质、市政工程術語——
管線的“路由”一般可以概述為管線的起點到通往每個目的地的路徑泉沾,即管線的走向位置。
3妇押、web路由
規(guī)定數(shù)據(jù)交換和頁面展現(xiàn)的目標跷究。
二、web路由的基礎
1敲霍、web路由的產(chǎn)生
web路由的基礎是ajax的廣泛應用俊马,尤其是前段開始有能力承擔更多的數(shù)據(jù)通信及與之對應的業(yè)務邏輯丁存。
web路由的作用和好處則是分擔后端處理業(yè)務邏輯的壓力。
2柴我、web路由的構成
ajax在web路由中扮演著數(shù)據(jù)交換的角色解寝,再通過URL的變化和記錄來完成對頁面展現(xiàn)的控制,就構成了一個簡單的web路由系統(tǒng)艘儒。
2.1聋伦、ajax
ajax的作用不言而喻,它是web路由產(chǎn)生和發(fā)展的基石界睁,是web路由的核心觉增。
2.2、URL
URL翻斟,統(tǒng)一資源定位符逾礁,它表示資源文件的位置以及瀏覽器怎樣處理它。
在web路由中杨赤,它的作用并沒有改變敞斋,但是卻強調了更多的特色:
(1)體現(xiàn)頁面刷新:由于ajax是局部刷新數(shù)據(jù),在顯示上只有通過URL的變化來體現(xiàn)頁面的跳轉(實際上并沒有跳轉)疾牲。
(2)前進與后退:由于ajax刷新時植捎,并沒有真正的跳轉,所以瀏覽器在處理前進與后退時會忽略這些刷新阳柔。而web路由就必須hack這些處理方式焰枢,來完成ajax刷新的前進與后退。
三舌剂、web路由:ajax
ajax(Asynchronous Javascript And XML) 的核心是 JavaScript 對象 XMLHttpRequest济锄,是一種支持異步請求的技術,發(fā)展已經(jīng)很成熟霍转,可以直接使用荐绝,而各個框架都有自己的封裝和實現(xiàn)。
四避消、web路由:URL
完成web路由需要達到兩個目標——展示低滩、前進與后退,而實際上這兩個目標是一致的——路徑岩喷。
在處理URL路徑時恕沫,基本要求就是,隨著ajax的請求改變URL纱意,但是必須避免整個頁面的跳轉和刷新(而一般情況下婶溯,URL的變化都會導致頁面的跳轉),否則ajax局部請求的特性就沒有意義了。
1迄委、錨點——#
錨點是頁面內的超鏈接褐筛,本意是用來進行當前頁面特定位置的跳轉。由于是頁面內的跳轉跑筝,使它具有了一個特性——改變了URL死讹,整個頁面不會跳轉。
對應的api—— window.onhashchange曲梗,不過window.onhashchange存在兼容性問題,所以只能使用最原始粗暴的方式——polling(輪詢)妓忍。
2虏两、history.pushState
首先要強調的是,history.pushState的方式是H5添加的新特性世剖,兼容性不言而喻定罢。
使用history.pushState,可以改變URL為任意形式而不會發(fā)生頁面跳轉旁瘫,同時也會添加添加對應的歷史記錄用于前進和后退祖凫。
對應的api—— history.pushState,history.replaceState酬凳,window.onpopstate惠况。
另外,目前web路由的方式經(jīng)常被稱為Pjax宁仔,也就是pushstate+ajax稠屠。
五、業(yè)務邏輯
web路由還有一個重要的部分——業(yè)務邏輯翎苫,主要包換兩個方面:
1权埠、用戶操作——通過ajax請求對應的業(yè)務數(shù)據(jù),進行展示和操作煎谍,并完成URL改變和歷史記錄攘蔽。
2、前進和后退——通過onhashchange和onpopstate監(jiān)聽對應的變化呐粘,根據(jù)對應的參數(shù)做出相應的響應满俗。
六、總結
web路由基于ajax產(chǎn)生和發(fā)展事哭,已經(jīng)被很多框架所實現(xiàn)漫雷,如angularjs、vue鳍咱、react等降盹。
框架的使用好處在于其兼容性、穩(wěn)定性谤辜、提高開發(fā)效率蓄坏、簡化設計等价捧,但是同時也存在一些很明顯的嚴重缺陷——臃腫性、影響性能涡戳、擴展性降低等结蟋。所以在項目開始時,尤其是一些小的項目渔彰,可以考慮自行實現(xiàn)框架中的功能嵌屎。
以后將一起探討怎樣實現(xiàn)一個簡單的路由。