通常写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
一箩筐的预取技术