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

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

このコミットは、Go言語の公式ウェブサイト(golang.org)のフロントページにおけるGo Playgroundの表示に関する変更です。具体的には、Go Playgroundが利用できない(無効化されている)場合に、フロントページからPlaygroundのセクション全体を非表示にする機能を追加しています。これにより、ユーザーエクスペリエンスが向上し、無効な機能が表示されることによる混乱が避けられます。

コミット

commit a48702eb390325300ecc6222005e5a040d90d58f
Author: Andrew Gerrand <adg@golang.org>
Date:   Thu Aug 22 11:12:44 2013 +1000

    doc: hide playground on front page if playground disabled
    
    Fixes #5630.
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/12884046

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

https://github.com/golang/go/commit/a48702eb390325300ecc6222005e5a040d90d58f

元コミット内容

このコミットは、doc/root.html ファイルに対して行われた変更です。主な目的は、Go Playgroundが利用できない場合に、ウェブサイトのフロントページからPlaygroundのUI要素を非表示にすることです。

変更前は、window.initFuncs.push 関数内で直接 playground() 関数を呼び出してPlaygroundをセットアップしていました。このコミットでは、playground() 関数の呼び出しを if (window.playground) という条件文でラップしています。これにより、window.playground オブジェクトが存在しない(つまり、Playground機能が有効化されていない)場合には、Playgroundの初期化が行われないようになります。

さらに、Playgroundが有効でない場合には、jQueryの$('#learn').hide() を使用して、Playgroundのコンテナ要素(IDがlearnの要素)全体を非表示にするロジックが追加されています。これにより、Playgroundが機能しないにもかかわらず、そのUI要素が表示され続けるという問題を解決しています。

変更の背景

この変更は、Go言語のIssue #5630に対応するものです。Issue #5630は、「golang.org: hide playground if disabled」というタイトルで、Go Playgroundが何らかの理由で無効になっている場合に、ウェブサイトのフロントページにPlaygroundのUI要素が表示され続けることへの不満を提起していました。

Go Playgroundは、Go言語のコードをブラウザ上で実行できる便利なツールですが、サーバー側の問題やメンテナンス、あるいは特定の環境設定によって一時的に利用できなくなることがあります。このような状況で、Playgroundの入力フィールドや実行ボタンなどが表示されたままだと、ユーザーはコードを実行しようとしてエラーに遭遇したり、機能が壊れていると誤解したりする可能性があります。

このコミットは、このようなユーザーエクスペリエンスの低下を防ぐために導入されました。Playgroundが利用できない場合には、関連するUI要素を完全に非表示にすることで、ユーザーに混乱を与えることなく、ウェブサイトの健全な状態を保つことを目的としています。これは、ウェブアプリケーションにおける堅牢性とユーザーフレンドリーなエラーハンドリングの一例と言えます。

前提知識の解説

このコミットを理解するためには、以下の前提知識が必要です。

  1. Go Playground: Go Playgroundは、Go言語の公式ウェブサイト (golang.org) で提供されているオンラインツールです。ユーザーはブラウザ上でGoのコードを記述し、コンパイルして実行することができます。これは、Go言語の学習、簡単なコードのテスト、コードスニペットの共有などに広く利用されています。Playgroundは、サーバーサイドでGoのコードをサンドボックス環境で実行し、その結果をクライアントに返す仕組みで動作します。

  2. HTML (HyperText Markup Language): ウェブページの構造を定義するためのマークアップ言語です。doc/root.html は、golang.orgのフロントページのHTML構造を定義するファイルです。

  3. JavaScript: ウェブページに動的な機能を追加するためのプログラミング言語です。このコミットでは、JavaScriptを使用してDOM(Document Object Model)を操作し、Go Playgroundの表示/非表示を制御しています。

  4. jQuery: JavaScriptライブラリの一つで、DOM操作、イベントハンドリング、アニメーション、Ajaxなどを簡素化します。このコミットでは、$('#learn').hide() のようにjQueryのセレクタとメソッドが使用されており、特定のHTML要素を簡単に選択して非表示にしています。

  5. DOM (Document Object Model): HTMLやXMLドキュメントの構造を表現するためのプログラミングインターフェースです。JavaScriptはDOMを介してウェブページの要素にアクセスし、その内容、構造、スタイルを変更できます。

  6. window オブジェクト: ブラウザ環境におけるグローバルオブジェクトです。ウェブページのすべてのJavaScriptコードからアクセスでき、ブラウザのウィンドウに関する情報や、グローバル変数、関数などを保持します。window.playground は、Playground機能が有効な場合に、Playgroundの初期化関数または関連オブジェクトが設定されることを示唆しています。

  7. Issue Tracking System (例: GitHub Issues): ソフトウェア開発において、バグ報告、機能要望、タスクなどを管理するためのシステムです。Fixes #5630 は、このコミットがGitHubのIssue #5630を解決することを示しています。

  8. Gerrit Change-ID (CL): Goプロジェクトでは、コードレビューツールとしてGerritが使用されています。https://golang.org/cl/12884046 は、この変更に対応するGerritのチェンジリスト(Change List)のURLです。Gerritは、Gitリポジトリへの変更をコミットする前にレビュープロセスを管理します。

技術的詳細

このコミットの技術的な核心は、クライアントサイドのJavaScriptロジックによる条件付きレンダリングとDOM操作です。

doc/root.html は、Go言語のウェブサイトのフロントページを構成するHTMLファイルです。このファイルには、Go PlaygroundのUI要素が含まれており、JavaScriptによってその機能が初期化されます。

