Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 12412] ファイルの概要

このコミットは、Go言語の公式ドキュメントツールであるgodocのウェブインターフェースの一部であるlib/godoc/godoc.htmlファイルに対する変更です。godoc.htmlは、godocコマンドが生成するHTMLページのテンプレートとして機能し、Goパッケージのドキュメントを表示するために使用されます。このファイルは、ウェブページ全体の構造、スタイル、および埋め込まれる可能性のあるスクリプトを定義しています。

コミット

このコミットは、godocのウェブページにGoogle+の「+1」ボタンを有効にするための変更です。具体的には、godoc.htmlファイル内でコメントアウトされていたGoogle+ +1ボタンの埋め込みJavaScriptコードのコメントを解除し、機能を有効化しています。

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/4191ff2436be8d825493181ad00e71cf2363b990

元コミット内容

godoc: switch on +1 buttons

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5754048

変更の背景

この変更が行われた2012年当時、Google+はGoogleが提供するソーシャルネットワーキングサービスであり、「+1」ボタンはウェブコンテンツを推奨するための主要な機能でした。ウェブサイト運営者は、コンテンツの共有と可視性を高めるために、自社のページにこの+1ボタンを埋め込むことが一般的でした。

Go言語の公式ドキュメントサイトであるgodocも、そのコンテンツ(Goパッケージのドキュメント)がユーザーによって評価され、共有されることを促進したいという意図があったと考えられます。これにより、Go言語の普及やコミュニティの活性化に貢献することが期待されました。

このコミットは、「+1」ボタンのコードが以前から存在していたものの、何らかの理由でコメントアウトされていた状態から、正式に機能を有効化する目的で実施されました。これは、Google+の機能が安定し、Goプロジェクトがその統合を進める準備ができたことを示唆している可能性があります。

前提知識の解説

Google+と「+1」ボタン

Google+は、2011年にGoogleが開始したソーシャルネットワーキングサービスです。Facebookに対抗する形で開発され、ユーザーは「サークル」と呼ばれるグループで友人を整理し、コンテンツを共有できました。

「+1」ボタンは、Google+の主要な機能の一つで、ウェブページや検索結果のコンテンツを「良い」と評価し、推奨するために使用されました。これはFacebookの「いいね!」ボタンに似ており、ユーザーが特定のコンテンツを気に入ったことを表明し、その情報を自分のGoogle+のフォロワーと共有する手段でした。ウェブサイトに+1ボタンを埋め込むことで、サイトのコンテンツがGoogle+上で拡散されやすくなり、検索エンジンのランキングにも影響を与える可能性がありました(ただし、その影響の度合いは議論の対象でした)。

+1ボタンは、通常、ウェブページに特定のJavaScriptコードスニペットを埋め込むことで実装されました。このスクリプトは、Googleのサーバーから+1ボタンのウィジェットを非同期的にロードし、指定されたHTML要素内に表示します。

godoc

godocは、Go言語の公式ドキュメントツールです。Goのソースコードから直接ドキュメントを生成する能力を持っています。Goのコードは、コメントの特定の形式(GoDocコメント)に従って記述することで、自動的にドキュメントとして抽出され、整形されます。

godocコマンドを実行すると、ローカルでウェブサーバーが起動し、Goの標準ライブラリやGOPATH内のパッケージのドキュメントをブラウザで閲覧できるようになります。このツールは、Go言語の「ドキュメントはコードの一部である」という哲学を体現しており、開発者が常に最新かつ正確なドキュメントにアクセスできるように設計されています。

godoc.htmlファイルは、このgodocツールがウェブページを生成する際に使用するHTMLテンプレートの一つです。

技術的詳細

このコミットの技術的詳細は、ウェブページに外部のJavaScriptウィジェットを非同期的に埋め込む一般的な手法に基づいています。

変更されたコードスニペットは、Google+の+1ボタンをウェブページにロードするための標準的なJavaScriptパターンです。

<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>

