Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说preload与prefetch对比,希望能够帮助你!!!。
在preload和prefetch之前,我们一般根据编码需求通过link或者script标签引入页面渲染和交互所依赖的js和css等;然后这些资源由浏览器决定优先级进行加载、解析、渲染等。
然而,有些情况我们需要某些依赖在浏览器进入渲染的主进程之前就希望被加载,但是实际资源加载的状况并不受我们控制,而是根据浏览器内部决定资源的优先级等状况进行加载的。即使我们将需要的资源按照希望的那样放在期望的位置,但是由于资源的加载和解析,尤其是js的加载、解析和编译是阻塞式的,因此往往还是达不到预期。或者,有些资源是我们后边需要的,我们希望在需要它的时候在进行解析和执行,并不想让它的加载影响其他资源的加载及首屏渲染时间。
preload和prefetch的出现为我们提供了可以更加细粒度地控制浏览器加载资源的方法。
<link rel="preload">
<link rel="prefetch">
link标签的preload是一种声明式的资源获取请求方式,用于提前加载一些需要的依赖,并且不会影响页面的onload事件;使用方式如下:
<link rel="preload" as="script" href="test.js" onload="handleOnload()" onerror="handlepreloadError()">
<link rel="preload" as="style" href="test.css" onload="this.rel=stylesheet"> // css加载后立即生效
其中,rel属性值为preload;as属性用于规定资源的类型,并根据资源类型设置Accep请求头,以便能够使用正常的策略去请求对应的资源;href为资源请求地址;onload和onerror则分别是资源加载成功和失败后的回调函数;
其中as的值可以取style、script、image、font、fetch、document、audio、video等;如果as属性被省略,那么该请求将会当做异步请求处理;
另外,在请求跨域资源时推荐加上crossorigin属性,否则可能会导致资源的二次加载(尤其是font资源);
<link rel="preload" as="font" href="www.font.com" crossorigin="anonymous">
<link rel="preload" as="font" href="www.font.com" crossorigin="use-credentials">
prefetch是一种利用浏览器的空闲时间加载页面将来可能用到的资源的一种机制;通常可以用于加载非首页的其他页面所需要的资源,以便加快后续页面的首屏速度;
prefetch加载的资源可以获取非当前页面所需要的资源,并且将其放入缓存至少5分钟(无论资源是否可以缓存);并且,当页面跳转时,未完成的prefetch请求不会被中断;
Chrome有四种缓存:http cache、memory cache、Service Worker cache和Push
cache。在preload或prefetch的资源加载时,两者均存储在http
cache。当资源加载完成后,如果资源是可以被缓存的,那么其被存储在http
cache中等待后续使用;如果资源不可被缓存,那么其在被使用前均存储在memory cache;
结果来自于can i use最新结果
const preloadSupported = () => {
const link = document.createElement('link');
const relList = link.relList;
if (!relList || !relList.supports)
return false;
return relList.supports('preload');
}
参考文献
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章