聲明:此文帶著自己的理解篮绿,不完全按原文翻譯
prefetch 即預(yù)加載以清,在用戶需要前我們就將所需的資源加載完畢。
有了瀏覽器緩存岛宦,為何還需要預(yù)加載阱佛?
- 用戶可能是第一次訪問網(wǎng)站帖汞,此時還無緩存
- 用戶可能清空了緩存
- 緩存可能已經(jīng)過期,資源將重新加載
- 用戶訪問的緩存文件可能不是最新的凑术,需要重新加載
Chrome 的預(yù)加載技術(shù)
現(xiàn)在的 chrome 聰明到根據(jù)你的瀏覽記錄翩蘸,預(yù)測到你可能訪問或搜索哪些網(wǎng)站,在你打開網(wǎng)站之前就加載好了一些資源了麦萤。
舉個栗子鹿鳖,當(dāng)你在搜索框輸入 "amaz" 時,它猜測到你可能要訪問 amazon.com壮莹,可能就幫你加載了這個網(wǎng)站的一些資源翅帜。
如果這個預(yù)測算法精準(zhǔn)的話,就能大大地提高用戶的瀏覽體驗了命满。
DNS prefetch
我們知道涝滴,當(dāng)我們訪問一個網(wǎng)站如 www.amazon.com 時,需要將這個域名先轉(zhuǎn)化為對應(yīng)的 IP 地址胶台,這是一個非常耗時的過程歼疮。
DNS prefetch 分析這個頁面需要的資源所在的域名,瀏覽器空閑時提前將這些域名轉(zhuǎn)化為 IP 地址诈唬,真正請求資源時就避免了上述這個過程的時間韩脏。
<meta http-equiv='x-dns-prefetch-control' content='on'>
<link rel='dns-prefetch' >
<link rel='dns-prefetch' >
<link rel='dns-prefetch' >
<link rel='dns-prefetch' >
<link rel='dns-prefetch' >
應(yīng)用場景1:我們的資源存在在不同的 CDN 中,那提前聲明好這些資源的域名铸磅,就可以節(jié)省請求發(fā)生時產(chǎn)生的域名解析的時間赡矢。
應(yīng)用場景2:如果我們知道用戶接下來的操作一定會發(fā)起一起資源的請求,那就可以將這個資源進(jìn)行 DNS-Prefetch阅仔,加強(qiáng)用戶體驗吹散。
Resource prefetch
在 Chrome 下,我們可以用 link標(biāo)簽聲明特定文件的預(yù)加載:
<link rel='subresource' href='critical.js'>
<link rel='subresource' href='main.css'>
<link rel='prefetch' href='secondary.js'>
在 Firefox 中或用 meta 標(biāo)簽聲明:
<meta http-equiv="Link" content="<critical.js>; rel=prefetch">
rel='subresource' 表示當(dāng)前頁面必須加載的資源八酒,應(yīng)該放到頁面最頂端先加載空民,有最高的優(yōu)先級。
rel='prefetch' 表示當(dāng) subresource 所有資源都加載完后羞迷,開始預(yù)加載這里指定的資源界轩,有最低的優(yōu)先級。
注意:只有可緩存的資源才進(jìn)行預(yù)加載闭树,否則浪費資源耸棒!
Pre render
前面說到的預(yù)解析DNS、預(yù)加載資源已經(jīng)夠強(qiáng)悍了有木有报辱,可還有更厲害的預(yù)渲染(Pre-rendering)与殃!
預(yù)渲染意味著我們提前加載好用戶即將訪問的下一個頁面,否則進(jìn)行預(yù)渲染這個頁面將浪費資源碍现,慎用幅疼!
<link rel='prerender' >
rel='prerender' 表示瀏覽器會幫我們渲染但隱藏指定的頁面,一旦我們訪問這個頁面昼接,則秒開了爽篷!
在 Firefox 中或用 rel='next' 來聲明
<link rel="next" >
不是所有的資源都可以預(yù)加載
當(dāng)資源為以下列表中的資源時,將阻止預(yù)渲染操作:
- URL 中包含下載資源
- 頁面中包含音頻慢睡、視頻
- POST逐工、PUT 和 DELETE 操作的 ajax 請求
- HTTP 認(rèn)證(Authentication)
- HTTPS 頁面
- 含惡意軟件的頁面
- 彈窗頁面
- 占用資源很多的頁面
- 打開了 chrome developer tools 開發(fā)工具
手動觸發(fā)預(yù)渲染操作
在 head 中強(qiáng)勢插入 link[rel='prerender'] 即可:
var hint =document.createElement("link")
hint.setAttribute(“rel”,”prerender”)
hint.setAttribute(“href”,”next-page.html”)
document.getElementsByTagName(“head”)[0].appendChild(hint)
兼容性
這么好用的特性铡溪,當(dāng)然要考慮各瀏覽器的兼容程度了(哭:
IE9 支持 DNS pre-fetching 但管它叫 prefetch。
IE10+ 中 dns-prefetch 和 prefetch 是等價的泪喊。
其他方面的測試棕硫,目前還沒有很好的方案,暫且只能通過查看瀏覽器是否緩存來測試袒啼。
在 Chrome 中打開了 chrome developer tools 開發(fā)工具會阻止頁面的預(yù)渲染哈扮,所以我們看不到這個過程,但可以在 chrome://cache/ 或 chrome://net-internals/#prerender 中查看蚓再。
Firefox 可以在 about:cache 中查看滑肉。
警告
這些特定還是實驗性質(zhì)的,將來可能改變摘仅。
權(quán)利越大靶庙,責(zé)任越大,不要濫用实檀!
參考鏈接
html5-prefetch
MDN Controlling DNS prefetching
MDN Link prefetching FAQ