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

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

このコミットは、Go言語のドキュメンテーションツールであるgodocが使用するjQueryスクリプトの読み込み方法に関する変更です。具体的には、外部のContent Delivery Network (CDN) であるGoogle CDNからのjQueryの条件付き読み込みを廃止し、常にローカルにホストされたjQueryスクリプトを使用するように修正しています。これにより、godocの安定性とオフラインでの利用可能性が向上します。

コミット

commit 573c2fd4fe12a724629f8eb7e9ed13fc153f0a6b
Author: Andrew Gerrand <adg@golang.org>
Date:   Fri Jun 7 10:46:56 2013 +1000

    godoc: always use local jQuery script
    
    Fixes #5075.
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/10084044

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

https://github.com/golang/go/commit/573c2fd4fe12a724629f8eb7e9ed13fc153f0a6b

元コミット内容

godoc: always use local jQuery script

Fixes #5075.

R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/10084044

変更の背景

この変更の背景には、godocがWebインターフェースを提供するために利用しているJavaScriptライブラリであるjQueryの読み込み方法に関する問題がありました。以前のgodoc.htmlでは、まずGoogle CDNからjQueryを読み込もうとし、それが失敗した場合にローカルにホストされたjQueryにフォールバックするというロジックが実装されていました。

このアプローチにはいくつかの潜在的な問題がありました。

  1. CDNの可用性への依存: Google CDNが一時的に利用できない場合、godocのWebインターフェースが正しく機能しない可能性がありました。これは、特にインターネット接続が不安定な環境や、CDNへのアクセスが制限されている環境で問題となります。
  2. オフライン利用の制限: godocはローカルでGoのドキュメントを生成・表示するためのツールであり、インターネット接続がない環境でも利用されることが想定されます。CDNからの読み込みを試みるロジックは、オフライン環境でのgodocの利用を妨げる要因となっていました。
  3. パフォーマンスの不確実性: CDNは通常、地理的に分散されたサーバーからコンテンツを配信することでパフォーマンスを向上させますが、場合によってはローカルサーバーからの読み込みの方が高速であることもあります。特に、godocがローカルで実行されている場合、外部へのネットワークリクエストはオーバーヘッドとなる可能性があります。

コミットメッセージにある「Fixes #5075」は、これらの問題のいずれか、または複合的な問題がGoのIssueトラッカー(当時のcode.google.com/p/go/issues)で報告され、その解決策としてこの変更が導入されたことを示しています。この変更により、godocは常にローカルのjQueryスクリプトを使用するようになり、外部ネットワークへの依存が解消され、安定性とオフラインでの利用可能性が大幅に向上しました。

前提知識の解説

このコミットを理解するためには、以下の技術的な概念を把握しておく必要があります。

  1. godoc: godocは、Go言語の公式ドキュメンテーションツールです。Goのソースコードからコメントや宣言を解析し、HTML形式でドキュメントを生成・表示する機能を提供します。開発者はgodocコマンドを実行することで、ローカル環境でGoの標準ライブラリや自身のプロジェクトのドキュメントをブラウザで閲覧できます。godocは、Goのコードベースの可読性と保守性を高める上で重要な役割を果たしています。

  2. jQuery: jQueryは、JavaScriptの高速で軽量なJavaScriptライブラリです。HTMLのDOM操作、イベントハンドリング、アニメーション、AjaxなどのWeb開発で頻繁に利用される機能を簡潔なAPIで提供します。Webページのインタラクティブ性を高めるために広く使われています。godocのWebインターフェースでも、UIの操作性向上のためにjQueryが利用されていました。

  3. Content Delivery Network (CDN): CDNは、Webコンテンツ(画像、動画、JavaScriptファイル、CSSファイルなど)をインターネット経由でユーザーに効率的に配信するための分散型サーバーネットワークです。ユーザーに地理的に最も近いサーバーからコンテンツを配信することで、Webサイトの読み込み速度を向上させ、サーバーの負荷を軽減します。Google CDNは、Googleが提供するCDNサービスの一つで、広く利用されています。

  4. 条件付きスクリプト読み込み: Web開発では、特定の条件に基づいてJavaScriptファイルを読み込むテクニックが使われることがあります。このコミットで変更される前のgodoc.htmlでは、Google CDNからのjQuery読み込みを試み、それが失敗した場合(例えば、CDNがダウンしている、ネットワーク接続がないなど)に、window.jQueryが未定義であることをチェックして、ローカルにホストされたjQueryファイルをdocument.writeで動的に挿入するという条件付き読み込みが行われていました。これは、CDNの利点(高速性、キャッシュ)を享受しつつ、CDNが利用できない場合のフォールバックメカニズムを提供する一般的なパターンです。

技術的詳細

このコミットの技術的な変更は、lib/godoc/godoc.htmlファイル内のjQueryスクリプトの読み込み方法を簡素化し、外部CDNへの依存を排除することに集約されます。

