开始

今天突然心血来潮想起前端性能优化的问题,这基本是老生常谈的事情了,面试随便都能说上几个,但是还是有点疑问:就是Head标签了,记忆中Head可是藏龙卧虎,各种技能都有,当然这些不可能都一一记住,太伤脑细胞了,于是打开神奇的Github,来到这个 HEAD项目,翻一翻就会看到今天的主角dns-prefetch,preconnect,prefetch和prerender兄弟了,究竟他们有何区别,是怎样的一家人尼。

深入

首先借助万能的谷歌,找到W3C的文档,学习这种事情最好就是找到官方的东西才能原汁原味,以下是个人对文档的一些理解。

dns-prefetch

其实意思也很容易理解,dns-prefetch就是一项使浏览器主动去执行域名解析的功能。
一般的形式就是这样:

<link rel="dns-prefetch" href="//example.com">

href属性值就是需要DNS预解析的host

preconnet

浏览器要建立一个连接,一般需要经过DNS查找,TCP三次握手和TLS协商(如果是https的话),这些过程都是需要相当的耗时的,所以preconnet,就是一项使浏览器能够预先建立一个连接,等真正需要加载资源的时候就能够直接请求了。
而一般形式就是

<link rel="preconnect" href="//example.com">
<link rel="preconnect" href="//cdn.example.com" crossorigin>

浏览器会进行以下步骤:

  • 解释href的属性值,如果是合法的URL,然后继续判断URL的协议是否是http或者https否则就结束处理
  • 如果当前页面host不同于href属性中的host,crossorigin其实被设置为anonymous(就是不带cookie了),如果希望带上cookie等信息可以加上crossorign属性,corssorign就等同于设置为use-credentials

prefetch

能够让浏览器预加载一个资源(HTML,JS,CSS或者图片等),可以让用户跳转到其他页面时,响应速度更快。
一般形式就是

<link rel="prefetch" href="//example.com/next-page.html" as="html" crossorigin="use-credentials">
<link rel="prefetch" href="/library.js" as="script">

虽然是预加载了,但是页面是不会解析或者JS是不会直接执行的。

prerender

而prerender不仅会加载资源,还会解执行页面,进行预渲染,但是这都是根据浏览器自身进行判断。
浏览器可能会

  • 分配少量资源对页面进行预渲染
  • 挂起部分请求直至页面可见时
  • 可能会放弃预渲染,如果消耗资源过多
    等等情况。。。

一般形式

<link rel="prerender" href="//example.com/next-page.html">

pr属性

dns-prefetch,preconnect,prefetch和prerender都支持一个pr属性(0.0到1.0范围的值),就是让浏览器能够判断优先加载那些资源,毕竟浏览器内部是有可用的连接池的,资源紧张的情况下只能加载优先级更高的资源。

总结

一句话:当然就是为了性能和更好用户体验了。
dns-prefetch和preconnect的存在可以让浏览器在解析文档的同时可以预先进行DNS解析或者预先建立一个链接,接下来加载CDN的其他资源时就可以更加快速(我猜的,其实文档并没有说浏览器应该在那个阶段进行,只是说尽可能早)。因为DNS解析和TCP三次握手都是相当消耗时间,当然也有其他手段去在其他方面去优化例如持久链接和多路复用,不用每次请求都建立建立一个新的链接,但是建立一个链接所必要的消耗是优化不了。所以在解析文档的同时做好这些事情,页面整体加载速度可以有一定程度上的优化。
prefetch和prerender可以告诉浏览器用户下个跳转的页面的地址,浏览器可以预加载这些页面资源到缓存或者预渲染好,用户就以后体验页面秒开(是不是很爽),当然了不一定是页面,其他资源例如图片,js和css等等也是可以预加载到缓存里面。

本文转载于:猿2048➝https://www.mk2048.com/blog/blog.php?id=haiicck1abb

