通常寫html頁面,script寫在body結束標籤前,這樣只有當遇到script標籤的時候,纔會加載執行,費加載時間不科學吖!儘管大多數基於標記語言的資源能被瀏覽器的預加載器(Preloader)提早加載,但仍是不盡如人意!css
理想狀況是,先從文檔須要的資源,根據優先級,下載到本地,等到須要的時候,就能夠直接使用或者解析執行!
而後!對!preload就能夠幹這個事!可隨時關注preload的動態,就目前不少現代瀏覽器已經支持!html
preload大白話的意思是,」嗨,瀏覽器!這個資源在這個頁面後面會用到,如今先加載它吧。「git
好處遠不止上面的:github
<link rel="preload" href="late_discovered_thing.js" as="script">
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" as="style" href="asyncstyle.css" onload="this.rel='stylesheet'">
,加載完以後就能夠應用到文檔裏了,script也同理,這裏的onload是指window的onload事件,在加一些統計腳本的時候挺合適,不影響頁面的onload,<link rel="preload" as="script" href="async_script.js" onload="var script = document.createElement('script'); script.src = this.href; document.body.appendChild(script);">
<link rel="preload" as="image" href="map.png" media="(max-width: 600px)"> <link rel="preload" as="script" href="map.js" media="(min-width: 601px)">
var isSupportPreload = document.createElement("link").relList && document.createElement("link").relList.supports('preload')
先說下link標籤的使用。segmentfault
href
外部資源的路徑,rel
外部資源與當前文檔的關係,rel其實relation的縮寫,但由於多數用於css,因此rel是stylesheet
的時候,是能夠省略的head
裏<link rel="stylesheet" media="(max-width: 800px)" href="example.css" />
rel="preload"
,href是仍然是資源路徑,而後加上as來講明加載的內容的類型就能夠了,經常使用的"script" "style" "image" "media" "document"
。<!-- js -->
<link rel="preload" href="static.js" as="script" onload="preloadFinished()">
<!-- css -->
<link rel="preload" href="static.css" as="style" onload="preloadFinished()">
<!-- 字體,注意crossorigin和type的增長 -->
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>
複製代碼
其實動態加載就是插入帶preload的link,執行的時候,動態的建立script。瀏覽器
function loadScript(url){
var link = document.createElement("link");
link.href = url
link.rel = "preload";
link.as = "script";
document.head.appendChild(link);
}
function execScript(url){
var script = document.createElement("script");
script.src = url;
document.body.appendChild(script);
}
// 加載這個js,但不執行
loadScript("myscript.js")
// 某個時機執行
setTimeout(function(){
execScript("myscript.js")
},1000)
複製代碼
注意吖,不是說加載了就是執行!!!!!
也就是preload只管加載!!!
換句話說,你買東西,preload至關於快遞到你家門口了,可是你只有拆了包裹纔算是使用!!!
代碼的體現就是,之前的<link href="xx.css">
和<script src="xxx.js">
仍是要寫在相應的位置的!
而後再在head頭裏加上<link rel="preload" href="xx.css" as="style"><link rel="preload" href="xxx.js" as="script">
,preload是錦上添花的!安全
我以爲吧,先去知道瀏覽器加載機制以後,才能更加體會到preload的美!服務器
這邊簡單的總結下,瀏覽器的加載機制:app
Priority
prefetch至關於說,「嗨,瀏覽器,下個頁面可能要用到這個資源,你閒着無聊就幫我加載下唄~」。 用法跟preload差不離,link的rel="prefetch"
異步
和preload區別:
先說域名只是服務器ip地址的美化,也就是雖然請求域名,但實際是先請求dns服務器,dns服務器返回域名所表明的真正的服務器ip,瀏覽器再向服務器發送請求。
dns-prefetch就是讓瀏覽器先將域名發給dns服務器,讓瀏覽器知道,域名所指的真正的服務器,以後在發送請求的時候,就直接發給服務器了。
簡單的一行就能讓支持的瀏覽器提早解析DNS。也就是說在瀏覽器請求資源時,DNS查詢就已經準備好了。
使用方式<link rel="dns-prefetch" href="//example.com">
使用場景:
直接引用這個回答 ,當瀏覽器碰到 script 腳本的時候:
<script src="script.js"></script>
<script async src="script.js"></script>
<script defer src="myscript.js"></script>
preload的好處
w3c的preload,一眼能夠看到支持
瀏覽器加載機制
prefetch和preload
一籮筐的預取技術