このコードの各部分の役割は以下の通りです。

  1. 即時実行関数 (IIFE): (function() { ... })(); これはJavaScriptの一般的なパターンで、変数のスコープを閉じ込めるために使用されます。この関数内で宣言された変数(po, sなど)はグローバルスコープを汚染せず、他のスクリプトとの衝突を防ぎます。

  2. document.createElement('script'): 新しい<script>要素をDOM(Document Object Model)内に動的に作成します。これにより、HTMLファイルに直接<script>タグを記述する代わりに、JavaScriptを使ってスクリプトをロードできます。

  3. po.type = 'text/javascript';: 作成したスクリプト要素のtype属性をtext/javascriptに設定します。これは、スクリプトがJavaScriptであることをブラウザに伝えます。HTML5以降ではこの属性は省略可能ですが、互換性のために含まれることがあります。

  4. po.async = true;: 作成したスクリプト要素のasync属性をtrueに設定します。これは非常に重要です。async属性がtrueの場合、スクリプトはHTMLのパースと並行して非同期的にダウンロードされ、ダウンロードが完了次第、実行されます。これにより、スクリプトのダウンロードと実行がページのレンダリングをブロックするのを防ぎ、ページの読み込みパフォーマンスを向上させます。

  5. po.src = 'https://apis.google.com/js/plusone.js';: 作成したスクリプト要素のsrc属性を、Google+ +1ボタンのJavaScriptライブラリのURLに設定します。このURLから、+1ボタンの表示と機能に必要なすべてのコードがロードされます。

  6. var s = document.getElementsByTagName('script')[0];: 現在のHTMLドキュメント内で最初に見つかった<script>要素を取得します。これは、新しく作成したスクリプト要素を既存のスクリプト要素の前に挿入するための参照点として使用されます。

  7. s.parentNode.insertBefore(po, s);: 新しく作成したスクリプト要素poを、参照点となるスクリプト要素sの親ノード(通常は<head>または<body>)の子として、sの直前に挿入します。これにより、動的にロードされたスクリプトがDOMツリーに追加され、ブラウザによって実行されます。

この一連の処理により、Google+ +1ボタンのJavaScriptライブラリが非同期的にロードされ、ページのレンダリングを妨げることなく、ウェブページに+1ボタンが表示されるようになります。

コアとなるコードの変更箇所

変更はlib/godoc/godoc.htmlファイルの一箇所のみです。

--- a/lib/godoc/godoc.html
+++ b/lib/godoc/godoc.html
@@ -61,7 +61,6 @@ Creative Commons Attribution 3.0 License.
 </div>
 
 </body>
-<!--
 <script type="text/javascript">
   (function() {
     var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
@@ -69,6 +68,5 @@ Creative Commons Attribution 3.0 License.
     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
   })();
 </script>
--->
 </html>
 

具体的には、以下の2行が削除されています。

  • -<!-- (64行目)
  • - --> (72行目)

これらの行はHTMLコメントの開始タグと終了タグであり、これらを削除することで、その間に囲まれていたJavaScriptコードブロックがコメントアウト状態から解除され、有効なHTML/JavaScriptコードとして認識されるようになります。

コアとなるコードの解説

このコミットのコアとなるコードの変更は、単にHTMLコメントを削除することです。これにより、以下のJavaScriptコードが有効になります。

<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>

このJavaScriptコードは、前述の「技術的詳細」セクションで詳しく説明したように、Google+の「+1」ボタンを表示するために必要な外部スクリプト(plusone.js)を非同期的にロードする役割を担っています。

コメントが解除されることで、godocによって生成されるすべてのHTMLページにこのスクリプトが埋め込まれるようになり、結果として各ページにGoogle+の+1ボタンが表示されるようになります。ユーザーはGoのドキュメントページを閲覧しながら、その内容をGoogle+で推奨できるようになります。

この変更自体はGo言語のコードベースに直接的な機能追加を行うものではなく、godocが生成するウェブページのフロントエンドにおける外部サービス連携の有効化に焦点を当てています。

関連リンク

参考にした情報源リンク