Подтвердить что ты не робот

Кнопки социальных сетей замедляют загрузку веб-сайта

Я создаю простой и быстрый сайт, и я стараюсь оптимизировать сайт настолько, насколько смогу. Я заметил, что кнопки в социальных сетях замедляют работу сайта довольно много. Я включаю кнопку "Facebook Like", кнопку "Twitter" и кнопку "Google+". Поэтому я провел несколько тестов:

Веб-сайт без кнопок социальных сетей, время загрузки 0.24s:

enter image description here

Веб-сайт с кнопками социальных сетей, время загрузки 1.38s:

enter image description here

Вот мой код:

<div id="social">
    <!-- FB -->
    <div id="fb-root"></div>
    <script>(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = "//connect.facebook.net/en_EN/all.js#xfbml=1&status=0"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));</script>
    <div class="fb-like" data-href="#" onclick="location.href='http://facebook.com/textsearcher'; return false;" data-width="150" data-layout="button_count" data-show-faces="false" data-send="false"></div>
    <!-- TWITTER -->
    <a href="#" onclick="location.href='https://twitter.com/share'; return false;" class="twitter-share-button" data-url="http://www.textsearcher.com/" data-hashtags="TextSearcher">Tweet</a>
    <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
    <!-- G+ -->
    <div class="g-plusone" data-size="medium" data-href="#" onclick="location.href='http://www.textsearcher.com/'; return false;"></div>
    <script type="text/javascript"> (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })(); </script>
</div>

Итак, я пробовал несколько вещей, чтобы загрузить эти социальные кнопки без их замедления загрузки сайта.

Загрузка кнопок после одной второй задержки через JavaScript:

setInterval(function(){
    $("#social").html("<!-- FB --><div id="fb-root"></div>.....");
},1000);

Это не помогло, кнопки не загружались правильно, и они прослушивались.

Загрузка кнопок после того, как документ готов:

$(document).ready(function() {
    $("#social").html("<!-- FB --><div id="fb-root"></div>.....");
});

Это тоже не помогло. Кнопки загружены просто отлично, но время загрузки сайта было > 1,00 секунд.

У меня заканчиваются идеи. Любой способ загрузить их без замедления веб-сайта?

PS. Использовано Время загрузки страницы для хром в этих тестах


РЕШЕНИЕ:

Благодаря CodeMonkey для его ответа я в конечном итоге решил эту проблему, загрузив социальные кнопки после загрузки страницы целиком.. Я переместил необходимый код JavaScript (для кнопок социальных сетей) в отдельный файл, чтобы сделать мой HTML/разметку немного чище.

JS (в отдельном файле, social.js):

/* Facebook*/
(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = "//connect.facebook.net/en_EN/all.js#xfbml=1&status=0"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));
/* Twitter */
!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');
/* G+ */
(function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })(); 

HTML:

<script>
    $(window).bind("load", function() {
       $.getScript('js/social.js', function() {});
    });
</script>
<!-- FB -->
<div id="fb-root"></div>
<div class="fb-like" data-href="#" onclick="location.href='http://facebook.com/textsearcher'; return false;" data-width="150" data-layout="button_count" data-show-faces="false" data-send="false"></div>
<!-- TWITTER -->
<a href="#" onclick="location.href='https://twitter.com/share'; return false;" class="twitter-share-button" data-url="http://www.textsearcher.com/" data-hashtags="TextSearcher">Tweet</a>
<!-- G+ -->
<div class="g-plusone" data-size="medium" data-href="#" onclick="location.href='http://www.textsearcher.com/'; return false;"></div>

Итак, после того, как эта загрузка снова стала нормальной, 0.24s:

Load timings

4b9b3361

Ответ 1

Вы можете попробовать

