Drupal 7: Асинхронная загрузка виджетов социальных сетей

Подключаем виджеты социальных сетей асинхронно

22 August, 22:46
Дмитрий Трацевский
Руководитель разработки
6255
5

Хороший вариант загрузки виджетов от социальных сетей на свой сайт

Речь в статье пойдет о сайтах на Друпал 7. Но будет полезна и для тех, кто использует стандартные скрипты от социальных сетей на своих проектах. 
Я встречал много вариантов подключения виджетов. И самые популярные из них - не лучшие по производительности:

  • в html.tpl.php
  • в page.tpl.php
  • в node.tpl.php
  • создается отдельный блок в который помещается код от социальной сети (этот метод чаще всего идет в паре с применением текстового формата php!)

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

В качестве примера для статьи, попробуем подключить лайки от социальных сетей на наш сайт (Вконтакте, Facebook, Twitter и Google). Причем, решим две возможные проблемы:

  • Будем загружать скрипты уже после того, как основная DOM-модель сформирована и текстовая часть сайта отобразилась у пользователя
  • Будем контролировать, на каких страницах необходима загрузка этих скриптов (не на всех разделах сайта кнопки актуальны, так зачем тогда загружать лишние скрипты?)

Файл social-button-async.js

(function ($) {
    // Инициализация ВКонтакте после асинхронной загрузки
    window.vkAsyncInit = function () {
        VK.init({apiId: 'APP_ID', onlyWidgets: true});
        // Теперь перечисляем нужные виджеты ВКонтакте
        // VK.Widgets.Group('vk_groups', {mode: 0, wide: 1, width: '310', height: '320'}, DIGITS);
        VK.Widgets.Like("vk_like", {redesign: 1, type: "mini", height: 20});
    };

    //Инициализация Facebook после асинхронной загрузки
    window.fbAsyncInit = function () {
        //FB.init({ appId : 'YOUR_ID', status : true, cookie : true, xfbml : true, oauth: true });
    };

    // Сама функция асинхронной загрузки
    (function (a, c, f) {
        function g() {
            var d, a = c.getElementsByTagName(f)[0], b = function (b, e) {
                c.getElementById(e) || (d = c.createElement(f), d.src = b, d.async = !0, e && (d.id = e), a.parentNode.insertBefore(d, a))
            };
                b("//vk.com/js/api/openapi.js?127");
                b("//vk.com/js/api/share.js?127");
                b("https://platform.twitter.com/widgets.js");
                b("//connect.facebook.net/ru_RU/sdk.js#xfbml=1&version=v2.7");
                b("https://apis.google.com/js/platform.js")
        }
        a.addEventListener ? a.addEventListener("load", g, !1) : a.attachEvent && a.attachEvent("onload", g)
    })(window, document, "script");
})(jQuery);

Помещаем данный файл в папку js в вашей теме. Теперь подключим скрипт только на страницах материала 'blog'. Для этого  в файле template.php используем hook_preprocess_page:

function THEMENAME_preprocess_page(&$vars) {
  if (isset($vars['node'])) {
    $node = $vars['node'];
    if (in_array($node->type, array('blog'))) {
      //Поключаем кнопки социальных сетей
      drupal_add_js(path_to_theme() . '/js/social-button-async.js', 'file', 'footer');
    }
  }
}

Все приготовления закончены. Теперь осталось вывести в нужном месте страницы html для будущих кнопок. Из доступных способов можно использовать файл node--blog.tpl.php. В нужном месте в файле добавим:

Асинхронная загрузка виджетов социальных сетей

Результат:

Асинхронная загрузка виджетов социальных сетей
 

Комментарии (5)

Аватар пользователя Диана Зайцева
Диана Зайцева
23.08.2017
 

Дима, это решение актуально только для кнопкок соцсетей (share, like)? Или и для виджетов групп в соцсетях, которые часто добавляются на сайт (виджет группы vk, fb, виджет инстаграм)? 

Аватар пользователя Дмитрий Трацевский
Дмитрий Трацевский
23.08.2017
 

Виджеты групп тоже можно так загружать. А также call-back виджет от uptocall и чат от jivosite

Аватар пользователя Интересующийся бот
Интересующийся бот
23.08.2017
 
Если загружу на странице 100 виджетов или 1000 на скорость загрузки повлияет? Например, выведу к каждому посту.
Аватар пользователя Дмитрий Трацевский
Дмитрий Трацевский
23.08.2017
 

Данное решение не принесет много пользы при таком условии задачи. Загрузится страница, потом загрузятся скрипты. А потом начнется инициализация виджетов. И если их будет 100 штук, это будет накладно. Тут, думаю, будет лучшим решением загружать и инициализировать скрипты по определенным событиям. Например, когда блок с виджетами попадает в зону видимости пользователя, или при наведении курсора на блок с анонсом, начинаем загрузку виджетов.
В общем, под такую задачу нужно отдельное решение.

P.S. Очень давно читал статью про интересный подход. Одни ребята (это был крупный файлообменник) сделали так, при загрузке страницы вместо виджетов показывали картинку кнопок соц.сетей. И только при наведении мышки на картинку стартовали загрузку виджетов.

Аватар пользователя Интересующийся бот
Интересующийся бот
24.08.2017
 
А такое решение будете тут публиковать? И, кстати, при таком решение они картинку меняли от кол-ва лайков?

Добавление комментария:

Подписаться на новые статьи

Подпишитесь на новые статьи и вы будете получать самые свежие новости прямо к вам на почту