言
離線模板目的是性能優化,webapp的性能優化主要是在網絡請求和dom操作優化上面進行優化,slarkjs框架的開發理念是SPA(single page application),即單頁webapp,單頁webapp在性能上面首屏加載所有資源,請求量少,無白屏等,但是考慮實際情況,每個頁面的dom結構不可能想似,所以基于單頁應用模式的slarkjs是請求部分html,不是請求json,但是頁面加載資源類似單頁模式,頁面切換轉場無白屏,首屏加載所有資源。在單頁載入下一個頁面時,開始回流,渲染增加的dom結構,并運行該頁面的js腳本。(對slark框架沒有了解的同學可以在此了解一下)。
了解了slarkjs的頁面模式以及性能后,說說今天的正題離線模板,離線模板通過緩存模板,則實現了slarkjs頁面請求json實現加載另一頁面,同時結合Application cahe,實現離線模式下的展示。雖然Application cache的好壞眾說紛紜,但是結合一個好的設計方案,還是可以發揮很大的作用。總體的思路就是Slark框架的模式slark框架單頁webapp通過Application cache緩存模板,請求json獲取模板數據,將模板數據和模板渲染生成dom結構來優化性能。
離線模板原理:
模板:
模板使用采用預編譯模式的javascript模板art-template,預編譯后,通過增加一個js文件和HTML5的application cache,實現請求json,而不是請求html。雖然manifst的更新會消耗一定的流量,應用場景可以局限在不經常改動的站點。
對于頁面異步請求json,避免白屏的問題,在ajax發出之前將模板和空數據結合,并展示不含數據的dom結構,當數據請求返回成功后,在和模板結合,展示帶有真是數據的dom結構;
下面介紹一下art-template
其他的javascript模板引擎在對模板變量進行賦值時,渲染都需要動態編譯 javascript 字符串完成變量賦值。而 artTemplate 的編譯賦值過程卻是在渲染之前完成的(這種方式稱之為“預編譯”)。
artTemplate 模板編譯器根據一些簡單的規則提取所有模板變量,并聲明在渲染函數頭部,這個過程就是預編譯,預編譯的產物就是將編譯賦值的過程轉為含參數的js函數執行過程。
什么是Cache Manifest?
首先manifest是一個后綴名為minifest的文件,在文件中定義那些需要緩存的文件,支持manifest的瀏覽器,會將按照manifest文件的規則,像文件保存在本地,從而在沒有網絡鏈接的情況下,也能訪問頁面。
當我們第一次正確配置app cache后,當我們再次訪問該應用時,瀏覽器會首先檢查manifest文件是否有變動,如果有變動就會把相應的變得跟新下來,同時改變瀏覽器里面的app cache,如果沒有變動,就會直接把app cache的資源返回,基本流程是這樣的。
Manifest的特點:
離線瀏覽: 用戶可以在離線狀態下瀏覽網站內容。
更快的速度: 因為數據被存儲在本地,所以速度會更快.
減輕服務器的負載: 瀏覽器只會下載在服務器上發生改變的資源。
離線模板思路:
slark框架單頁webapp通過Application cache緩存模板,請求json獲取模板數據,將模板數據和模板渲染生成dom結構來優化性能。
如何實現:
Slark框架之前的單頁模式,如下圖所示:
Art-template支持node,web應用前現將要緩存模板的頁面進行界面和數據的抽離,將分立后的界面預編譯生成js文件,使用manifest緩存這個js文件。每次頁面跳轉只請求數據,傳入js函數(art-temptale預編譯生成),獲取dom,渲染頁面。
既然使用了Application cache,為了在Offline模式下可展示,通過localstorage緩存數據,使用以上設計方案后的請求模式:
可以看到離線模板這種方案,離線模式下展示頁面前提是用戶曾經在Online情況下訪問過本頁面,瀏覽器緩存過頁面數據,這是離線模板v1.0(首頁server端渲染,跳轉頁面前端渲染)
離線模板v1.0離線刷新回退問題和離線模板v2.0 hash url:
manifest的原理,當其他頁面訪問已經緩存的資源請求不會發出,只會使用本地的文件,所以離線刷新當前頁面后回退,應該調到業務上的上一頁面,但是jsonq請求的url和緩存頁面的url相同,請求不會發出。
解決方案:json請求增加時間戳;
manifest文件需要寫明每個頁面的請求路徑才可以做到一次在線瀏覽,offline展示并有動態效果,但是業務上面結合url不是不變的,傳的參數不同,瀏覽器就被認為是不同的文件,所以不惜改slark框架,將原有的url,修改為hash路由(!#!/)。更改slark框架之后的離線模板就是v2.0 hash url。
大家都知道server端不能識別url的hash部分,
原來url:
http://m.elong.com/entry/flight/entry.html?param1=1&¶m2=2
Hash url:
http://m.elong.com/entry/flight/!#!/entry!¶m1=1&¶m2=2
成功解決跳轉回退url變化問題,離線時跳轉和回退時,瀏覽器認為url并沒有發生變化。這樣manifest文件就可以寫一個路徑http://m.elong.com/entry/flight/
離線模板v2.0 hash url離線刷新先顯示首頁的問題:
像上面展示的url例子,slark單頁模式刷新回退,瀏覽器認為url就一直是http://m.elong.com/entry/flight/ 這個url服務器端默認entry.html頁面,只要這個entry.html帶有manifest標簽,頁面離線模式下list,html,detail.html等頁面刷新回退都可以展示,但是問題來了:比如 在線瀏覽所有頁面之后,進入離線模式,刷新list頁面,瀏覽器會先展示entry頁面,然后運行js腳本,將已經緩存list頁面的json數據,和模板結合,展示list頁面。
解決方案:
http://m.elong.com/entry/flight/ 這個url服務器端默認blank.html頁面,這個頁面是所有頁面默認的部分,帶有manifest標簽,是一個空頁面,離線頁面刷新后即使加載blank.html,也是一個空頁面,通過緩存的list頁面數據和模板結合,可以展示list頁面;
模板統一:
最后涉及一個問題,就是前后臺模板統一,除了需要后臺對于提供json以外,還需要前后臺統一。這里以后臺使用java freemark模板為例子,修改模板art-template的語法以支持freemark語法。
離線模板使用:
離線模板v1.0使用話,就在引用js之前引用預編譯生成的js,如果要是用離線模板v2.0,需要在頁面路由配置中增加is_frender :true的配置項。
前臺項目使用:
gruntfile文件中tmod任務中配置項目中要離線的頁面路徑,生成預編譯文件,不使用離線模板的頁面不要編譯
appcachejson文件中增加要緩存的文件路徑,生成manifest文件
所有的html先引用預編譯模板文件,再引用main.js
要離線的文件html中<html標簽引用manifest文件<html manifest=‘xxx.manifest’
業務綁定事件onrender的callback中首先添加空渲染處理方法
合并main.js前的main.js,回調第一句core.init(),傳入項目的名字,如core.init(‘offline’)
后臺項目使用:
使用freemark模板,前后臺使用模板一致;
同一請求路徑,可以判斷contentType,返回html和特定格式的json;
總結:
離線模板v1.0適合url不含參數的路徑,比如http://m.elong.com/entry/flight/index
htttp://m.elong.com/entry/flight/index?index=1&&key=2 這樣的就不適合,但是不會出現白屏,首頁server端渲染,其他頁面前端渲染。
離線模板v2.0hash url 其實適合所有的url,是所有頁面前端渲染。但是,有兩個缺點;
首次加載webapp的頁面慢。因為要緩存manifest中的所有文件,所以在首次首屏可能會有些慢,但是之后就會很快。
當手機清緩存或者web服務器這邊更新manifest文件后都會更新manifest,而且manifest更新時,第一次在線訪問更新緩存,但是不會展示更新內容,這一點對于飛機票火車票等即時性的業務來說不適合。
參考文獻:
https://github.com/yinyinfurong/art-template
http://www.cnblogs.com/yexiaochai/p/3759959.html
http://www.jq22.com/jquery-info1097
http://blog.csdn.net/fwwdn/article/details/8082433
作者簡介
張美蓉,15年應屆畢業生,之前實習微商開發,15年任職藝龍網前端框架組開發工程師。
量添加數據時,需要動態添加html代碼。例如:添加規格。
本猿新手時期是這么做的:(主要看紅框中代碼)
字符與變量拼接,倒是簡單易行,就是容易出錯(比如:引號不成對),需要反復調試。
拼接字符串要是不講究, 那更是不便于我們人類閱讀,所以,要是 元素有改變 或者 新增了元素,維護起來自然不易。
要是像php模板引擎一樣,直接把變量塞進html代碼里面,不但不用糾結引號是否匹配、成對標簽是否缺失閉標簽,而且格式化,那多好-----嗯,這個可以有。
php有模板引擎,咱js也有,不但有,還百家爭鳴。
本猿機緣巧合之下,遇見了art-template.js。
先看一眼官方文檔。
于是,上文的動態添加html代碼需求可以這么實現:
想要查看art-template官方文檔的更多信息,可以這么做:
于公司網站建設制作相信大家都知道,網站模板的獨特性和美觀性決定了搜索引擎和用戶的友好性。一個好的網站模板會讓很多人羨慕和不斷模仿,同時也能更好的提高用戶體驗。那下面松江建網站就來談談如何制作自己的網站原始模板。
第一點:IMG文件的修改
一般來說,一個網站的模板將有一個名為IMG的圖像文件或存儲模板CSS的圖像。事實上,這是實現公司網站制作的偽原創的最簡單的方法。對IMG文件的圖像文件的一般理解,我們會發現顏色的一般變化。對圖片或圖片風格的改變可以明顯區別于原來的站臺模板。
第二:CSS文件的修改
CSS文件是我們網站的框架。目前很多網站都采用DIV+CSS進行版面設計, 松江建網站可以使原模板發生變化,例如,我們可以通過修改背景、顏色、字體大小和背景圖像等來快速改變網站的風格,當然,熟悉CSS網頁。站長,其實應該知道CSS其實是實現網站原創的關鍵。如果你使用DIV+CSS,你將獨立地設計你的網站的布局。
第三:網站結構的修改
修改原模板網站的結構也可以快速實現,一般網站框有上、中、下、左中右,然后可以改變網站的布局,例如上下,并將其轉換成上下結構。網站的內層位置,或網站的匠心獨運的恐懼。
第四點:轉讓方式的獨創性
松江建網站認為當我們模仿火車站時,我們不能被同一個原物模仿。即使很成功,也不能消化。最重要的是,它是一個山寨網站。所以我們需要改變網站模板的本地部分。事實上,公司網站制作設計可以使我們的網站更加多樣化,通常是在整個網站結構的上下文中,并且可以通過簽署其他網站的更好部分來轉移到我們的網站模板。常見的是導航欄、網站的底部信息、會員的登錄方式等。
例如:我們的列表頁面模板被顯示為一個文本列表, 松江建網站可以找到一個圖形顯示模式的模板代碼被移植到我們的模板中。所以我們的模板和原始模板是不同的。當然,我們應該充分感受到用戶體驗和網站的美。
第五點:原始方法的第一步
這是國外網站的目標站點的原點, 松江建網站在頻繁瀏覽國外網站的實際人數將被發現,國外網站相比國內網站相對大氣、簡潔、豐富、大膽。國內的站長不多,這就決定了這個模板是中國的一個原創模板,相當于把你的英文網站翻譯成中文。我記得一個很好的例子就是站在涼爽的網絡上。他的模板是通過簽署國外網站的風格來設計的,所以后來有很多國內設計素材網站都能在網站上簽下酷的風格,我們必須開發一些可以自由瀏覽和收藏的優秀網站,這樣我們在設計上有很大的優勢創建模板。
基本上是原來的模板修改的五個點,只要我們能做到這五個點,相信你的網站模板設計絕對是獨一無二的,但是前提是你在修改的過程中,我們必須注意用戶體驗:
1、界面的重新設計
界面的變化不僅僅是SEO優化,因為每個網站都有自己的特點,所以松江建網站的改變更重要的是要建立自己的品牌和形象,這樣它才是獨一無二的。如果我們的界面和其他人重復很多,這樣的網站一定已經失去了在市場上的品牌。此外,從SEO的角度來看,減少重復性也是非常重要的。界面的改變將大大降低重復性。
2、CSS和JS的重構
現在搜索引擎已經能夠很好地抓取CSS并閱讀它,所以單調重復對搜索引擎不友好,所以當松江建網站重新定義標簽、類、ID和其他樣式和數字的定義是減少復制的必要工作。CSS代碼是按照W3C標準和JS代碼編寫的。完成后,它可以在代碼級與其他不同。
3、函數刪除
默認模板的功能是一個網站,但是對于不同的行業,網站功能的具體要求是不同的,如公司網站制作設計,因此潛在的功能應該被刪除,增加,從VIE的角度來看。對網站SEO優化時,我們必須把重要的內容放在前面的位置,同時,使用合理的標簽,標簽會極大地影響網站的權重。
4、結構URL更改
最后要強調的是URL結構。URL結構不僅對SEO有重要意義,而且對于系統的后期升級和更改甚至系統的替換都是重要的。因此,在模板的重構中,URL路徑必須是新鮮的,現在默認的有多個目錄結構。做一個大的分類——小分類的類型,這對蜘蛛爬行是非常有益的,并且有益于用戶的閱讀習慣。
文章由才藝多收集編寫轉載請注明出處:http://sh.caiyiduo.com/article/show-4915.html
*請認真填寫需求信息,我們會在24小時內與您取得聯系。