$(window).load(function() {

вместо

$(document).ready(function() {

поэтому он будет ждать, пока ваши изображения и все не загрузится.

Если это не поможет, я бы предложил, чтобы они отображались только при наведении. Имейте кучу статических изображений/спрайтов CSS, которые заменяются, когда пользователь на них наводит.

Если вам не нужен этот дополнительный шаг, и у вас есть доступ к серверу для установки модулей, вы можете попробовать google mod pagespeed, чтобы отложить javascript для вас https://developers.google.com/speed/pagespeed/module/filter-js-defer

Если у вас нет доступа к серверу, вы можете попробовать маршрут CDN, загрузчик Cloudflare очень интересен, я тестирую его в минуту по аналогичным причинам и вижу увеличение скорости на 33% http://www.cloudflare.com/features-optimizer

Если это не поможет, вы можете попробовать старый фаворит вставлять кнопки внизу страницы и перемещаться с помощью CSS, чтобы они выглядели выше; таким образом вы можете иметь их там, где хотите, но они, похоже, не мешают времени загрузки страницы.

Вы можете попробовать более простые альтернативы oldschool, например здесь http://zurb.com/article/883/small-painful-buttons-why-social-media-bu

или посмотрите, работает ли служба http://www.addthis.com/ или http://www.sharethis.com/

Конечно, слон в комнате на данный момент состоит в том, что на главной странице есть 3 основных кнопки социальных сетей, и для этого вам стоит всего лишь секунда - к сожалению, это выглядит неплохо! Это обманчиво сложные кнопки, которые не кажутся хорошо оптимизированными, google pagespeed insights находит что-то, чтобы жаловаться на все из них iirc.

Поскольку вы принимаете 100% + скорость, я бы предложил несколько тестов A/B, чтобы увидеть, действительно ли они вам нужны, т.е. для вашего сайта происходит медленное снижение трафика? Имеет ли кнопки совместного доступа больше трафика, чтобы гарантировать их присутствие?

Ответ 2

Время загрузки плагинов (социальных сетей) зависит от ряда факторов, включая (но не ограничиваясь ими):

  • Время отклика сервера (плагины не загружаются, пока ваш код не говорит об этом тоже.)
  • Пользовательская скорость интернета (в данном случае, ваша)
  • Расстояние до сервера веб-сайта социальных сетей (например, сервер Facebook может находиться на другой стороне континента, создавая латентность)
  • Время загрузки веб-сайта социальных сетей вообще

Это означает, что вы не можете сделать так, чтобы сделать ваш код максимально оптимизированным.

Кроме того, хорошей практикой является запуск ваших Javascript-плагинов после того, как документ будет готов, если иное не предусмотрено документацией плагина. SetInterval не является хорошим подходом, поскольку он не знает, готова ли вся страница к изменению или нет. Поэтому, пожалуйста, используйте подход $(document).ready() для выполнения всего, что изменяет содержимое страницы.

Ответ 3

Социальные виджеты не должны слишком замедлять время загрузки, если только они не блокируют более важные сценарии, ожидающие завершения загрузки страницы. Используемый вами код асинхронен, что помогает, но в большинстве браузеров это все равно блокирует событие window.onload. См. Stoyan post here для получения информации о том, как вы можете загружать JS SDK неблокирующим способом с использованием iframes.

Если это слишком много, и вы хотите отложить загрузку или запуск SDK (и ускорить его после его запуска), вот моя рекомендация:

Во-первых, используйте библиотеку jQuery, которая предоставляет возможность подключаться к DOM, будучи готовым кросс-платформенным способом. Вот одна из реализаций. После того, как у вас есть готовый обработчик DOM, вы должны выполнить одно из следующих двух действий:

  • Переместите код загрузки JS SDK в ваш обработчик DOM.

  • Возьмите xfbml: true из FB.init(...), если он у вас есть (в этом случае вы этого не делаете), и возьмите xfbml = 1 из URL-адреса SDK. Это предотвращает разбор и инициализацию социальных виджетов. Затем вызовите FB.XFBML.parse() в вашем готовом обработчике DOM. См. документацию по этому методу. Лучшее, что можно сделать для производительности, - это специально называть FB.XFBML.parse(document.getElementById('')), чтобы SDK не тратил время на весь DOM.

Ответ 4

В то время как этот вопрос старен, и человек, спрашивающий, вероятно, не увидит моего ответа, вот альтернатива для тех, у кого есть одна и та же проблема, - пока вы не против жертвовать показанием количества симпатий/акций/и т.д..

Вы можете просто добавить ссылки, которые отправляют посетителя в фактическую социальную сеть, и открыть окно совместного использования с предварительно заполненным URL и описанием.

Код очень прост, и вы можете использовать любое изображение или текст, который вам нужен, что упростит установку кнопок в вашем дизайне сайта.

<a href="https://www.facebook.com/sharer/sharer.php?u=URL" target="_blank">Share on Facebook</a>
<a href="https://twitter.com/intent/tweet?url=URL&text=TEXT&via=YOURTWITTERACCOUNTNAME" target="_blank">Tweet</a>
<a href="https://plus.google.com/share?url=URL" target="_blank">Share on Google+</a>

Просто замените URL с URL-адресом вашего веб-сайта и текстом с кратким описанием.

Это решение не требует JavaScript и, следовательно, очень легкое. Вы можете использовать логотипы, шрифт значка, простой текст ( "Поделиться на Facebook" ).

Я также написал сообщение в блоге, в котором охватывает многие другие социальные сети.

Ответ 5

Внутри скриптов, загружающих социальные сети, добавьте в них "отложить".

<script defer src="http://api.facebook.com/....."></script>

Ответ 6

Попробуйте использовать async-загрузку для скриптов Social init:

<script async="async">...</script>

Ответ 7

Большинство основных кнопок социальных сетей предлагают асинхронную версию своего JavaScript. Вам просто нужно немного прокрутить страницу официальной документации.

Ответ 8

Попробуйте поместить свою кнопку в многоразовый iframe и передать URL-адрес понравившейся.

<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fphys.org" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px;" allowTransparency="true"></iframe> 

Ответ 9

Если вы пришли сюда, чтобы найти решение, как быстрее загружать социальные плагины facebook - например, как сделать их ПЕРЕД началом события window.onload() (из-за медленной сети на wifi/большом изображении на странице /...) вы можете попробовать мое решение:

window.fbAsyncInit = function () {
    dispatchEvent(new Event('load'));
}

fbAsyncInit вызывается, как только загружается файл facebook sdk js (например, быстро), и вы можете поддельные социальные кнопки для рендеринга ранее (до загрузки других ресурсов, таких как изображения) с помощью специальной диспетчеризации событий загрузки. Помните о последствиях, когда вы запускаете событие onload() раньше, в зависимости от вашего другого javascript-кода/библиотек.

Другим решением является перенос вашего социального плагина с загрузкой sdk в iframe. FB API не будет ждать окна window.onload родительского окна и ранее будет предоставлять социальные плагины.