Head标签里面的dns-prefetch,preconnect,prefetch和prerender的更多相关文章

  1. 用js动态的改变img标签里面的src属性实现图片的循环切换

    JS:根据循环切换的条件可以用 document.getElementById('').src=''设置, 或者jquery方法: $('#id').attr('src','图片名称’): 具体: i ...

  2. javascript正则找script标签, link标签里面的src或者 href属性

    1. [代码]javascript 简单的search    <script(?:(?:\s|.)+?)src=[\"\'](.+?)[\"\'](?!\<)(?:(? ...

  3. php 正则表达式怎么匹配标签里面的style?

    $str = '<div style="margin:0px;text-align:left;padding:0px;">任意内容</div>'; $reg ...

  4. DNS预解析prefetch

    前面的话 本文将详细介绍DNS预解析prefetch的主要内容 概述 DNS(Domain Name System, 域名系统),是域名和IP地址相互映射的一个分布式数据库.DNS 查询就是将域名转换 ...

  5. prefetch vs preload vs prerender vs preconnect All In One

    prefetch vs preload vs prerender vs preconnect All In One 前端性能优化 prefetch 预获取 https://developer.mozi ...

  6. dede文章调用时过滤调 body里面的style属性和值

    dede 发布文章的时候会在里面的标签中添加一些style 属性,现在改网站想去掉这些属性和里面的值,因为文章太多所以就用下面的方法 \include\arc.listview.class.php 在 ...

  7. js获取单选框里面的值

    rt,如果想获取单选框里面的值,该如何获取呢. <script> window.onload = function(){ //通过名字获取 getElementsByName //var ...

  8. 最全面的 DNS 原理入门

    DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识. 本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作.我的目标是,读完此文后,你就能完全理解DNS. 一.D ...

  9. Secure CRT 如何连接虚拟机里面的CentOS系统——当主机使用无线网的时候 作者原创 欢迎转载

    第一步:设置自己的无线网,并且分享给VM8这个虚拟网卡 第二步:查看VM8网卡的IP地址,如图是192.168.137.1 第三步:设置虚拟机的配置:选择VM8网卡并且是NAT的 第四步:设置虚拟机里 ...

随机推荐

  1. net core or Linux

    某用户执行net core sdk 版本不生效 sudo chmod +x /home/username/netcore3.1sdk/dotnet //某个用户执行新版本net core sdk

  2. 爬虫之标签查找补充及selenium模块的安装及使用与案例

    今日内容概要 bs模块之标签查找 过滤器 selenium模块 今日内容详细 html_doc = """ <html> <head> <t ...

  3. Python程序基本知识

    Python程序基本知识 一. 数据类型与变量 1.1 变量 **变量:**在Python中不需要事先声明变量名及其类型,直接赋值即可创建各种类型的变量 x='Hello World' #创建了整型变 ...

  4. WPF绘制图表-LiveCharts

    LiveCharts是一款非常好用的WPF图表绘制类库,相比其他同类类库,LiveCharts的UI风格样式更加多样更加美观.  准备工作:安装以下两个类库: 1.甘特图 前台View代码 1 < ...

  5. Scala语法2

    练习 package scala_01.practice import org.junit.{Before, Test} import scala.collection.immutable impor ...

  6. 【译】ASP.NET Core 6 中的性能改进

    原文 | Brennan Conroy 翻译 | 郑子铭 受到 Stephen Toub 关于 .NET 性能的博文的启发,我们正在写一篇类似的文章来强调 6.0 中对 ASP.NET Core 所做 ...

  7. linux中mariadb用navicat远程连接

    在Linux中创建数据库并且远程图形化工具连接 安装数据库 [root@node1 ~]# yum install mariadb-server -y #这里我使用的mariadb 其他数据库也可以 ...

  8. 微信小程序文件上传结合lin ul

    html <l-form name="goods" l-form-btn-class="l-form-btn-class" bind:linsubmit= ...

  9. Bert不完全手册2. Bert不能做NLG?MASS/UNILM/BART

    Bert通过双向LM处理语言理解问题,GPT则通过单向LM解决生成问题,那如果既想拥有BERT的双向理解能力,又想做生成嘞?成年人才不要做选择!这类需求,主要包括seq2seq中生成对输入有强依赖的场 ...

  10. Solon 1.6.33 发布,更现代感的应用开发框架

    相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...