Google рекомендует (https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery), используя следующий код JS для оптимизации скорости страницы (асинхронная CSS загрузки)Асинхронных загрузки CSS стилей с использованием requestAnimationFrame
<script>
var cb = function() {
var l = document.createElement('link'); l.rel = 'stylesheet';
l.href = 'small.css';
var h = document.getElementsByTagName('head')[0]; h.parentNode.insertBefore(l, h);
};
var raf = requestAnimationFrame || mozRequestAnimationFrame ||
webkitRequestAnimationFrame || msRequestAnimationFrame;
if (raf) raf(cb);
else window.addEventListener('load', cb);
</script>
Когда я использую приведенный выше код, Page Speed Insights (https://developers.google.com/speed/pagespeed/insights/) распознает его и дает страницу более высокий балл. Но проблема в том, что этот код не работает в старых IE.
Например, IE 8 выдает сообщение об ошибке «Объект requestAnimationFrame не определен». Проблема очевидна, IE 8 не поддерживает RAF, поэтому он выдает ошибку из-за неопределенного объекта.
Мне нужен сайт, чтобы быть функциональными и в этой старой ИЭ, так что я решил обновить свой код следующим образом:
<script>
function loadCss() {
var l = document.createElement('link');
l.href = 'http://static.xyz.com/css/style.min.css?v=23';
l.rel = 'stylesheet';
l.type = 'text/css';
l.media = 'screen';
document.getElementsByTagName('head')[0].appendChild(l);
}
if (typeof requestAnimationFrame === 'function') {
requestAnimationFrame(loadCss);
}
else if (typeof mozRequestAnimationFrame === 'function') {
mozRequestAnimationFrame(loadCss);
}
else if (typeof webkitRequestAnimationFrame === 'function') {
webkitRequestAnimationFrame(loadCss);
}
else if (typeof msRequestAnimationFrame === 'function') {
msRequestAnimationFrame(loadCss);
}
else if (typeof window.addEventListener === 'function') {
window.addEventListener('load', loadCss);
}
else {
window.onload = loadCss;
}
Этот код не так красиво, но это работает должным образом в IE7 +, Firefox, Chrome и т. Д. Но когда я тестирую его с помощью страницы Speed Insights, он не признает, что CSS загружается асинхронно и не дает мне более высокий балл (он показывает ошибку так же, как если бы CSS был загружен синхронно через) ,
Мой вопрос: есть ли ошибка в моем коде, о котором я не знаю, или Google просто не распознает этот способ вставки async CSS. Для меня абсолютно важно, чтобы код работал правильно, но я хотел бы получить более высокий балл в тесте страницы Speed, так как это было бы полезно для целей SEO.
Я не являюсь экспертом в Javascript и макете, а также в таких вещах, но я не мог найти объяснения того, что происходит или где может быть проблема.
Заранее благодарим за любые объяснения или подсказки, что искать.
Нужно ли загружать css async? –
Нет, не знаю, это не обязательно. Но я хотел бы иметь возможность загружать его асинхронно до тех пор, пока он будет работать, и Google это узнает. –
requestAnimationFrame поддерживается всеми браузерами без префиксов, поэтому вам не нужны mozRequestAnimationFrame, webkitRequestAnimationFrame и msRequestAnimationFrame.Я также чувствую, что для более старых браузеров IE (единственных, которые не поддерживают requestAnimationFrame), может быть, лучше сразу загрузить loadCSS(), не дожидаясь загрузки. Итак, if (typeof requestAnimationFrame === 'function') { requestAnimationFrame (loadCss); } else {loadCss();} – tinkerr