詳解HTML5中rel屬性的prefetch預加載功能使用

在HTML5中,有個頗有用但常被忽略的特性,就是預先加載(prefetch),它的原理是: 
利用瀏覽器的空閒時間去先下載用戶指定須要的內容,而後緩存起來,這樣用戶下次加載時,就直接從緩存中取出來,效率就快了.php

舉個例子說明:好比要預先加載某個頁面,能夠這樣: css

XML/HTML Codehtml

  1. <link rel="prefetch" href="http://www.example.com/"> <!-- Firefox -->    

但若是是google的話,要用另外的一個名稱,即: ajax

XML/HTML Code算法

  1. <link rel="prerender" href="http://www.example.com/"> <!-- Chrome -->   

即便在不支持的瀏覽器,用了這個特性實際上是不會出錯的,只不過瀏覽器解析不到而已, 
因此,若是你感受能有辦法預先預測到用戶指望點的頁面(好比用戶看最新的受歡迎的熱圖,他 可能看了第一頁後,會繼續看下一頁,這個時候就能夠用預先加載這個特性了).好比 chrome

XML/HTML Code瀏覽器

  1. <link rel="prefetch" href="<?php echo get_next_posts_page_link(); ?>">   

而單獨取一張圖片也是能夠的,好比: 緩存

XML/HTML Codeapp

  1. <link rel="prefetch" href="/images/test.jpg"/>   

有了瀏覽器緩存,爲什麼還須要預加載?
1.用戶多是第一次訪問網站,此時還無緩存
2.用戶可能清空了緩存
3.緩存可能已通過期,資源將從新加載
4.用戶訪問的緩存文件可能不是最新的,須要從新加載
5.Chrome 的預加載技術
如今的 chrome 聰明到根據你的瀏覽記錄,預測到你可能訪問或搜索哪些網站,在你打開網站以前就加載好了一些資源了。
舉個栗子,當你在搜索框輸入 "amaz" 時,它猜想到你可能要訪問 amazon.com,可能就幫你加載了這個網站的一些資源。
若是這個預測算法精準的話,就能大大地提升用戶的瀏覽體驗了。工具

DNS prefetch
咱們知道,當咱們訪問一個網站如 www.amazon.com 時,須要將這個域名先轉化爲對應的 IP 地址,這是一個很是耗時的過程。
DNS prefetch 分析這個頁面須要的資源所在的域名,瀏覽器空閒時提早將這些域名轉化爲 IP 地址,真正請求資源時就避免了上述這個過程的時間。

XML/HTML Code

  1. <meta http-equiv='x-dns-prefetch-control' content='on'>  
  2. <link rel='dns-prefetch' href='http://g-ecx.images-amazon.com'>  
  3. <link rel='dns-prefetch' href='http://z-ecx.images-amazon.com'>  
  4. <link rel='dns-prefetch' href='http://ecx.images-amazon.com'>  
  5. <link rel='dns-prefetch' href='http://completion.amazon.com'>  
  6. <link rel='dns-prefetch' href='http://fls-na.amazon.com'>  

應用場景1:咱們的資源存在在不一樣的 CDN 中,那提早聲明好這些資源的域名,就能夠節省請求發生時產生的域名解析的時間。
應用場景2:若是咱們知道用戶接下來的操做必定會發起一塊兒資源的請求,那就能夠將這個資源進行 DNS-Prefetch,增強用戶體驗。

Resource prefetch
在 Chrome 下,咱們能夠用 link標籤聲明特定文件的預加載:

XML/HTML Code

  1. <link rel='subresource' href='critical.js'>  
  2. <link rel='subresource' href='main.css'>  
  3. <link rel='prefetch' href='secondary.js'>  

在 Firefox 中或用 meta 標籤聲明:

XML/HTML Code

  1. <meta http-equiv="Link" content="<critical.js>; rel=prefetch">  

rel='subresource' 表示當前頁面必須加載的資源,應該放到頁面最頂端先加載,有最高的優先級。
rel='prefetch' 表示當 subresource 全部資源都加載完後,開始預加載這裏指定的資源,有最低的優先級。
注意:只有可緩存的資源才進行預加載,不然浪費資源!

Pre render
前面說到的預解析DNS、預加載資源已經夠強悍了有木有,可還有更厲害的預渲染(Pre-rendering)!
預渲染意味着咱們提早加載好用戶即將訪問的下一個頁面,不然進行預渲染這個頁面將浪費資源,慎用!

XML/HTML Code

  1. <link rel='prerender' href='http://www.pagetoprerender.com'>  

rel='prerender' 表示瀏覽器會幫咱們渲染但隱藏指定的頁面,一旦咱們訪問這個頁面,則秒開了!
在 Firefox 中或用 rel='next' 來聲明

XML/HTML Code

  1. <link rel="next" href="http://www.pagetoprerender.com">  

不是全部的資源均可以預加載
當資源爲如下列表中的資源時,將阻止預渲染操做:
1.URL 中包含下載資源
2.頁面中包含音頻、視頻
3.POST、PUT 和 DELETE 操做的 ajax 請求
4.HTTP 認證(Authentication)
5.HTTPS 頁面
6.含惡意軟件的頁面
7.彈窗頁面
8.佔用資源不少的頁面
9.打開了 chrome developer tools 開發工具

手動觸發預渲染操做
在 head 中強勢插入 link[rel='prerender'] 便可:

JavaScript Code

    1. var hint =document.createElement("link")   
    2. hint.setAttribute(「rel」,」prerender」)   
    3. hint.setAttribute(「href」,」next-page.html」)   
    4. document.getElementsByTagName(「head」)[0].appendChild(hint)  
相關文章
相關標籤/搜索