変更前のコードは以下のようになっていました。

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script type="text/javascript">window.jQuery || document.write(unescape("%3Cscript src='/doc/jquery.js' type='text/javascript'%3E%3C/script%3E"));</script>

この2行のスクリプトタグは、次のようなロジックでjQueryを読み込もうとします。

  1. 最初の<script>タグで、Google CDNからjQueryバージョン1.8.2の圧縮版(jquery.min.js)を直接読み込もうとします。
  2. 2番目の<script>タグでは、インラインJavaScriptが実行されます。
    • window.jQueryは、jQueryが正常に読み込まれた場合に定義されるグローバル変数です。
    • window.jQuery || ...という構文は、window.jQuerytruthy(つまり、jQueryが既に読み込まれていて定義されている)であれば、その評価結果が採用され、||の右側の式は実行されません。
    • もしwindow.jQueryfalsy(つまり、Google CDNからの読み込みが失敗した、またはまだ完了していない)であれば、||の右側の式が実行されます。
    • document.write(unescape("%3Cscript src='/doc/jquery.js' type='text/javascript'%3E%3C/script%3E"))は、エスケープされた文字列をアンエスケープし、その結果(<script src='/doc/jquery.js' type='text/javascript'></script>)をHTMLドキュメントに書き込みます。これにより、ローカルにホストされた/doc/jquery.jsが動的に読み込まれます。

このコミットでは、上記の2行を以下の1行に置き換えています。

<script type="text/javascript" src="/doc/jquery.js"></script>

この変更により、godoc.htmlは常にローカルパス/doc/jquery.jsからjQueryスクリプトを読み込むようになります。これにより、外部CDNへのネットワークリクエストが完全に不要となり、以下のようなメリットがもたらされます。

  • 信頼性の向上: 外部CDNのダウンタイムやネットワークの問題に影響されなくなります。
  • オフライン対応: インターネット接続がない環境でもgodocが完全に機能するようになります。
  • セキュリティの簡素化: 外部スクリプトの整合性チェック(Subresource Integrityなど)の必要がなくなります。
  • プライバシーの向上: ユーザーのブラウザがGoogle CDNにリクエストを送信しなくなるため、Googleによるトラッキングの可能性が減少します。

一方で、CDNを利用することによるグローバルなキャッシュの恩恵や、CDNが提供する高速な配信ネットワークの利点は失われます。しかし、godocが主にローカル環境で利用されるツールであることを考慮すると、これらのトレードオフは許容範囲内であり、信頼性とオフライン対応のメリットが上回ると判断されたと考えられます。

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

変更はlib/godoc/godoc.htmlファイルにのみ行われています。

--- a/lib/godoc/godoc.html
+++ b/lib/godoc/godoc.html
@@ -8,8 +8,7 @@
   <title>The Go Programming Language</title>
 {{end}}
 <link type="text/css" rel="stylesheet" href="/doc/style.css">
-<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
-<script type="text/javascript">window.jQuery || document.write(unescape("%3Cscript src='/doc/jquery.js' type='text/javascript'%3E%3C/script%3E"));</script>
+<script type="text/javascript" src="/doc/jquery.js"></script>
 {{if .Playground}}
 <script type="text/javascript" src="/doc/play/playground.js"></script>
 {{end}}

コアとなるコードの解説

  • -<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>: この行は削除されました。これは、Google CDNからjQueryを読み込むためのスクリプトタグでした。この行の削除により、godocは外部のCDNに依存しなくなります。

  • -<script type="text/javascript">window.jQuery || document.write(unescape("%3Cscript src='/doc/jquery.js' type='text/javascript'%3E%3C/script%3E"));</script>: この行も削除されました。これは、Google CDNからの読み込みが失敗した場合に、ローカルの/doc/jquery.jsをフォールバックとして動的に挿入するためのJavaScriptコードでした。このロジックが不要になったため、削除されました。

  • +<script type="text/javascript" src="/doc/jquery.js"></script>: この行が追加されました。これは、常にローカルにホストされた/doc/jquery.jsからjQueryを読み込むためのシンプルなスクリプトタグです。これにより、godocは常に自身の提供するjQueryを使用し、外部ネットワークへの依存がなくなります。

この変更は、godocのWebインターフェースがjQueryを読み込む方法を根本的に変更し、外部依存を排除することで、ツールの堅牢性とオフラインでの利用可能性を向上させています。

関連リンク

参考にした情報源リンク

  • Go言語公式ドキュメント: https://go.dev/doc/
  • jQuery公式ウェブサイト: https://jquery.com/
  • Content Delivery Network (CDN) の概念に関する一般的な情報源 (例: Wikipedia, MDN Web Docsなど)
  • Go Issue Tracker (旧): code.google.com/p/go/issues (現在はGitHubに移行済み)
  • Go GitHubリポジトリ: https://github.com/golang/go