前面的话

基于VUE的前端小站改造成SSR服务器端渲染后,HTML文档会自动使用preload和prefetch来预加载所需资源,本文将详细介绍preload和prefetch的使用

资源优先级

在介绍preload和prefetch之前,首先要介绍浏览器的资源优先级

在Chrome浏览器中,不同的资源在浏览器渲染的不同阶段进行加载的优先级不同

一共分成五个级别

Highest 最高

Hight 高

Medium 中等

Low 低

Lowest 最低

其中主资源HTML和CSS的优先级最高,其他资源根据情况的不同优先级不一

JS脚本根据它们在文件中的位置是否异步、延迟或阻塞获得不同的优先级:

1、网络在第一个图片资源之前阻塞的脚本在网络优先级中是中级

2、网络在第一个图片资源之后阻塞的脚本在网络优先级中是低级

3、异步/延迟/插入的脚本(无论在什么位置)在网络优先级中是很低级

图片(视口可见)将会获得相对于视口不可见图片(低级)的更高的优先级(中级),所以某些程度上 Chrome 将会尽量懒加载这些图片。低优先级的图片在布局完成被视口发现时,将会获得优先级提升

preload 使用 “as” 属性加载的资源将会获得与资源 “type” 属性所拥有的相同的优先级。比如说,preload as="style" 将会获得比 as=“script” 更高的优先级

不带 “as” 属性的 preload 的优先级将会等同于异步请求

preload

【定义】

如下所示,preload是link元素中的rel属性值

preload 提供了一种声明式的命令,让浏览器提前加载指定资源(加载后并不执行),需要执行时再执行

这样做的好处在于:

1、将加载和执行分离开,不阻塞渲染和document的onload事件

2、提前加载指定资源,不再出现依赖的font字体隔了一段时间才刷出的情况

【创建】

使用 link 标签静态标记需要预加载的资源

也可以使用脚本动态创建一个 link 标签后插入到 head 头部

const link = document.createElement('link');

link.rel= 'preload';

link.as = 'style';

link.href= '/path/to/style.css';

document.head.appendChild(link);

【检测】

在不支持 preload 的浏览器环境中,会忽略对应的 link 标签,而若需要做特征检测的话,则可以使用如下代码

const isPreloadSupported = () =>{const link = document.createElement('link');const relList =link.relList;if (!relList || !relList.supports) {return false;

}return relList.supports('preload');

}

【特性】

使用 preload 后,不管资源是否使用都将提前加载。若不确定资源是必定会加载的,则不要错误使用 preload,以免本末导致,给页面带来更沉重的负担

Preload 有 as 属性,浏览器可以设置正确的资源加载优先级,这种方式可以确保资源根据其重要性依次加载, 所以,Preload既不会影响重要资源的加载,又不会让次要资源影响自身的加载;浏览器能根据 as 的值发送适当的 Accept 头部信息;浏览器通过 as 值能得知资源类型,因此当获取的资源相同时,浏览器能够判断前面获取的资源是否能重用

如果忽略 as 属性,或者错误的 as 属性会使 preload 等同于 XHR 请求,浏览器不知道加载的是什么,因此会赋予此类资源非常低的加载优先级

Preload 的与众不同还体现在 onload 事件上。也就是说可以定义资源加载完毕后的回调函数

比如,可以使用preload的样式表立即生效

此外,preload 不会阻塞 windows 的 onload 事件

对跨域的文件进行preload时,必须加上 crossorigin 属性

【二次获取】

1、不使用as属性

如果对所 preload 的资源不使用明确的 “as” 属性,将会导致二次获取

2、字体文件

preload 字体不带 crossorigin 会二次获取! 确保对 preload 的字体添加 crossorigin 属性,否则字体文件会被下载两次,这个请求使用匿名的跨域模式。这个建议也适用于字体文件在相同域名下,也适用于其他域名的获取(比如说默认的异步获取)

【警告】

没有用到的 preload 资源在 Chrome 的 console 里会在 onload 事件 3s 后发生警告

prefetch

如下所示,prefetch是link元素中的rel属性值

它的作用是告诉浏览器加载下一页面可能会用到的资源,注意,是下一页面,而不是当前页面。因此该方法的加载优先级非常低,也就是说该方式的作用是加速下一个页面的加载速度

【区分】

preload 是告诉浏览器页面必定需要的资源,浏览器一定会加载这些资源

prefetch 是告诉浏览器页面可能需要的资源,浏览器不一定会加载这些资源

在VUE SSR生成的页面中,首页的资源均使用preload,而路由对应的资源,则使用prefetch

所以,对于当前页面很有必要的资源使用 preload,对于可能在将来的页面中使用的资源使用 prefetch

【不要混用】

preload 和 prefetch 混用的话,并不会复用资源,而是会重复加载

