在单个网站上的 Page Speed Insights 中收到奇怪的错误
Receiving strange error in Page Speed Insights on a single website
我的服务器上有一个网站不会 运行 在 Page Speed Insights 中(此服务器上的所有其他网站 运行 正常):https://[URL]/。我收到以下错误:
发生错误
Lighthouse 返回错误:PAGE_HUNG。由于页面停止响应,Lighthouse 无法可靠地加载您请求的 URL。您可以刷新重试。
如果问题仍然存在,请访问 PageSpeed Insights 邮件列表以获得支持。
但是,该站点在所有浏览器中对我来说都可以正常加载。
那是因为您的网站有错误。
如果您将用户代理设置为移动设备 phone,您的“自动优化”JS 文件中似乎有一个错误,这意味着它会卡在一个循环中,向控制台打印一个空数组。
重现步骤
- 在 Google Chrome (f12)
中打开开发者工具
- 将设备设置为 'Galaxy S5'(左上角,第二个图标看起来像手机 phone 和平板电脑以激活“设备工具栏”)
- 在打开“控制台”选项卡的情况下重新加载页面。
- 观看每秒 12000
console.logs
的滚动!
如何修复
据我所知,这是由于您的滑块造成的,它似乎可以在桌面上很好地记录图像(6 张图像),但第二个是移动用户代理,它记录一个空白数组数千次第二.
这看起来是因为您有两个使用 var i
的嵌套循环。
看起来第一个循环开始尝试遍历项目,它遇到了第二个循环(现在是一个不执行的循环,因为 slides
变量是一个空数组并且没有长度) 但是 仍然执行的一件事是 var i = 0
.
然后将 i
重置为 0,并且 for (var i = 0; i < bodyClassList.length; i++) {
循环永远不会超过 0,因此它创建了一个无限循环。
var bodyClassList = document.getElementsByTagName("BODY")[0].classList;
for (var i = 0; i < bodyClassList.length; i++) {
if (bodyClassList[i] === 'page-id-123') {
var slides = $('.slides li img').toArray();
console.log(slides);
for (var i = 0; i < slides.length; i++) { //this resets the i variable to 0 every time because slides.length = 0 (therefore i is not incremented)
//this never gets executed as the slides.length is 0.
//removed a load of if / else statements for brevity
}
}
}
只需更改您的代码,使其中一个循环具有不同的变量名称,您就不会遇到此冲突。 (例如,第一个循环 var i
并确保第二个循环是 var j
)。
我知道这可能是因为自动优化出错,所以您必须先检查未缩小的源代码,如果它使用两个不同的变量,那么您可能必须手动最小化/更改有问题的文件。
当 slides
变量不为空时,为什么您没有遇到同样的问题?
因为虽然第二次循环中的重置为 0 也发生在这里 i
在第二次执行第一个循环之前递增到 5。
if (bodyClassList[i] === 'page-id-123') {
出现在索引 5 处,因此当第一个循环递增到 6 时,它第二次绕过它并且 i
变量永远不会重置为 0。
具有讽刺意味的是,如果你少一张幻灯片,这个问题就会更快出现!
我的服务器上有一个网站不会 运行 在 Page Speed Insights 中(此服务器上的所有其他网站 运行 正常):https://[URL]/。我收到以下错误:
发生错误 Lighthouse 返回错误:PAGE_HUNG。由于页面停止响应,Lighthouse 无法可靠地加载您请求的 URL。您可以刷新重试。 如果问题仍然存在,请访问 PageSpeed Insights 邮件列表以获得支持。
但是,该站点在所有浏览器中对我来说都可以正常加载。
那是因为您的网站有错误。
如果您将用户代理设置为移动设备 phone,您的“自动优化”JS 文件中似乎有一个错误,这意味着它会卡在一个循环中,向控制台打印一个空数组。
重现步骤
- 在 Google Chrome (f12) 中打开开发者工具
- 将设备设置为 'Galaxy S5'(左上角,第二个图标看起来像手机 phone 和平板电脑以激活“设备工具栏”)
- 在打开“控制台”选项卡的情况下重新加载页面。
- 观看每秒 12000
console.logs
的滚动!
如何修复
据我所知,这是由于您的滑块造成的,它似乎可以在桌面上很好地记录图像(6 张图像),但第二个是移动用户代理,它记录一个空白数组数千次第二.
这看起来是因为您有两个使用 var i
的嵌套循环。
看起来第一个循环开始尝试遍历项目,它遇到了第二个循环(现在是一个不执行的循环,因为 slides
变量是一个空数组并且没有长度) 但是 仍然执行的一件事是 var i = 0
.
然后将 i
重置为 0,并且 for (var i = 0; i < bodyClassList.length; i++) {
循环永远不会超过 0,因此它创建了一个无限循环。
var bodyClassList = document.getElementsByTagName("BODY")[0].classList;
for (var i = 0; i < bodyClassList.length; i++) {
if (bodyClassList[i] === 'page-id-123') {
var slides = $('.slides li img').toArray();
console.log(slides);
for (var i = 0; i < slides.length; i++) { //this resets the i variable to 0 every time because slides.length = 0 (therefore i is not incremented)
//this never gets executed as the slides.length is 0.
//removed a load of if / else statements for brevity
}
}
}
只需更改您的代码,使其中一个循环具有不同的变量名称,您就不会遇到此冲突。 (例如,第一个循环 var i
并确保第二个循环是 var j
)。
我知道这可能是因为自动优化出错,所以您必须先检查未缩小的源代码,如果它使用两个不同的变量,那么您可能必须手动最小化/更改有问题的文件。
当 slides
变量不为空时,为什么您没有遇到同样的问题?
因为虽然第二次循环中的重置为 0 也发生在这里 i
在第二次执行第一个循环之前递增到 5。
if (bodyClassList[i] === 'page-id-123') {
出现在索引 5 处,因此当第一个循环递增到 6 时,它第二次绕过它并且 i
变量永远不会重置为 0。
具有讽刺意味的是,如果你少一张幻灯片,这个问题就会更快出现!