【发布时间】:2022-03-02 13:39:40
【问题描述】:
我的公司在外面雇佣了一个人,以廉价的方式为灯塔得分进行优化。他让我回顾他们做了什么,我试图弄清楚他们到底做了什么。我们的分数确实上升了,但它看起来像是一套特殊的规则,适用于 lighthouse-chrome 和 GTMetrix 代理,它们忽略某些事情以获得更好的分数。
谁能破译这个并告诉我这只是一个黑客还是合法的?
if (window['\x6E\x61\x76\x69\x67\x61\x74\x6F\x72']['\x75\x73\x65\x72\x41\x67\x65\x6E\x74'].indexOf('\x43\x68\x72\x6F\x6D\x65\x2D\x4C\x69\x67\x68\x74\x68\x6F\x75\x73\x65') == -1 && window['\x6E\x61\x76\x69\x67\x61\x74\x6F\x72']['\x75\x73\x65\x72\x41\x67\x65\x6E\x74'].indexOf('X11') == -1 && window['\x6E\x61\x76\x69\x67\x61\x74\x6F\x72']['\x75\x73\x65\x72\x41\x67\x65\x6E\x74'].indexOf('\x47\x54\x6D\x65\x74\x72\x69\x78') == -1) {
var script_loaded = !1;
function loadJSscripts() {
console.log("Loading scripts 18000ms"), setTimeout(function() {
if (!script_loaded) {
script_loaded = !0;
var t = document.getElementsByTagName("script");
for (i = 0; i < t.length; i++) null !== t[i].getAttribute("data-src") && (t[i].setAttribute("src", t[i].getAttribute("data-src")), delete t[i].dataset.src);
var e = document.getElementsByTagName("link");
for (i = 0; i < e.length; i++) null !== e[i].getAttribute("data-href") && (e[i].setAttribute("href", e[i].getAttribute("data-href")), delete e[i].dataset.href);
setTimeout(function() {
document.dispatchEvent(new CustomEvent("StartAsyncLoading")), document.dispatchEvent(new CustomEvent("StartKernelLoading"))
}, 400)
}
}, 9e3)
}
function loadJSscriptsNow() {
if (!script_loaded) {
console.log("now ..."), script_loaded = !0;
var t = document.getElementsByTagName("script");
for (i = 0; i < t.length; i++) null !== t[i].getAttribute("data-src") && (t[i].setAttribute("src", t[i].getAttribute("data-src")), delete t[i].dataset.src);
var e = document.getElementsByTagName("link");
for (i = 0; i < e.length; i++) null !== e[i].getAttribute("data-href") && (e[i].setAttribute("href", e[i].getAttribute("data-href")), delete e[i].dataset.href);
setTimeout(function() {
document.dispatchEvent(new CustomEvent("StartAsyncLoading")), document.dispatchEvent(new CustomEvent("StartKernelLoading"))
}, 400)
}
}
var activityEvents = ["mousedown", "mousemove", "keydown", "scroll", "touchstart", "click", "keypress", "touchmove"];
activityEvents.forEach(function(t) {
window.addEventListener(t, loadJSscriptsNow, !1)
}), document.addEventListener("load", loadJSscripts, !1), document.addEventListener("onload", loadJSscripts, !1), null != window.addEventListener ? window.addEventListener("load", loadJSscripts, !1) : null != window.attachEvent ? window.attachEvent("onload", loadJSscripts) : window.onload = loadJSscripts;
}
【问题讨论】:
-
我的想法也是@Carcigenicate 谢谢你的洞察力。
-
它显式搜索
navigator.userAgent.Chrome-Lighthouse,然后延迟脚本加载,让它看起来像你的第一次绘画是立即的。这不是一个糟糕的模式本身,但如果您的用户体验在 JS 加载之前很糟糕,那么他们实际上并没有修复任何东西并“为测试而学习”,而不是真正做任何有用的事情。 -
是的,这是阴暗的。拿回你的钱。 Lighthouse 分数自然会随着更好的开发实践而提高,而不是detecting the environment and faking scores。
-
这就像将所有测试用例包装在
if(am-in-test-environment){pass-test()'}中一样。我所有的测试都通过了,但实际上一切都被破坏了。不要接受这项工作。 -
OMG @Phix 这对我的老板来说是完美的比喻......我在汽车行业工作,谢谢!
标签: javascript performance lighthouse