preload 专注于当前页面,以高优先级加载资源。注意 preload 并不会阻塞 window 的 onload 事件。
预加载图像的例子:
<link rel="preload" href="image.png">
预加载字体的例子
记住:如果你的预加载需要 CORS 的跨域请求,那么也要加上 crossorigin 的属性。
<link rel="preload" href="<https://example.com/fonts/font.woff>" as="font" crossorigin>
这里有一个通过 HTML 和 JavaScript 预加载样式表的例子:
<!-- Via markup -->
<link rel="preload" href="/css/mystyles.css" as="style">
<!-- Via JavaScript -->
<script>
var res = document.createElement("link");
res.rel = "preload";
res.as = "style";
res.href = "css/mystyles.css";
document.head.appendChild(res);
</script>
和预加载的差异:
浏览器预加载只支持预加载在 html 中声明的资源,preload 指令允许预加载在 CSS 和JavaScript 中定义的资源,并允许决定何时应用每个资源。
Prefetch 是一个低优先级的资源提示,允许浏览器在后台(空闲时)获取将来可能用得到的资源,并且将他们存储在浏览器的缓存中。
假设用户将会请求它们,所以允许浏览器获取资源并将他们存储在缓存中。不要过早进行 prefetch
<link rel="prefetch" href="/uploads/images/pic.png">
在后台运行 DNS 的解析,建议对 Google fonts,Google Analytics 和 CDN 进行处理。
<!-- Prefetch DNS for external assets -->
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<link rel="dns-prefetch" href="//www.google-analytics.com">
<link rel="dns-prefetch" href="//opensource.keycdn.com">
<link rel="dns-prefetch" href="//cdn.domain.com">
要注意的是 Chrome 已经在敲击地址栏的时候做了类似的事情,比如 DNS preresolve 和 TCP preconnect
它们都优化了可能导航到的下一页上的资源的加载,区别是 prerendering 在后台渲染了整个页面,以及整个页面所有的资源。