• <kbd id="qyk40"></kbd>
  • <strike id="qyk40"></strike><samp id="qyk40"><pre id="qyk40"></pre></samp>

    前言

    單頁(yè)應(yīng)用(Single Page Application)越來(lái)越受web開發(fā)者歡迎,單頁(yè)應(yīng)用的體驗(yàn)可以模擬原生應(yīng)用,一次開發(fā),多端兼容。單頁(yè)應(yīng)用并不是一個(gè)全新發(fā)明的技術(shù),而是隨著互聯(lián)網(wǎng)的發(fā)展,滿足用戶體驗(yàn)的一種綜合技術(shù)。

    SEO

    一直以來(lái),搜索引擎優(yōu)化(SEO)是開發(fā)者容易忽略的部分。SEO是針對(duì)搜索(Google、百度、雅虎搜索等)在技術(shù)細(xì)節(jié)上的優(yōu)化,例如語(yǔ)義、搜索關(guān)鍵詞與內(nèi)容相關(guān)性收錄量搜索排名等。SEO也是同行、市場(chǎng)競(jìng)爭(zhēng)常用的的營(yíng)銷手段。Google、百度的搜索結(jié)果是重要的用戶入口,騰訊云(www.qcloud.com)有30%左右的流量來(lái)自搜索引擎。因此SEO在品牌、營(yíng)銷、用戶量的緯度是非常重要的基礎(chǔ)能力。

    那么單頁(yè)應(yīng)用與傳統(tǒng)直出頁(yè)面在SEO方面有哪些不同之處呢?

    單頁(yè)應(yīng)用的優(yōu)點(diǎn)

    1. 更好的用戶體驗(yàn),讓用戶在web感受natvie的速度和流暢;
    2. 經(jīng)典MVC開發(fā)模式,前后端各負(fù)其責(zé)。
    3. 一套Server API,多端使用(web、移動(dòng)APP等)
    4. 重前端,業(yè)務(wù)邏輯全部在本地操作,數(shù)據(jù)都需要通過AJAX同步、提交;

    對(duì)搜索引擎不友好

    單頁(yè)應(yīng)用實(shí)際是把視圖(View)渲染從Server交給瀏覽器,Server只提供JSON格式數(shù)據(jù),視圖和內(nèi)容都是通過本地JavaScript來(lái)組織和渲染。而搜索搜索引擎抓取的內(nèi)容,需要有完整的HTML和內(nèi)容,單頁(yè)應(yīng)用架構(gòu)的站點(diǎn),并不能很好的支持搜索。

    如果站點(diǎn)在用戶體驗(yàn)和搜索友好權(quán)衡時(shí),如果我們做到更好的體驗(yàn),也做到友好的搜索支持,既是一箭雙雕。

    URL中的哈希(#號(hào))

    單頁(yè)應(yīng)用只有一個(gè)頁(yè)面,視圖的變化通常是通過路由(route)來(lái)驅(qū)動(dòng),首先,我們先來(lái)談一談單頁(yè)應(yīng)用的URL中的#號(hào),很多采用單元結(jié)構(gòu)網(wǎng)站的URL都出現(xiàn)了這個(gè)符號(hào)。

    #號(hào)在瀏覽器的URL中是一個(gè)錨點(diǎn),在當(dāng)前頁(yè)改變#號(hào)的參數(shù),頁(yè)面會(huì)跳轉(zhuǎn)到錨點(diǎn)所在的位置,通過JavaScript我們可以獲取到#號(hào)后的參數(shù):

    1
    2
    
    location.hash // 獲取URL hash location.hash = "#list" //改變URL hash

    改變#號(hào)后的參數(shù),頁(yè)面并不會(huì)重載,于是大多數(shù)的單頁(yè)架構(gòu)網(wǎng)站,都在URL中采用#號(hào)來(lái)作為當(dāng)前視圖的URL地址,例如:

    1
    2
    3
    
    example.com/#index //首頁(yè)視圖 example.com/#list //列表頁(yè)視圖 example.com/#list/1 //id為1的列表信息的視圖

    Backbone.js就是通過改變#號(hào)參數(shù)來(lái)組織視圖,這里有一個(gè)demo可以很直觀的體驗(yàn)URL的變化。

    看過這個(gè)demo,你或許會(huì)發(fā)現(xiàn)很熟悉的符號(hào)#!,Twitter曾在URL使用這個(gè)標(biāo)識(shí)。這個(gè)標(biāo)識(shí)是Google提出(AJAX 抓取:網(wǎng)站站長(zhǎng)和開發(fā)人員指南1):

    因?yàn)閺?fù)雜的單頁(yè)架構(gòu)頁(yè)面,對(duì)Google來(lái)說(shuō)抓取比較困難,于是給開發(fā)者制定一個(gè)規(guī)范:

    1. 網(wǎng)站提交sitemap給Google;
    2. Google發(fā)現(xiàn)URL里有#!符號(hào),例如example.com/#!/detail/1,于是Google開始抓取example.com/?_escaped_fragment_=/detail/1

    _escaped_fragment_這個(gè)參數(shù)是Google指定的命名,如果開發(fā)者希望把網(wǎng)站內(nèi)容提交給Google,就必須通過這個(gè)參數(shù)生成靜態(tài)頁(yè)面。

    根據(jù)上面的demo,我簡(jiǎn)單示例一下Google要抓取的頁(yè)面的樣子:

    http://119.28.4.22/?escapedfragment_=/detail/1

    如此以來(lái),就需要Server通過生成靜態(tài)的內(nèi)容以便Google抓取。

    以下將簡(jiǎn)單介紹,單頁(yè)架構(gòu),爬蟲訪問根目錄時(shí)如果配置Server端的路由。

    判斷爬蟲

    當(dāng)Google訪問119.28.4.22/#!/detail/1 時(shí),會(huì)自動(dòng)轉(zhuǎn)化成http://119.28.4.22/?_escaped_fragment_=/detail/1,以Nginx為例:

    1
    2
    3
    
    if ($args ~ _escaped_fragment_) { rewrite ^ /api; }

    /api為后臺(tái)服務(wù)的接口,已nodejs為例,代理設(shè)置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    upstream nodejs { server 127.0.0.1:3000; }  
    location /api { proxy_set_header X-Request-URI   $request_uri; proxy_set_header X-Real-IP       $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host            $host; proxy_set_header Port            $server_port; proxy_pass http://nodejs; proxy_redirect off; }

    如此,我們便將Google的訪問重寫到/api這個(gè)接口,然后在Server的/api處理請(qǐng)求把靜態(tài)內(nèi)容輸出即可。

    sitemap

    Gogole的這個(gè)規(guī)范,必須有sitemap支持,因?yàn)橛锌赡軉雾?yè)架構(gòu)的站點(diǎn),索引頁(yè)面也是JavaScript渲染的。提交sitemap時(shí),不用關(guān)注_escaped_fragment_這個(gè)參數(shù)名,只提交帶哈希符號(hào)的URL即可,例如:

    1
    2
    3
    4
    
    >http://119.28.4.22/#!/detail/1> >weekly> >0.5> >

    結(jié)語(yǔ)

    技術(shù)潮流的步伐很快,單頁(yè)應(yīng)用,URL哈希處理也沒渲染的方式實(shí)際上已經(jīng)流行了很久,在國(guó)外很多用戶數(shù)據(jù)較好的情況下,開發(fā)者會(huì)選擇HTML5 History API的pushstate特性開發(fā),在URL中拋棄#!。但是IE6、7等低端瀏覽器用戶情況較多的網(wǎng)站,#能夠很好的兼容。關(guān)于采用HTML5 History API來(lái)架構(gòu)單頁(yè)應(yīng)用的方案,也歡迎討論。


    穩(wěn)定

    產(chǎn)品高可用性高并發(fā)

    貼心

    項(xiàng)目群及時(shí)溝通

    專業(yè)

    產(chǎn)品經(jīng)理1v1支持

    快速

    MVP模式小步快跑

    承諾

    我們選擇聲譽(yù)

    堅(jiān)持

    10年專注高端品質(zhì)開發(fā)
    • 返回頂部
    国内一级特黄女人精品毛片| 国产精品偷伦视频免费观看了| 国产精品毛片无遮挡高清| 久久九九久精品国产日韩经典| 亚洲一级Av无码毛片久久精品| 国产精品乱码高清在线观看| 日韩在线观看免费完整版视频| 久久精品国产99久久久香蕉| 久久精品国产亚洲av天美18| 久久这里只有精品首页| 日韩乱码人妻无码系列中文字幕 | 国内精品久久久久久久coent| 久久精品国产精品国产精品污| 亚洲国产美女精品久久久久| 国产女人18毛片水真多18精品| 99久久综合精品国产| 影院无码人妻精品一区二区| 久久亚洲精品人成综合网| 亚洲无码精品浪潮| 日韩精品中文字幕在线观看| 久久66热这里只会有精品| 日本精品一区二区久久久| 99re在线视频精品| 日韩亚洲Av人人夜夜澡人人爽| 久久精品无码精品免费专区| 无码精品久久一区二区三区| 久久精品亚洲一区二区三区浴池| 国产成人精品男人免费| 久久国产热这里只有精品| 精品国产乱码久久久久久人妻| 亚洲精品第一国产综合亚AV| 人人妻久久人人澡人人爽人人精品| 国产99视频精品免费观看7| 国产精品igao视频网| 久久精品成人影院| 七次郎在线视频观看精品| 日韩专区在线观看| 日韩三级中文字幕| 人妖在线精品一区二区三区| 精品伦精品一区二区三区视频 | 欧洲精品一区二区三区|