60

我正在创建一个简单而快速的网站,并且我正在尝试尽可能优化该网站。我注意到社交媒体按钮大大降低了网站的速度。我包括 Facebook Like 按钮、Twitter 按钮和 Google+ 按钮。所以我进行了一些测试:

没有社交媒体按钮的网站,加载时间 0.24 秒:

在此处输入图像描述

带有社交媒体按钮的网站,加载时间 1.38 秒:

在此处输入图像描述

这是我的代码:

<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="http://facebook.com/textsearcher" data-width="150" data-layout="button_count" data-show-faces="false" data-send="false"></div>
    <!-- TWITTER -->
    <a href="https://twitter.com/share" 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="http://www.textsearcher.com/"></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。在这些测试中使用了 chrome 的页面加载时间插件


解决方案:

感谢 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="http://facebook.com/textsearcher" data-width="150" data-layout="button_count" data-show-faces="false" data-send="false"></div>
<!-- TWITTER -->
<a href="https://twitter.com/share" 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="http://www.textsearcher.com/"></div>

所以在这个加载时间再次正常之后,0.24s:

加载时间

4

9 回答 9

41

你可以试试

$(window).load(function() {

代替

$(document).ready(function() {

所以它会等到你的图像和一切都加载之后。

如果这没有帮助,那么我建议让它们只出现在悬停时。有一堆静态图像/ CSS sprite,当用户将鼠标悬停在它们上面时会被替换。

如果你不想要那个额外的步骤,并且你有服务器访问权限来安装模块,你可以尝试谷歌的 mod pagespeed 来为你推迟 javascript https://developers.google.com/speed/pagespeed/module/filter-js-推迟

如果你没有服务器访问权限可以试试CDN路由,Cloudflare的rocket loader很有意思,出于类似的原因我现在正在测试它,看到~ 33%的速度提升http://www.cloudflare.com/功能优化器

如果这没有帮助,您可以尝试将按钮粘贴在页面底部并使用 CSS 重新定位以使它们看起来更高;这样你就可以把它们放在你想要的地方,但它们似乎不会干扰页面加载时间。

你可以尝试更简单的老派替代品,比如这里http://zurb.com/article/883/small-painful-buttons-why-social-media-bu

或查看http://www.addthis.com/http://www.sharethis.com/之类的服务是否对您更有效

当然,此时房间里的大象是在页面上拥有 3 个主要的社交媒体按钮,而且只花费你一秒钟 - 遗憾的是看起来相当不错!它们是看似复杂的按钮,似乎没有得到很好的优化,谷歌的 pagespeed 洞察力发现所有这些 iirc 都有一些值得抱怨的地方。

由于您的速度达到了 100% 以上,我建议您进行一些 A/B 测试,看看您是否真的需要它们,即对于您的网站来说,速度变慢会减少流量吗?拥有共享按钮是否会带来更多流量以保证它们的存在?

于 2013-10-31T13:30:01.117 回答
5

虽然这个问题很老,而且提问的人可能不会看到我的回答,但对于任何有同样问题的人来说,这里是一个替代方案——只要你不介意牺牲显示喜欢/分享/等的数量。

您可以简单地添加将访问者发送到实际社交网络的链接,并打开一个带有预填 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,然后将TEXT替换为简短描述。

该解决方案不需要 JavaScript,因此非常轻量级。您可以使用徽标、图标字体、简单文本(“在 Facebook 上分享”)。

我还写了一篇博客文章,涵盖了许多其他社交网络

于 2014-04-26T12:26:22.077 回答
4

社交小部件不应过多地减慢您的加载时间,除非它们阻止了等待页面完成加载的更重要的脚本。您使用的代码是异步的,这很有帮助,但在大多数浏览器中,这仍然会阻止window.onload事件。有关如何使用 iframe 以非阻塞方式加载 JS SDK 的信息,请参阅Stoyan 的帖子。

如果这太多了,并且您想延迟 SDK 下载或运行(并在运行后加快速度),我的建议是:

首先,要么使用像 jQuery 这样的库,它提供了一种挂钩 DOM 的方法,以跨平台的方式准备就绪。这是一种实现。一旦你有了“DOM 就绪处理程序”,你应该做以下两件事之一:

  1. 将 JS SDK 加载代码移动到您的 DOM 就绪处理程序中。

  2. 将 xfbml: true 从 FB.init(...) 中取出(如果有)(在本例中,您没有),然后从 SDK URL 中取出 xfbml=1。这可以防止立即解析和初始化社交小部件。然后,在您的 DOM 就绪处理程序中调用 FB.XFBML.parse()。有关该方法,请参阅此处的文档。为了提高性能,最好的办法是专门调用FB.XFBML.parse(document.getElementById('')),这样 SDK 就不会浪费时间遍历整个 DOM。

于 2013-10-27T23:57:38.773 回答
2

插件(社交媒体按钮)加载时间会因多种因素而异,包括(但不限于):

  • 您的服务器的响应时间(插件不会加载,直到您的代码也告诉它们。)
  • 用户的互联网速度(在本例中为您的)
  • 与社交媒体网站服务器的距离(例如,Facebook 的服务器可能位于大陆的另一端,从而产生延迟)
  • 社交媒体网站的加载时间

这意味着除了使代码尽可能优化之外,您无能为力。

此外,除非插件文档另有规定,否则最好在文档准备好后运行 Javascript 插件。setInterval 不是一个好方法,因为它不知道是否所有页面都准备好进行修改。因此,请确保使用该$(document).ready()方法进行任何修改页面内容的操作。

于 2013-09-28T12:42:45.890 回答
1

在加载社交媒体的脚本中,将“延迟”放入其中。

<script defer src="http://api.facebook.com/....."></script>
于 2013-10-28T09:17:12.283 回答
1

尝试对社交初始化脚本使用异步加载:

<script async="async">...</script>
于 2013-10-28T18:51:58.320 回答
0

大多数主要的社交媒体按钮都提供其 JavaScript 的异步版本。您只需在官方文档页面上向下滚动一点。

于 2013-12-27T23:20:21.210 回答
0

尝试将您的点赞按钮放入可重复使用的 iframe 中并将网址传递给点赞。

<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> 
于 2016-07-19T15:54:11.577 回答
0

如果您来这里寻找解决方案如何更快地加载 facebook 社交插件 - 例如如何在 window.onload() 事件发生之前渲染它们(因为 wifi 上的网络速度慢/页面上的大图像/ ...)您可以尝试我的解决方案:

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

fbAsyncInit 会在 facebook sdk js 文件被加载(例如快速)后立即被调用,并且您可以使用自定义加载事件调度来伪造社交按钮以更早地渲染(在加载图像等其他资源之前)。请注意根据您的其他 JavaScript 代码/库提前触发 onload() 事件时的后果。

另一种解决方案是将您的社交插件与 sdk 加载到 iframe 中。FB API 不会等待父窗口的 window.onload 并且会提前渲染社交插件。

于 2017-04-21T11:23:55.527 回答