发布日期:2018 年 8 月 17 日
本指南结合具体情境探讨了 PageSpeed Insights 规则:在优化关键渲染路径时应注意哪些事项,以及原因。
移除阻塞渲染的 JavaScript 和 CSS
为了尽可能缩短首次渲染时间,请尽量减少(在可能的情况下消除)网页上的关键资源数量,尽量减少下载的关键字节数,并优化关键路径长度。
优化 JavaScript 的使用
默认情况下,JavaScript 资源会阻止解析器,除非标记为 async 或使用特殊的 JavaScript 代码段添加。解析器屏蔽 JavaScript 会强制浏览器等待 CSSOM 并暂停 DOM 的构建,这反过来可能会大大延迟首次渲染的时间。
首选异步 JavaScript 资源
异步资源不会阻塞文档解析器,并允许浏览器在执行脚本之前避免阻塞 CSSOM。通常,如果脚本可以使用 async 属性,也意味着它对于首次渲染并非必不可少。考虑在初始渲染后异步加载脚本。
避免同步服务器调用
使用 navigator.sendBeacon() 方法限制 unload 处理程序中由 XMLHttpRequests 发送的数据。由于许多浏览器要求此类请求必须是同步的,因此它们可能会减慢网页过渡速度,有时甚至会明显减慢。以下代码展示了如何使用 navigator.sendBeacon() 在 pagehide 处理程序(而不是 unload 处理程序)中向服务器发送数据。
<script>
function() {
window.addEventListener('pagehide', logData, false);
function logData() {
navigator.sendBeacon(
'https://putsreq.herokuapp.com/Dt7t2QzUkG18aDTMMcop',
'Sent by a beacon!');
}
}();
</script>
fetch() 方法提供了一种更好的异步请求数据的方式。fetch() 使用 Promise 而不是多个事件处理脚本来处理响应。与对 XMLHttpRequest 的响应不同,fetch() 响应是一个流对象。这意味着,对 json() 的调用也会返回一个 Promise。
<script>
fetch('./api/some.json')
.then(
function(response) {
if (response.status !== 200) {
console.log('Looks like there was a problem. Status Code: ' + response.status);
return;
}
// Examine the text in the response
response.json().then(function(data) {
console.log(data);
});
}
)
.catch(function(err) {
console.log('Fetch Error :-S', err);
});
</script>
fetch() 方法还可以处理 POST 请求。
<script>
fetch(url, {
method: 'post',
headers: {
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8"
},
body: 'foo=bar&lorem=ipsum'
}).then(function() { // Additional code });
</script>
推迟解析 JavaScript
为了尽量减少浏览器为呈现网页而必须执行的工作量,请推迟执行对构建初始呈现的可见内容不重要的任何非必要脚本。
避免长时间运行 JavaScript
长时间运行的 JavaScript 会阻止浏览器构建 DOM、CSSOM 和呈现网页,因此请将对首次呈现不重要的任何初始化逻辑推迟到以后。如果需要运行较长的初始化序列,请考虑将其拆分为多个阶段,以便浏览器在这些阶段之间处理其他事件。
优化 CSS 使用
CSS 是构建渲染树所必需的,而在网页的初始构建期间,JavaScript 通常会阻塞 CSS。确保将所有非必需 CSS 标记为非关键 CSS(例如,打印和其他媒体查询),并尽可能减少关键 CSS 的数量和传送时间。
将 CSS 放在文档标头处
在 HTML 文档中尽早指定所有 CSS 资源,以便浏览器可以尽快发现 <link> 标记并分派 CSS 请求。
避免 CSS 导入
CSS 导入 (@import) 指令使一个样式表能够从另一个样式表文件导入规则。不过,请避免使用这些指令,因为它们会在关键路径中引入额外的往返:只有在收到并解析了具有 @import 规则本身的 CSS 样式表后,系统才会发现导入的 CSS 资源。
内嵌阻止呈现的 CSS
为了获得最佳性能,您可能需要考虑将关键 CSS 直接内嵌到 HTML 文档中。这样可以消除关键路径中的额外往返,如果操作得当,可以实现“一次往返”关键路径长度,其中只有 HTML 是阻塞资源。