摘要:開發(fā)中路由實現(xiàn)原理開發(fā)中路由實現(xiàn)原理服務(wù)端路由路由前端路由實現(xiàn)比較參考什么是路由根據(jù)不同的地址,展示不同的頁面或者更新頁面局部視圖服務(wù)端路由服務(wù)器端路由管理,常見的開發(fā)模式是前端根據(jù)的不同,使用發(fā)起異步請求,獲取不同的頁面資源,前端獲取資源
Web開發(fā)中路由實現(xiàn)原理
Web開發(fā)中路由實現(xiàn)原理
服務(wù)端路由
Hash路由
History
前端路由實現(xiàn)比較
參考:
什么是路由:
根據(jù)不同的url地址,展示不同的頁面或者更新頁面局部視圖服務(wù)端路由
Demo
服務(wù)器端路由管理,常見的開發(fā)模式是前端根據(jù)url的不同,使用ajax發(fā)起異步請求,獲取不同的頁面資源,前端獲取資源后更新頁面。
后端路由處理,一般是基于前后端沒有分離的項目,html和數(shù)據(jù)綁定發(fā)生在后端(后端渲染),有利于SEO,因為每次發(fā)送請求都需要獲取資源,對服務(wù)器造成資源浪費,前端頁面可能因為網(wǎng)速造成延遲,頁面局部視圖更新,ajax請求不同保存當(dāng)前的請求狀態(tài),不能使用瀏覽器前進后退快捷鍵操作。
server路由處理實現(xiàn)類似于下面實現(xiàn):不同的url請求路徑,返回不同的模板
app.get("", function (req, res) { res.header("Access-Control-Allow-Origin", "*"); res.sendFile( __dirname + "/" + "index.html" ); }) app.get("/home.html", function (req, res) { res.header("Access-Control-Allow-Origin", "*"); res.sendFile( __dirname + "/" + "pages/home.html" ); }) app.get("*", function (req, res) { res.header("Access-Control-Allow-Origin", "*"); res.sendFile( __dirname + "/" + "pages/404.html" ); })Hash路由
Demo
在單頁面(SPA)開發(fā)中,通過Hash可以實現(xiàn)前端路由,hash路由形如:http:localhost:8100/#/home,
在url后綴存在#(錨點),用來做頁面定位,即根據(jù)頁面id將該元素所在的區(qū)域展示在可視區(qū)域,#后面內(nèi)容的改變不會發(fā)送請求到服務(wù)器。
前端路由需要實現(xiàn)一下:
根據(jù)不同的hash展示對應(yīng)的頁面
監(jiān)聽hash值的改變
保存當(dāng)前url的請求狀態(tài)或者參數(shù)(比如頁面刷新和分享鏈接,別人可以獲取同樣的內(nèi)容)
可以實現(xiàn)瀏覽器的前進后退功能
原理:
頁面hash值可以通過 window.location.hash 屬性獲取,當(dāng)url的hash值發(fā)生變化,會觸發(fā)window對象的hashchange事件,通過監(jiān)聽 hashchange 事件,操作 window.location.hash 屬性可以實現(xiàn)
Route.js
function Route(params) { if(!params){ console.log("請檢查初始化數(shù)據(jù)") return false; } this.registeredRoute = []; this.contentId = params.contentId; this.routes = params.routes; this.devStatus = params.devStatus || "none" this.otherRouter = params.otherRouter; this.init(); } Route.prototype = { constructor: Route, init: function() { window.addEventListener("hashchange", (function(event){ var currentHash = location.hash.substring(1) || this.otherRouter; var route = this.routes && this.routes.find(item => item["path"] === currentHash); if(this.devStatus === "log") { console.log("hash has been changed to:", currentHash) } if(route) { this.activeRoute(); this.render(route) } }).bind(this)) var initEvent = new Event("hashchange"); window.dispatchEvent(initEvent); }, //更新視圖 render(route) { if(!$){ console.log("請確保項目正確引入jQuery") return false; } var _routeContent = $(`#${this.contentId}`); if(_routeContent) { var currentView = `current page: ${route["path"]}Params:${JSON.stringify(route["params"])}View:${route["component"]}`; _routeContent.html(currentView) }else { console.log("請綁定需要更新的視圖區(qū)域"); } }, //當(dāng)前激活路由樣式 activeRoute() { var _routeList = $(".route") || []; for(var i=0; i< _routeList.length;i++) { var _item = _routeList[i]; var _classList = _item.classList; var _defActice = !location.hash && _aDome["context"].getAttribute("data-route-param")==="home"); var _aDome = $(_item.getElementsByTagName("a") && $(_item.getElementsByTagName("a")[0]); var _activeBool = _aDome["context"].getAttribute("data-route-param") === location.hash.substring(1) || _defActice; if(_activeBool) { _classList.add("active") } else { _classList.remove("active"); } } } }
index.html 片段
History
Demo
window.history (window是瀏覽器的全局對象,所以window.history和history相同)是瀏覽器提供的用來記錄和操作瀏覽器頁面歷史棧的對象的接口,提供了常用的屬性和方法:
history.back(); //回退 history.go(-1); //等同于history.back(); history.forward(); //前進 history.go(1); //等同forward() window.history.length; //歷史棧頁面的數(shù)量
H5對History進行了擴展,增加了兩個重要的新的方法:
History.pushState() //瀏覽器歷史記錄壓棧,增加一條歷史記錄 History.replaceState() //瀏覽器歷史記錄最后一條數(shù)據(jù)更新,替換當(dāng)前歷史記錄
操作pushState和replaceState方法會觸發(fā)popstate事件,頁面刷新不同瀏覽器事件監(jiān)聽存在差異,Chrome和Safari會觸發(fā)popstate事件,F(xiàn)irefox不會觸發(fā)。
我們可以通過pushState(),replaceState()記錄和更新當(dāng)前url和參數(shù);
pushState(),replaceState()包含三個參數(shù):
state:存儲當(dāng)前參數(shù)的JSON title:短標(biāo)題,瀏覽器實現(xiàn)不統(tǒng)一有些fireFox會直接忽略,可以設(shè)置為null做占位, url:當(dāng)前url,更新瀏覽器url的值前端路由實現(xiàn)比較
hash 路由實現(xiàn): 兼容性比較好,url比較丑陋,不能使用瀏覽器棧操作前進后退
History 路由實現(xiàn): 比較直觀,需要服務(wù)器端配合,用戶體驗好,響應(yīng)快,不需要每次發(fā)送服務(wù)器請求,通過操作瀏覽器歷史棧完成頁面跳轉(zhuǎn),低版本瀏覽器不支持H5特性,建議使用Hash
參考:1.前端路由的前生今世及實現(xiàn)原理
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105111.html
摘要:開發(fā)中路由實現(xiàn)原理開發(fā)中路由實現(xiàn)原理服務(wù)端路由路由前端路由實現(xiàn)比較參考什么是路由根據(jù)不同的地址,展示不同的頁面或者更新頁面局部視圖服務(wù)端路由服務(wù)器端路由管理,常見的開發(fā)模式是前端根據(jù)的不同,使用發(fā)起異步請求,獲取不同的頁面資源,前端獲取資源 Web開發(fā)中路由實現(xiàn)原理 Web開發(fā)中路由實現(xiàn)原理 服務(wù)端路由 Hash路由 History 前端路由實現(xiàn)比較 參考: 什么是路由: 根據(jù)不同...
摘要:什么是單頁面應(yīng)用單頁面應(yīng)用是指用戶在瀏覽器加載單一的頁面,后續(xù)請求都無需再離開此頁目標(biāo)旨在用為用戶提供了更接近本地移動或桌面應(yīng)用程序的體驗。流程第一次請求時,將導(dǎo)航頁傳輸?shù)娇蛻舳耍溆嗾埱笸ㄟ^獲取數(shù)據(jù)實現(xiàn)數(shù)據(jù)的傳輸通過或遠程過程調(diào)用。 什么是單頁面應(yīng)用(SPA)? 單頁面應(yīng)用(SPA)是指用戶在瀏覽器加載單一的HTML頁面,后續(xù)請求都無需再離開此頁 目標(biāo):旨在用為用戶提供了更接近本地...
閱讀 1438·2021-11-19 11:38
閱讀 3573·2021-11-15 11:37
閱讀 816·2021-09-30 09:48
閱讀 967·2021-09-29 09:46
閱讀 906·2021-09-23 11:22
閱讀 1884·2019-08-30 15:44
閱讀 3403·2019-08-26 13:58
閱讀 2392·2019-08-26 13:26