使用 preload 和 prefetch 的逻辑可能不是写到一起,但一旦发生对用一资源 preload 或 prefetch 的话,会带来双倍的网络请求

prefetch 和preload_资源预加载preload和资源预读取prefetch简明学习相关推荐

  1. 【第1159期】CSS预加载Preload

    前言 看天气预报,今天好多地方都开始下雪了.今日早读文章由@李斌分享. 正文从这开始- Preload 作为一个新的web标准,旨在提高性能和为web开发人员提供更细粒度的加载控制.Preload使开 ...

  2. GORM v2 关联预加载Preload和Joins的区别

    前言 本文中使用到的数据表结构以及GORM版本的区分详见以下文章:GORM v2 一对一关联查询使用(Belongs To .Has One) 执行区别 调用gorm的Debug方法打印一下一对一关联 ...

  3. android调用h5预加载图片,图片预加载 preload

    图片预加载 HTML5学堂:2014年年初的时候,曾经在自己的博客"独行冰海"里写过关于图片预加载和懒加载的博文,当时的文章当中没有写什么关于预载的代码范例,当前打算把预载和懒载分 ...

  4. vue网页预加载页面_页面预加载效果

    vue网页预加载页面 View demo 查看演示Download Source 下载源 Today we want to show you how to create a very simple p ...

  5. android listview 预加载动画,Android - 使用预加载的数据库填充ListView

    我想使用我已经使用SQLite数据库浏览器创建的预加载数据库来填充listview.但是,我不断收紧.对于DatabaseHelper类,我精确地在http://www.reigndesign.com ...

  6. 微信H5资源预加载(图片、字体)

    一.背景 微信活动H5页面的特点之一就是资源多(图.字体.音频等),动不动就几十兆.庞大的资源量很可能导致页面不流畅.如下图,因为背景图还没加载完,进入第二页时会有一瞬间"白屏". ...

  7. 前端性能优化之预加载

    网络连接的快慢,是前端性能的瓶颈之一,在这里我们能做些什么呢,下面介绍几个通过浏览器特性来很容易提高资源加载速度的方法: DNS prefetching DNS解析的速度可用通过下面的标签来进行预解析 ...

  8. jQuery插件之图片预加载

    背景: 图片是web页面的重要组成部分,也是前端页面优化的重要内容.当用户访问一个比较庞大的页面时,若相关资源没有提前加载,可能会展示给用户一片空白,从而导致用户流失等:再比如受网速的影响,资源加载时 ...

  9. 前端优化——预加载篇

    #预加载 1.什么是预加载 资源预加载是另一个性能优化技术,我们可以使用该技术来预先告知浏览器某些资源可能在将来会被使用到.预加载简单来说就是将所有所需的资源提前请求加载到本地,这样后面在需要用到时就 ...

最新文章

  1. PropertiesFactoryBean PropertyPlaceholderConfigurer 区别
  2. (牛人莫入)Silverlight 独立文件存储
  3. 为PHP设置服务器(Apache/Nginx)环境变量
  4. Linux/CentOS7给一个网卡设定多个IP地址, Linux网卡配置虚拟IP
  5. 英语学习过程中的几点体会(1)
  6. NTT通信公司在大阪开通运营容灾数据中心
  7. spring断言使用
  8. 彻底理解js是单线程
  9. Java - 经常使用函数Random函数
  10. 物尽其用-让推荐系统成为你学习的助手
  11. JarvisOJ Misc shell流量分析
  12. 套接口编程理论基础:正常启动
  13. Java生成csv文件设置文本格式
  14. Python 中 ‘unicodeescape’ codec can’t decode bytes in position X-X: trun错误
  15. 鸿蒙造化塔之秘,鸿蒙之始,天地之秘;生生不息,亘古不易;天为之天,地为之地;生为之续,死为之继;玲珑九转,造化之意;的作者、出处以及相似句子__句子大全...
  16. 【热门主题:萤火之夜xp桌面】
  17. Rancher hosted Kubernetes AKS
  18. 选购电脑cpu 酷睿 区别 GPU选择
  19. Web前端开发技术:Vue开发基础(2)
  20. C++中,结构体vector使用sort排序

热门文章

  1. Discuz论坛 自动加好友留言程序
  2. alv中编辑的时候quan字段小数位数被截取掉
  3. 【图像重建】基于matlab字典学习KSVD图像低秩重建【含Matlab源码 1762期】
  4. 诸葛io:领跑小程序战场,数据监测你做了吗?
  5. MySQL联合查询(多表查询)
  6. 30岁硕士拿100万在云南开启“吃利息躺平式养老” 现在年轻人在怎样规划养老?...
  7. 智安网络|网络安全威胁多样化和复杂化,防护任务日益艰巨
  8. 使Debian支持ll命令
  9. mysql 中的删除列_如何从MySQL中的表中删除列?
  10. 为什么能力最强的人做不了大领导?