原文地址css
聲明:此文帶着本身的理解,不徹底按原文翻譯html
prefetch 即預加載,在用戶須要前咱們就將所需的資源加載完畢。html5
如今的 chrome 聰明到根據你的瀏覽記錄,預測到你可能訪問或搜索哪些網站,在你打開網站以前就加載好了一些資源了。
舉個栗子,當你在搜索框輸入 "amaz" 時,它猜想到你可能要訪問 amazon.com,可能就幫你加載了這個網站的一些資源。
若是這個預測算法精準的話,就能大大地提升用戶的瀏覽體驗了。ajax
咱們知道,當咱們訪問一個網站如 www.amazon.com 時,須要將這個域名先轉化爲對應的 IP 地址,這是一個很是耗時的過程。算法
DNS prefetch 分析這個頁面須要的資源所在的域名,瀏覽器空閒時提早將這些域名轉化爲 IP 地址,真正請求資源時就避免了上述這個過程的時間。chrome
<meta http-equiv='x-dns-prefetch-control' content='on'> <link rel='dns-prefetch' href='http://g-ecx.images-amazon.com'> <link rel='dns-prefetch' href='http://z-ecx.images-amazon.com'> <link rel='dns-prefetch' href='http://ecx.images-amazon.com'> <link rel='dns-prefetch' href='http://completion.amazon.com'> <link rel='dns-prefetch' href='http://fls-na.amazon.com'>
應用場景1:咱們的資源存在在不一樣的 CDN 中,那提早聲明好這些資源的域名,就能夠節省請求發生時產生的域名解析的時間。
應用場景2:若是咱們知道用戶接下來的操做必定會發起一塊兒資源的請求,那就能夠將這個資源進行 DNS-Prefetch,增強用戶體驗。瀏覽器
在 Chrome 下,咱們能夠用 link標籤聲明特定文件的預加載:緩存
<link rel='subresource' href='critical.js'> <link rel='subresource' href='main.css'> <link rel='prefetch' href='secondary.js'>
在 Firefox 中或用 meta 標籤聲明:app
<meta http-equiv="Link" content="<critical.js>; rel=prefetch">
rel='subresource' 表示當前頁面必須加載的資源,應該放到頁面最頂端先加載,有最高的優先級。工具
rel='prefetch' 表示當 subresource 全部資源都加載完後,開始預加載這裏指定的資源,有最低的優先級。
注意:只有可緩存的資源才進行預加載,不然浪費資源!
前面說到的預解析DNS、預加載資源已經夠強悍了有木有,可還有更厲害的預渲染(Pre-rendering)!
預渲染意味着咱們提早加載好用戶即將訪問的下一個頁面,不然進行預渲染這個頁面將浪費資源,慎用!
<link rel='prerender' href='http://www.pagetoprerender.com'>
rel='prerender' 表示瀏覽器會幫咱們渲染但隱藏指定的頁面,一旦咱們訪問這個頁面,則秒開了!
在 Firefox 中或用 rel='next' 來聲明
<link rel="next" href="http://www.pagetoprerender.com">
當資源爲如下列表中的資源時,將阻止預渲染操做:
在 head 中強勢插入 link[rel='prerender'] 便可:
var hint =document.createElement("link") hint.setAttribute(「rel」,」prerender」) hint.setAttribute(「href」,」next-page.html」) document.getElementsByTagName(「head」)[0].appendChild(hint)
這麼好用的特性,固然要考慮各瀏覽器的兼容程度了(哭:
IE9 支持 DNS pre-fetching 但管它叫 prefetch。
IE10+ 中 dns-prefetch 和 prefetch 是等價的。
其餘方面的測試,目前尚未很好的方案,暫且只能經過查看瀏覽器是否緩存來測試。
在 Chrome 中打開了 chrome developer tools 開發工具會阻止頁面的預渲染,因此咱們看不到這個過程,但能夠在 chrome://cache/ 或 chrome://net-internals/#prerender 中查看。
Firefox 能夠在 about:cache 中查看。
這些特定仍是實驗性質的,未來可能改變。
權利越大,責任越大,不要濫用!
html5-prefetch
MDN Controlling DNS prefetching
MDN Link prefetching FAQ