ソーシャルボタンを自作に変更 してから色々見直して、 非同期でJavaScriptを読み込む部分に関して少し調べたのでメモ。
JavaScriptを非同期読み込み
前にシェアボタンを非同期読み込みでまとめて設定 でソーシャルボタンとかGoogle Analyticsとかを非同期で読み込み、 さらにそれらをまとめる、みたいなことをしてました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
こんな感じ。
insertBefore
の部分で、最初のscript
要素の前に
<script src='//platform.twitter.com/widgets.js'></script>
を追加しています。
この際、ページの中ではinsertBefore
で追加してすぐに次に行くので、
//platform.twitter.com/widgets.js
自体の読み込みは平行して非同期に行われる様になる、
という仕組み。
これも、その昔、最初は
document.getElementsByTagName('head')[0].appendChild(domscript);
が使われていた様ですが、head
要素がないものとかもあったので
insertBefore
でscript
要素の前に入れる、と言う変更を
Google Analyticsなんかでも行って来たようです1。
ただ、これらの方法はscript
要素にasync
属性が実装されてなかった時に、
あるものを使って非同期実装を実現したものでした
async
属性が使えるブラウザだと
<script src='//platform.twitter.com/widgets.js' ascync></script>
と、async
を与えた形で直接書くだけで簡単に非同期にしてくれます
2。
さらに、このasync
属性を使ったものに比べて
上のinsertBefore
の方法は、
CSSOMをブロックしてしまう分遅くなってしまうようです3。
IE 9以前が対応してない、と言うことがあったりしたので
async
だけに頼るのは、ということも合ったみたいですが、
async
を使うと大分すっきりするし、ほとんどのブラウザの最新版は対応してきているので
4
そろそろ使っても良いかな、と言う感じ。
RequireJS - SNSのウィジェットコードをまとめる - Qiita
単にasync
にする以外にも
RequireJSを使ったり
5
すると非同期にしたいものと依存性を保ちたいものとかが整理出来たりして便利
だったり、
その手の物が他にもいくつかあったり6、
非同期の方法も色々あったり7
しますが、
取り敢えずは一番シンプルに出来るasync
加えるだけが良いな、と。
ソーシャルボタンを自作に変更で 特に時間がかかってたJavaScriptの読み込みの大半を 無くす事が出来たのでそもそも余り関係が無くなってしまった点もありますが。。。
後、
Google タグマネージャ公式サイトとか
Yahoo!タグマネージャー: http://tagmanager.yahoo.co.jp/
とかが一時期気になってましたが、
単にJavaScriptの管理、とか程度だと余り意味ないのかな?と、
イマイチよく分かってないので今のところ使用する必要はないかな、と。
例
Google Analytics, LinkWithin, Disqusと その他のソーシャルボタンの読み込みは以下の様になります。
追記: 2014/12/24
Disqusは公式で配布されてるコードの様に、
<div id="disqus_thread"></div>
の要素より後にJavaScript部分を書かないと上手く表示されないことがあるので ここからは除外。
取り敢えず、source/_includes/post/disqus_thread.html の中に公式で配布されてるコードをほぼそのまま書く形で 使用。
追記ここまで
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
追記
Google Analyticsについては通常の解析についてはきちんと情報が送られてましたが、 Googleウェブマスターツールの方でページの所有権の確認をする際にAnalyticsの コードを使っていると、 どうやら認識してくれなくなるみたいで通常の提供された通りのコードを使うように変更しました。
追記ここまで
上のYOUR-TRACKING-ID
の部分だけ自分用に変えて貰えば使えます。
Octopressでは source/_includes/async.html の中にまとめて、これを source/_includes/head.html のなかで読み込んでいます。
-
ちなみに
async
指定するとき、async
だけだったり、async='async'
となってたりasync=''
となってたりしたものを見ましたが、async
はBooleanで、値を何入れても使った時点でasync
が真になる、とのこと。これを指定するときには属性名のまま入れるか空白にするか(もしくは何も指定しないか) するのが正しくて
async='true'
とかは良くないと。 (async='false'
としてもasync
は真になるのでその辺間違えない様にするため。)scriptタグのasync属性を使わずに非同期でJavaScriptを読み込む方法 さくらたんどっとびーず: http://sakuratan.biz/archives/2171 Script-injected “async scripts” considered harmful - igvita.com ↩
-
- ded/script.js
新参の超軽量JavaScript非同期ローダー3種を徹底比較 ゆっくりと…: http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/all-brandnew-asynchronous-javascript-loader/↩
-
プログレッシブレンダリングでUXを向上させるJS非同期読み込みのベストプラクティス ゆっくりと…: http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/best-practice-of-truly-async-js-loading/↩