關於單頁應用(SPA)的經驗之談
單頁站點優劣
傳輸資料少
服務可不中斷
前後端開發更規範
首次載入資料大耗時長
極差的SEO(搜尋引擎優化)
導航需要人為處理
單頁應用的實現方式
iframe
ajax+div+historyapi
基於iframe製作單頁部落格
1 $('a[target="contentFrame"]').click(function(){ 2 var $this = $(this), 3 url = $this.attr('href'), 4 mainHost = location.host, 5 i = url.indexOf(mainHost); 6 $active.removeClass('active'); 7 $active = $this.parent('li'); 8 $active.addClass('active'); 9 if(i !== -1){ 10 url = url.substr(i + mainHost.length); 11 } 12 window.location.hash = '#' + url; 13 return false; 14 });
在iframe頁面(子頁面)中,也有一段類似的js,為iframe中的頁面超連結繫結事件
1 $('a').click(function(){ 2 var url = $(this).attr('href') 3 if(url && url != '#' && url.indexOf('http') == 0){ 4 var mainHost = window.parent.location.host, 5 i = url.indexOf(mainHost); 6 if(i !== -1){ 7 url = url.substr(i + mainHost.length); 8 } 9 window.parent.location.hash = '#' + url; 10 } 11 return false; 12 });
注意這兩段程式碼,修改的都是父文件(頂層視窗)位址列的hash值。所以,只需要在父文件中監聽onhashchange事件,在事件響應中設定iframe的src 進而load子頁面。
1 $container = $('div.page-body > iframe'); 2 window.onhashchange = function(){ 3 $container.attr('src',location.hash.substring(1)); 4 };
iframe高度不能根據內容自適應,需要在子頁面load之後重新整理iframe的高度
1 var refreshHeight = function(){ 2 var $this = $container, 3 minHeight = $('.page-right').height() - $('.top-menu').height() - 20, 4 contentHeight = $this.contents().find('body').height() + 10; 5 $this.height(contentHeight < minHeight ? minHeight : contentHeight); 6 }; 7 8 $container.load(function(){ 9 refreshHeight(); 10 }); 11 // 首次重新整理,否則載入過程中會看到白框 12 refreshHeight();
到這裡基本已經實現任意跳轉、回退、前進頁面不再重新整理整個頁面。下面的程式碼是為了解決當開啟多個頂層文件時(開多個視窗),音樂不重複播放,方法也很簡單,在localStorage中記錄頂層文件的數量,每開一個新視窗加1,關閉時減1,只要記錄數大於1便不自動播放。
1 if(window.localStorage){ 2 var $window = $(window); 3 $window.on('beforeunload',function(){ 4 console.log('-1'); 5 localStorage.framePage = localStorage.framePage - 1; 6 }); 7 8 window.addEventListener("storage", function(e){ 9 console.log("oldValue: "+ e.oldValue + " newValue:" + e.newValue) 10 }); 11 } 12 var autoplay = location.host !== 'movesun.qq.com'; 13 if(window.localStorage){ 14 if(Number(localStorage.framePage) >= 1){ 15 autoplay = false; 16 } 17 18 if(isNaN(localStorage.framePage) || Number(localStorage.framePage) <= 0) localStorage.framePage = 1; 19 else { 20 localStorage.framePage = Number(localStorage.framePage) + 1; 21 } 22 }
部落格依然有兩個問題需要解決
1、目前的瀏覽器已經支援記錄iframe變更的歷史記錄,通過hash記錄歷史就顯的沒有必要了。目前網站每次跳轉實際產生了兩條歷史記錄。後面找時間移出hash記錄或者禁用iframe歷史記錄
2、考慮到搜尋引擎收錄的超連結應該是非hash模式的url,比如使用者看到的是movesun.com/#/blog/list ,而實際收錄的卻是movesun.com/blog/list,通過site:movesun.com指令搜尋也可以看到
直接訪問這類url地址,將直接開啟iframe裡的內容,所以,當使用者直接點選搜尋引擎的結果進入部落格時,應該將使用者跳轉到hash模式,頁面才能正常顯示,但這樣對搜尋引擎而言,會陷入一個無限迴圈,影響搜尋引擎收錄。
前端因直接面向使用者,使得技術也更新迭代的頻繁,前端開發人員也需要不斷學習以追趕時代的潮流。而反觀後臺技術,十年來都沒什麼及其巨大的變化,很多技術經久不衰,後端開發完全有一招鮮吃遍天的架勢。這也是的前端人員比較搶手,在一些公司都存在前端與後臺人力嚴重不平衡的現像,十幾位後臺搭配一位前端的事情,也不是沒有,奇貨可居,優秀的前端是非常吃香的。
相關文章
- 前端學習之路之SPA(單頁應用)設計原理前端
- 幽默:為單頁應用SPA辯護
- 原生JavaScript實現的SPA單頁應用(hash路由)JavaScript路由
- 單頁應用SPA是個錯誤 - gomakethingsGo
- vue 單頁應用(spa)前端路由實現原理Vue前端路由
- 單頁應用SPA做SEO的一種清奇的方案
- 基於 webpack 的 SPA 單頁 Web 應用 動態載入外掛的機制Web
- Vue SPA(單頁應用)首屏優化實踐Vue優化
- 單頁應用SEO淺談
- Facebook應用Mercurial經驗談
- 單頁應用 - Token 驗證
- 前端:將網站打造成單頁面應用SPA前端網站
- 移動應用開發十大經驗之談
- 買車高手的經驗之談 實用
- 關於單頁面應用的 Token Storage 設計策略
- 談談關於 iOS 的架構以及應用iOS架構
- 使用Vue.js在WordPress中建立單頁面應用SPAVue.js
- 前端單頁應用SPA時代結束,Hotwire時機已到 - DHH前端
- (轉)前端:將網站打造成單頁面應用SPA前端網站
- 單頁應用SEO淺談(轉載)
- 如何增強單頁應用的體驗
- 前端單頁應用微服務化解決方案2 - Single-SPA前端微服務
- Doxygen簡單經驗談。。。
- 基於網易雲音樂的 SPA 應用
- 單頁面 Web 應用(Single Page Application,SPA)的工作原理介紹WebAPP
- 投稿007期|記一次基於vue的spa多頁籤實踐經驗Vue
- 用過 Buffalo 框架的朋友有何經驗之談框架
- Hugo 建站經驗之談Go
- SPA單頁面應用、前後端分離專案SEO優化的方法後端優化
- 手記系列之四 ----- 關於使用MySql的經驗MySql
- 關於Laravel的表單驗證分層設計以及驗證場景的應用Laravel
- 前端 SPA 單頁應用資料統計解決方案 (ReactJS / VueJS)前端ReactJSVue
- 結合自己的經驗談一談關於專案管理的一點感想薦專案管理
- puppeteer踩坑經驗之談
- 創新性應用 資料建模經驗談(轉)
- 資深app開發者的經驗之談:想簡單點,降低風險APP
- 軟體測試用例設計實用經驗之談
- 【OCM】kingsql分享關於OCM PROFILE頁面個人照片的經驗SQL