Preload

在我们的浏览器加载资源的时候,对于每一个资源都有其自身的默认优先级,倘若我们能修改每一个资源的默认优先级,那我们几乎可以按照我们的预期加载想要加载的资源。

以谷歌浏览器为例,我们打开控制台,并切换到Network选项,点击刷新页面,在网络下面的title一行点击鼠标右键,勾选Priority即可看到加载资源的优先级,我们可以看到样式的级别比脚本的优先级高,毕竟页面的一加载进来肯定是样式首先需要渲染的,不然整个页面便会四分五裂,用户体验不好。

preload一旦启用后便会告知浏览器应该尽快的加载某个资源,如果提取的资源3s内未在当前使用,在谷歌开发工具将会触发警告消息:

preload语法如下:

1 <link rel="preload" as="script" href="foo.js">
2 <link rel="preload" as="style" href="bar.css">

除了以上指定的资源外,还可以加载audio、font、video以及document等,详情点击这里了解。

跨域资源处理

如需加载跨域的资源列表,则需要正确设置CORS,接着便可以在<link>元素中设置好crossorigin属性即可:

1 <link rel="preload" as="font" crossorigin="crossorigin" type="font/woff2" href="foo.woff2">

这里有一个特例便是无论是否跨域,字体的获取都需要设置crossorigin属性,这是由于历史原因造成,有兴趣了解可移步这里了解,另外我们还可以使用media响应式的加载图片,比如:

1 <link rel="preload" href="bg@2x.png" as="image" media="(max-width: 325px)">
2 <link rel="preload" href="bg@3x.png" as="image" media="(min-width: 400px)">

另一个重要的地方便是如果预加载一个脚本,它并不是执行:

 1 //只拉取下载不执行
2 var preloadLink = document.createElement("link");
3 preloadLink.href = "foo.js";
4 preloadLink.rel = "preload";
5 preloadLink.as = "script";
6 document.head.appendChild(preloadLink);
7
8 //如果需要执行
9 var preloadedScript = document.createElement("script");
10 preloadedScript.src = "foo.js";
11 document.body.appendChild(preloadedScript);

preload兼容性

兼容似乎IE全体阵亡,edge也得17+才能勉强支持,火狐需要手动启动支持,移动端支持程度还是挺好的。

Prefetch

简而言之预提取就是在我们页面加载完成后,在带宽可用的情况下,加载用户下一步期待的页面资源,比如企业认证,一般都是分好几个页面进行认证的,在用户从第一个页面进行认证的时候,在页面加载完成,用户正在填写表单数据之时,加载第二个页面的部分资源,从而使用户更快打开下一个页面,从而增加用户体验,示例:
1 <link rel="prefetch" href="demo.html">
2 <link rel="stylesheet" href="demo.css">
当浏览器解析到link标签时,读取到rel的值为prefetch,便会将这一个资源添加的队列中,当浏览器空闲时便会预提取资源,但是在demo.html页面中只是加载HTML,不会加载demo页面里面的任何其他资源,除非你在demo页面也明确使用了预提取。
Pretetch兼容性
各大浏览器支持都还挺好,IE11+以上,但是Safari貌似到现在还没支持(但是看WKWebView的源码,是支持了的)
 

DNS-Prefetch

我们都知道,当我们在浏览器的地址栏输入域名的时候,首先要进行的就是域名解析,因为我们需要加载域名对应的资源,这个过程很快,但是如果在移动端,那可是一个分秒必争的地方,当一个页面需要访问许多外部域名的资源的时候,如果我们能在用户浏览页面的时候,在浏览器空闲的时间,把可能需要访问的域名都提前做好了域名解析,那是不是大大增加了用户打开页面的响应时间,增加用户体验,为了解决这个问题,w3c便提出来一个标准,学名叫dns-prefetch。
 

