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

    前言

    單頁應用(Single Page Application)越來越受web開發者歡迎,單頁應用的體驗可以模擬原生應用,一次開發,多端兼容。單頁應用并不是一個全新發明的技術,而是隨著互聯網的發展,滿足用戶體驗的一種綜合技術。

    SEO

    一直以來,搜索引擎優化(SEO)是開發者容易忽略的部分。SEO是針對搜索(Google、百度、雅虎搜索等)在技術細節上的優化,例如語義、搜索關鍵詞與內容相關性收錄量搜索排名等。SEO也是同行、市場競爭常用的的營銷手段。Google、百度的搜索結果是重要的用戶入口,騰訊云(www.qcloud.com)有30%左右的流量來自搜索引擎。因此SEO在品牌、營銷、用戶量的緯度是非常重要的基礎能力。

    那么單頁應用與傳統直出頁面在SEO方面有哪些不同之處呢?

    單頁應用的優點

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

    對搜索引擎不友好

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

    如果站點在用戶體驗和搜索友好權衡時,如果我們做到更好的體驗,也做到友好的搜索支持,既是一箭雙雕。

    URL中的哈希(#號)

    單頁應用只有一個頁面,視圖的變化通常是通過路由(route)來驅動,首先,我們先來談一談單頁應用的URL中的#號,很多采用單元結構網站的URL都出現了這個符號。

    #號在瀏覽器的URL中是一個錨點,在當前頁改變#號的參數,頁面會跳轉到錨點所在的位置,通過JavaScript我們可以獲取到#號后的參數:

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

    改變#號后的參數,頁面并不會重載,于是大多數的單頁架構網站,都在URL中采用#號來作為當前視圖的URL地址,例如:

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

    Backbone.js就是通過改變#號參數來組織視圖,這里有一個demo可以很直觀的體驗URL的變化。

    看過這個demo,你或許會發現很熟悉的符號#!,Twitter曾在URL使用這個標識。這個標識是Google提出(AJAX 抓取:網站站長和開發人員指南1):

    因為復雜的單頁架構頁面,對Google來說抓取比較困難,于是給開發者制定一個規范:

    1. 網站提交sitemap給Google;
    2. Google發現URL里有#!符號,例如example.com/#!/detail/1,于是Google開始抓取example.com/?_escaped_fragment_=/detail/1

    _escaped_fragment_這個參數是Google指定的命名,如果開發者希望把網站內容提交給Google,就必須通過這個參數生成靜態頁面。

    根據上面的demo,我簡單示例一下Google要抓取的頁面的樣子:

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

    如此以來,就需要Server通過生成靜態的內容以便Google抓取。

    以下將簡單介紹,單頁架構,爬蟲訪問根目錄時如果配置Server端的路由。

    判斷爬蟲

    當Google訪問119.28.4.22/#!/detail/1 時,會自動轉化成http://119.28.4.22/?_escaped_fragment_=/detail/1,以Nginx為例:

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

    /api為后臺服務的接口,已nodejs為例,代理設置如下:

    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這個接口,然后在Server的/api處理請求把靜態內容輸出即可。

    sitemap

    Gogole的這個規范,必須有sitemap支持,因為有可能單頁架構的站點,索引頁面也是JavaScript渲染的。提交sitemap時,不用關注_escaped_fragment_這個參數名,只提交帶哈希符號的URL即可,例如:

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

    結語

    技術潮流的步伐很快,單頁應用,URL哈希處理也沒渲染的方式實際上已經流行了很久,在國外很多用戶數據較好的情況下,開發者會選擇HTML5 History API的pushstate特性開發,在URL中拋棄#!。但是IE6、7等低端瀏覽器用戶情況較多的網站,#能夠很好的兼容。關于采用HTML5 History API來架構單頁應用的方案,也歡迎討論。


    穩定

    產品高可用性高并發

    貼心

    項目群及時溝通

    專業

    產品經理1v1支持

    快速

    MVP模式小步快跑

    承諾

    我們選擇聲譽

    堅持

    10年專注高端品質開發
    • 返回頂部
    亚洲精品色午夜无码专区日韩| 日韩综合在线视频| 91精品全国免费观看含羞草| 2022年国产精品久久久久| 国产日韩精品SUV| 国产成人精品综合| 国内精品-bt天堂| 91精品久久久久久久99蜜桃 | 精品国产一区二区麻豆| 91国内揄拍·国内精品对白| 中文无码日韩欧免费视频| 91久久精品电影| 99热成人精品国产免国语的| 国产成人精品日本亚洲专区| 国产伦精品一区二区三区免费迷| 中文无码亚洲精品字幕| 91精品手机国产免费| 国产美女精品一区二区三区| 国产91精品一区二区麻豆亚洲| 久久精品无码一区二区三区日韩| 在线播放亚洲精品| 欧美日本精品一区二区三区| 国产99视频精品免费观看7| 久久精品99久久香蕉国产色戒 | 自怕偷自怕亚洲精品| 亚洲精品夜夜夜妓女网| 精品国产一区二区22| 国产精品无码永久免费888 | 精品日产卡一卡二卡国色天香| 精品日韩亚洲AV无码一区二区三区| 亚洲综合国产精品| 国产一成人精品福利网站| 日韩精品少妇无码受不了| 精品国产免费一区二区| 蜜臀91精品国产免费观看| 在线播放精品一区二区啪视频| 日日夜夜精品视频| 热久久美女精品天天吊色| 国产乱人伦精品一区二区在线观看 | 国产精品一区二区电影| 国产手机精品一区二区 |