60

シンプルで高速な Web サイトを作成しており、サイトをできる限り最適化しようとしています。ソーシャル メディアのボタンが Web サイトの速度を大幅に低下させていることに気付きました。Facebook Like ボタン、Twitter ボタン、Google+ ボタンを含めます。そこで、いくつかのテストを実行しました。

ソーシャル メディア ボタンのないWeb サイト、読み込み時間 0.24 秒:

ここに画像の説明を入力

ソーシャル メディア ボタンのあるWeb サイト読み込み時間 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 による 1 秒の遅延後のボタンのロード:

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 の回答に感謝し、ページ全体が読み込まれた後にソーシャル ボタンを読み込むことで、最終的にこの問題を解決しました。HTML/マークアップを少しきれいにするために、必要な JavaScript コード (ソーシャル メディア ボタン用) を別のファイルに移動しました。

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.24 秒:

読み込みタイミング

4

9 に答える 9

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 を Web サイトの URL に、TEXT簡単な説明に置き換えるだけです。

このソリューションは JavaScript を必要としないため、非常に軽量です。ロゴ、アイコン フォント、シンプルなテキスト (「Facebook で共有」) を使用できます。

また、他の多くのソーシャル ネットワークをカバーするブログ投稿も書きました。

于 2014-04-26T12:26:22.077 に答える
4

ソーシャル ウィジェットは、ページの読み込みが完了するのを待っている重要なスクリプトをブロックしない限り、読み込み時間を大幅に遅らせるべきではありません。使用しているコードは非同期であるため役に立ちますが、ほとんどのブラウザーではこれでもwindow.onloadイベントがブロックされます。iframe を使用して非ブロッキングの方法で JS SDK をロードする方法については、Stoyan の投稿を参照してください。

それが多すぎて、SDK のダウンロードまたは実行を遅らせたい (そして実行後に​​高速化したい) 場合は、次のことをお勧めします。

まず、クロスプラットフォームの方法で準備ができている DOM にフックする方法を提供する jQuery のようなライブラリを使用します。これが 1 つの実装です。「DOM 対応ハンドラー」を作成したら、次の 2 つのいずれかを実行する必要があります。

  1. JS SDK 読み込みコードを DOM 対応ハンドラーに移動します。

  2. FB.init(...) から xfbml: true を取り出し (この場合は持っていない場合)、SDK URL から xfbml=1 を取り出します。これにより、ソーシャル ウィジェットがすぐに解析および初期化されるのを防ぎます。次に、DOM 対応ハンドラーで FB.XFBML.parse() を呼び出します。その方法については、こちらのドキュメントを参照してください。パフォーマンスのために行う最善の方法はFB.XFBML.parse(document.getElementById(''))、SDK が DOM 全体を処理するために時間を無駄にしないように、具体的に呼び出すことです。

于 2013-10-27T23:57:38.773 に答える
1

ソーシャル メディアをロードするスクリプト内に、"defer" を挿入します。

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

Social init スクリプトに非同期読み込みを使用してみてください。

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

いいねボタンを再利用可能な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> 
于 2016-07-19T15:54:11.577 に答える
0

Facebookソーシャルプラグインをより速くロードする方法を見つけるためにここに来た場合-たとえば、window.onload()イベントが発生する前にそれらをレンダリングする方法(wifiのネットワークが遅いため/ページ上の大きな画像/ ...)、私の解決策を試すことができます:

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

fbAsyncInit は、facebook sdk js ファイルが読み込まれるとすぐに呼び出され (例: 高速)、カスタムの読み込みイベントのディスパッチを使用して、ソーシャル ボタンを偽装して (画像などの他のリソースが読み込まれる前に) レンダリングすることができます。他の JavaScript コード/ライブラリによっては、onload() イベントを先に起動した場合の結果に注意してください。

もう 1 つの解決策は、ソーシャル プラグインを iframe にロードする sdk でラップすることです。FB API は親ウィンドウの window.onload を待たず、ソーシャル プラグインを先にレンダリングします。

于 2017-04-21T11:23:55.527 に答える