変更前のコードでは、ウェブページがロードされると、window.initFuncs.push(function() { ... }); 内で無条件に playground() 関数が呼び出されていました。この playground() 関数は、Go Playgroundのコードエディタ、出力エリア、実行ボタンなどのUI要素を初期化し、それらにイベントリスナーを設定する役割を担っています。

このコミットでは、以下の2つの主要な変更が導入されました。

  1. window.playground の存在チェック: if (window.playground) という条件文が追加されました。これは、グローバルスコープに playground という名前のオブジェクトまたは関数が存在するかどうかをチェックしています。

    • もし window.playground が存在する場合(つまり、Playground機能がサーバーサイドまたは別のJavaScriptファイルによって有効化されている場合)、playground({...}) 関数が通常通り呼び出され、Playgroundが初期化されます。
    • もし window.playground が存在しない場合(つまり、Playground機能が無効化されているか、関連するJavaScriptファイルがロードされていない場合)、playground({...}) の呼び出しはスキップされます。

    この window.playground の存在は、通常、サーバーサイドのレンダリングロジックや、Playground機能を提供する別のJavaScriptファイルのロード状況によって制御されます。例えば、サーバーがPlaygroundを無効にする設定の場合、window.playground を定義するスクリプトをHTMLに含めないようにすることができます。

  2. Playgroundセクションの非表示: else ブロックが追加され、if (window.playground) が偽の場合に実行されます。 $('#learn').hide() は、jQueryライブラリの機能を利用しています。

    • $('#learn') は、HTMLドキュメント内でIDが learn である要素を選択します。Go言語のウェブサイトのフロントページでは、この #learn 要素がGo Playgroundの全体を囲むコンテナとして機能しています。
    • .hide() メソッドは、選択された要素のCSS display プロパティを none に設定することで、その要素を完全に非表示にします。これにより、PlaygroundのUI要素がページから視覚的に消え、スペースも占有しなくなります。

この変更により、Go Playgroundが利用できない状況でも、ユーザーは壊れたUI要素を目にすることなく、ウェブサイトをスムーズに閲覧できるようになります。これは、ウェブサイトの堅牢性とユーザーエクスペリエンスの向上に貢献する、シンプルながらも効果的な改善です。

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

変更は doc/root.html ファイルに集中しています。

--- a/doc/root.html
+++ b/doc/root.html
@@ -117,15 +117,19 @@ function feedLoaded(result) {
 }
 
 window.initFuncs.push(function() {
-	// Set up playground.
-	playground({
-		"codeEl":        "#learn .code",
-		"outputEl":      "#learn .output",
-		"runEl":         "#learn .run",
-		"shareEl":       "#learn .share",
-		"shareRedirect": "http://play.golang.org/p/",
-		"toysEl":        "#learn .toys select"
-	});
+	// Set up playground if enabled.
+	if (window.playground) {
+		window.playground({
+			"codeEl":        "#learn .code",
+			"outputEl":      "#learn .output",
+			"runEl":         "#learn .run",
+			"shareEl":       "#learn .share",
+			"shareRedirect": "http://play.golang.org/p/",
+			"toysEl":        "#learn .toys select"
+		});
+	} else {
+		$('#learn').hide()
+	}
 
 	// Load blog feed.
 	$('<script/>').attr('text', 'text/javascript')

コアとなるコードの解説

上記の差分は、doc/root.html 内のJavaScriptコードブロックにおける変更を示しています。

  • 削除された行 (- で始まる行): 以前は、window.initFuncs.push に渡される匿名関数内で、Go Playgroundを初期化するための playground({...}) 関数が直接呼び出されていました。この呼び出しは無条件に行われていたため、Playground機能がバックエンドで無効になっていても、フロントエンドのUI要素は常に表示されていました。

  • 追加された行 (+ で始まる行):

    1. // Set up playground if enabled. コメントが追加され、このコードブロックの目的が「Playgroundが有効な場合にセットアップする」ことであることが明確にされています。

    2. if (window.playground) { ... } playground({...}) の呼び出しが if (window.playground) という条件文のブロック内に移動されました。

      • window.playground は、Go Playgroundの機能を提供するJavaScriptオブジェクトまたは関数がグローバルスコープに存在するかどうかをチェックするための条件です。もしPlaygroundが有効であれば、この window.playground は定義されており、条件は真となります。
      • この条件が真の場合にのみ、window.playground({...}) が実行され、Go PlaygroundのUI要素が初期化され、インタラクティブな機能が有効になります。window.playground と明示的に記述されているのは、グローバルスコープの playground 関数を参照していることを示しています。
    3. } else { $('#learn').hide() } if 文に対応する else ブロックが追加されました。

      • この else ブロックは、window.playground が存在しない(つまり、Playground機能が無効である)場合に実行されます。
      • $('#learn').hide() は、jQueryライブラリの機能を利用しています。#learn は、Go PlaygroundのUI要素全体を囲むHTMLコンテナ要素のIDです。.hide() メソッドは、この要素のCSS display プロパティを none に設定し、ページから完全に非表示にします。これにより、Playgroundが機能しない場合に、そのUI要素がユーザーに表示されるのを防ぎます。

この変更により、ウェブサイトのフロントエンドは、Go Playgroundのバックエンドの状態(有効/無効)に応じて、そのUIの表示を動的に制御できるようになりました。これは、ユーザーエクスペリエンスの向上と、ウェブサイトの堅牢性を高めるための重要な改善です。

関連リンク

参考にした情報源リンク