使用方法上面中已经支持了,指定rel=”dns-prefetch”,在href中指定页面需要解析的域名即可,你可能已经注意到了上面的图中域名使用了双斜杠,这个双斜杠表示URL以主机名开头,和你使用完整URL(比如http://g.alicdn.com/)是等效的。在RFC1808中被指定。

当然并不是所有的页面需要用到的外部域名都需要做这样的域名解析,浏览器默认会解析超链接属性的href里面的域名,并且你的网站域名还不能是HTTPS,如果是HTTPS,则需要设置请求头或加入一段强制开启域名解析的meta标签。

1 //HTTP
2 <link rel="dns-prefetch" href="//a.com"> //多余
3 <a href="http://a.com">
4 //HTTPS
5 <meta http-equiv="x-dns-prefetch-control" content="on">//强制开启
6 <a href="http://a.com">

当然,并不建议对HTTPS网站开启强制解析的方式,因为这样会带来一些安全隐患,具体可参考这里

Preconnect

预连接,也就是启动早期连接(包括DNS查找,TCP握手和可选TLS协商),我们来看一个例子:

1 <link href='https://fonts.demo.com' rel='preconnect' crossorigin>
2 <link href='https://demo.com/css?family=黑体' rel='stylesheet'>

一个网络字体正常加载一般都包括:

  • 页面加载样式,解析样式用到的网络字体
  • 网络字体开始下载,首先开始DNS的查找
  • 然后TCP握手
  • 如果是HTTPS,还有TLS协商,最后下载字体

当然如果是跨域资源,不要忘了加上crossorigin属性。

Preconnect兼容性

IE15+以上部分兼容,移动端兼容良好。

Prerender

预渲染,简单来说就是浏览器会下载指定链接的资源,并下载以及渲染它,就好比我们打开了一个新的Tab标签页,静默的在后台的下载执行,当然,浏览器也不一定会下载渲染它,这取决预很多情况,比如浏览器是否空闲以及操作系统是否会放弃下载过慢的资源文件。

除非你真的能十分的肯定用户接下来一定会触发你所指定的资源地址,否则对于用户来说这是一种带宽的浪费,使用例子如下:

1 <link rel="prerender" href="https://www.apple.com/">

Prerender兼容性

虽然是prerender是HTML5规范的一部分,但是似乎很多厂商都还没有实现,但是IE11竟然支持。

结尾

讲了这么多,最后整理了一个表格,帮助大家快速查阅参考,每个浏览器的实施细节都有所区别,这里以Chrome浏览器表格为例:

 

HTML link标签中preload,prefetch,dns-prefetch,preconnect,prerender的更多相关文章

  1. 【131031】rel 属性 -- link标签中的rel属性,定义了文档与链接的关系

    此属性通常出现在a,link标签中 属性值 Alternate -- 定义交替出现的链接 Alternate 属性值 -- alternate是LinkTypes的一个值,网页设计者可以通过此值,设计 ...

  2. link 标签中“rel=stylesheet”的作用

    最近在复习我的培训项目学子商城项目的时候在引入外部css的时候忘记加上了rel=stylesheet(因为以前看别人给的模板有所以就加了上去,所以并没有太大印象) 那rel=stylesheet到底起 ...

  3. html:<link> 标签中的 media 属性

    HTML <link> 标签的 media 属性 定义和用法 media 属性规定被链接文档将显示在什么设备上. media 属性用于为不同的媒介类型规定不同的样式. media属性值 ( ...

  4. link标签中rel属性的作用

    Link标签有两个作用:1. 定义文档与外部资源的关系:2. 是链接样式表.link标签是用于当前文档引用外部文档的 这个标签的rel属性用于设置对象和链接目标间的关系,说白了就是指明你链进来的对象是 ...

  5. link标签中的integrity和crossorigin字段

    https://blog.csdn.net/SNP_fuyun/article/details/77113985?locationNum=10&fps=1

  6. DNS Prefetch

    DNS 实现域名到IP的映射.通过域名访问站点,每次请求都要做DNS解析.目前每次DNS解析,通常在200ms以下.针对DNS解析耗时问题,一些浏览器通过DNS Prefetch 来提高访问的流畅性. ...

  7. DNS Prefetch初认识

    今天在看一个后台框架时,发现这样的代码: <link rel="dns-prefetch" href="//0.s3.envato.com">< ...

  8. 利用link标签的disabed属性大面积的对其他标签元素的CSS样式进行替换操作

    由于平时对元素样式的控制基本上只是3,4个,所以一般用Jquery的时候直接使用$(element).css();这个方法,或者使用$(element).addClass()方法完成样式操作.对于小范 ...

  9. 标签中的rel属性的含义

    rel与rev属性相同,它们都是属于LinkTypes属性. rel 属性 -- rel属性,描述了当前页面与href所指定文档的关系, rel是relationship(关系)的英文缩写. rev ...

  10. 详解HTML5中rel属性的prefetch预加载功能使用

    在HTML5中,有个很有用但常被忽略的特性,就是预先加载(prefetch),它的原理是: 利用浏览器的空闲时间去先下载用户指定需要的内容,然后缓存起来,这样用户下次加载时,就直接从缓存中取出来,效率 ...

随机推荐

  1. 5W1H聊开源之What——开源是什么?

    美国政治传播学家拉斯韦尔提出了5W传播模式,经过后人的不断运用和发展总结,形成了一套逐渐成熟的"5W1H"体系,即:对选定的项目.工序或操作,都要从原因(何因Why).对象(何事W ...

  2. #矩阵乘法,线段树#CF575A Fibonotci

    题目 分析 \(K\)那么大肯定是矩阵乘法, 带修改可以用线段树单点修改, 转移矩阵类似于斐波那契数列, 这题思维难度不大,细节很多,需要很长时间QWQ 时间复杂度\(O(mlog_2K)\),具体注 ...

  3. Go 语言中 For 循环:语法、使用方法和实例教程

    for循环用于多次执行特定的代码块,每次都可以使用不同的值.每次循环执行都称为一次迭代.for循环可以包含最多三个语句: 语法 for 语句1; 语句2; 语句3 { // 每次迭代要执行的代码 } ...

  4. 基于HarmonyOS的HTTPS请求过程开发示例(ArkTS)

      介绍 本篇Codelab基于网络模块以及Webview实现一次HTTPS请求,并对其过程进行抓包分析.效果如图所示: 相关概念 ● Webview:提供Web控制能力,Web组件提供网页显示能力. ...

  5. HarmonyOS如何使用异步并发能力进行开发

      一.并发概述 并发是指在同一时间段内,能够处理多个任务的能力.为了提升应用的响应速度与帧率,以及防止耗时任务对主线程的干扰,HarmonyOS系统提供了异步并发和多线程并发两种处理策略. ● 异步 ...

  6. 保护C#代码的艺术:深入浅出代码混淆技术

    摘要 在C#开发中,代码的保护是一个不可忽视的问题.本文深入探讨了几种常用的C#代码混淆工具,帮助开发者理解如何有效地保护代码不被反编译.同时,本文也对混淆技术的优缺点进行了分析,并提供了一些实际使用 ...

  7. docker 应用篇————docker 的文件系统[十]

    前言 简单介绍一下docker的文件系统. 正文 docker 容器启动就是一个文件系统的启动. 在docker中,每一层镜像都具备一些文件. 比如说,有一个centos的镜像. 里面就是一个微小版的 ...

  8. 批处理 if的知识点

    正文 批处理的if不同于我们在一些常规语言中的if,比如说c或者c# 或者 java等. 如果我们判断两个字符是否相等,我们使用 'a'=='a' 来判断. 但是如果是不相等却不能这样. gtr 大于 ...

  9. spring boot @propertySource @importResource @Bean [六]

    @propertySource 指定property的配置源. 创建一个person.property: 然后修改person注解; 在运行test之后,结果为: @importResource 这个 ...

  10. mysql 重新整理——七种连接join连接[六]

    前言 总结一下其中join连接. 正文 又到了盗图时刻: 上面标记好了顺序. 第一种: select * from A a left join B b on a.key=b.key 这里解释一下,这里 ...