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

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

このコミットは、Go言語のドキュメント生成ツールである godoc のフロントエンドJavaScriptコードベースに、JavaScriptライブラリであるjQueryを導入し、既存のJavaScriptコード(godocs.js)をjQueryを使用するように書き換えるものです。これにより、DOM操作やイベントハンドリングが簡素化され、コードの可読性と保守性が向上します。また、popups.jsが削除され、その機能が統合されたか、あるいは不要になったことを示唆しています。

コミット

godoc: add jQuery to Go repository, rewrite godocs.js to use jQuery

For golang.org I intend to rewrite the jquery link in godoc.html
to point to the Google-hosted jquery.js.

R=dsymonds, minux.ma
CC=golang-dev
https://golang.org/cl/6589071

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

https://github.com/golang/go/commit/65dbe6786d3c97deb534d024f21301c445fad7ac

元コミット内容

godoc: add jQuery to Go repository, rewrite godocs.js to use jQuery

For golang.org I intend to rewrite the jquery link in godoc.html
to point to the Google-hosted jquery.js.

変更の背景

この変更の主な背景は、godocツールのフロントエンドJavaScriptコードの複雑性を軽減し、保守性を向上させることにあります。従来のgodocs.jsは、DOM操作やイベントハンドリングを純粋なJavaScript(Vanilla JS)で記述しており、コードが冗長になりがちでした。jQueryを導入することで、これらの操作をより簡潔かつ効率的に記述できるようになります。

また、コミットメッセージには「For golang.org I intend to rewrite the jquery link in godoc.html to point to the Google-hosted jquery.js.」とあり、将来的にはgolang.orgサイトでGoogleがホストするjQuery CDN(Content Delivery Network)を利用する意図が示唆されています。これにより、ユーザーのブラウザキャッシュを活用し、サイトの読み込み速度を向上させる可能性も考慮されています。

godocはGo言語のソースコードからドキュメントを生成するツールであり、その出力されるHTMLドキュメントのインタラクティブな要素(検索ボックスの挙動、目次の生成、折りたたみ可能なセクションなど)をJavaScriptが担っています。これらの機能をより堅牢かつ効率的に実装するために、広く普及しているjQueryライブラリの採用が決定されたと考えられます。

前提知識の解説

このコミットを理解するためには、以下の技術的知識が役立ちます。

  • godoc: Go言語に標準で付属するドドキュメント生成ツールです。Goのソースコード内のコメントや構造から自動的にAPIドキュメントやパッケージの概要を生成し、HTML形式で提供します。開発者がコードとドキュメントを同時に管理できるGoの哲学を体現しています。
  • jQuery: 2006年にリリースされた、高速で小さく、機能豊富なJavaScriptライブラリです。HTMLドキュメントの走査、イベントハンドリング、アニメーション、Ajaxインタラクションなどを、よりシンプルでクロスブラウザ互換性のあるAPIで提供します。$(selector).method()のような簡潔な構文が特徴で、当時のWeb開発においてデファクトスタンダードとして広く利用されました。
  • DOM (Document Object Model) 操作: Webページ(HTMLやXMLドキュメント)の構造を、プログラムからアクセス・操作できるようにするためのAPIです。JavaScriptはDOM APIを通じて、HTML要素の追加、削除、変更、属性の操作などを行います。jQueryは、このDOM操作を大幅に簡素化する機能を提供します。
  • イベントハンドリング: Webページ上でのユーザーの操作(クリック、キー入力、マウスオーバーなど)や、ブラウザの状態変化(ページの読み込み完了など)を検知し、それに応じて特定のJavaScriptコードを実行する仕組みです。jQueryは、イベントリスナーの登録や解除を容易にするメソッド(例: .on(), .click())を提供します。
  • Vanilla JavaScript: 特定のフレームワークやライブラリを使用せず、純粋なJavaScriptの標準APIのみを使用して記述されたコードを指す俗語です。jQuery導入前のgodocs.jsは、主にVanilla JavaScriptで記述されていました。Vanilla JSはライブラリの依存関係がないという利点がありますが、クロスブラウザ互換性の問題やコードの冗長性といった課題を抱えることがあります。

技術的詳細

このコミットの技術的詳細は、主に以下のファイル変更に集約されます。

  1. doc/godocs.js の大幅な書き換え:

    • DOM操作の抽象化: 従来のdocument.getElementById(), document.createElement(), node.classNameといったVanilla JSのDOM操作が、jQueryのセレクタ($('#id'), $('tag'))やメソッド(.append(), .addClass(), .removeClass(), .is(), .val(), .attr(), .text())に置き換えられました。これにより、コードがより簡潔になり、クロスブラウザ互換性の問題が軽減されます。
    • イベントハンドリングの統一: bindEventのようなカスタムイベントバインディング関数が削除され、jQueryの.on()メソッドがイベントリスナーの登録に使用されるようになりました。これにより、イベント処理の記述が標準化され、より堅牢になります。
    • ユーティリティ関数の削除: godocs_nodeToTextgetElementsByClassNameといった、jQueryが提供する機能と重複するカスタムユーティリティ関数が削除されました。
    • ページロードイベント: 従来のbindEvent(window, 'load', godocs_onload)から、jQueryの$(document).ready()関数に置き換えられました。これは、DOMが完全に構築された後にスクリプトを実行するための、より信頼性の高い方法です。
    • 即時実行関数 (IIFE): (function() { 'use strict'; ... })(); の形式でコード全体がラップされ、グローバルスコープの汚染を防ぎ、厳格モード('use strict')が適用されています。
  2. doc/jquery.js の新規追加:

    • jQueryライブラリのバージョン1.8.2がプロジェクトのリポジトリに直接追加されました。これにより、godocがオフライン環境でも正しく動作し、外部CDNへの依存がなくなります(ただし、コミットメッセージにあるように、将来的にはCDN利用の可能性も示唆されています)。
  3. doc/popups.js の削除:

    • このファイルは完全に削除されました。これは、popups.jsが提供していた機能がgodocs.js内のjQueryベースのコードに統合されたか、あるいはもはや必要ないと判断されたことを意味します。
  4. doc/root.html の変更:

    • google.load("jquery", "1.7.1"); の行が削除されました。これは、Google CDNからjQueryをロードするのではなく、ローカルにバンドルされたjquery.jsを使用するように変更されたためです。
  5. lib/godoc/godoc.html の変更:

    • <script type="text/javascript" src="/doc/jquery.js"></script> の行が追加され、ローカルに配置されたjQueryライブラリがHTMLドキュメントに読み込まれるようになりました。
    • 検索入力フィールド(<input type="text" id="search" name="q" class="inactive" value="Search">)に placeholder="Search" 属性が追加されました。これにより、入力フィールドが空の場合にヒントテキストが表示されるようになり、ユーザーエクスペリエンスが向上します。

これらの変更により、godocのフロントエンドコードは、よりモダンで保守性の高いjQueryベースのアーキテクチャに移行しました。

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

このコミットのコアとなる変更は、doc/godocs.jsにおけるJavaScriptコードのjQueryへの移行と、lib/godoc/godoc.htmlにおけるjQueryの読み込み設定です。

doc/godocs.js の変更例 (抜粋: bindSearchEvents 関数)

変更前 (doc/godocs.js):

function godocs_bindSearchEvents() {
  var search = document.getElementById('search');
  if (!search) {
    // no search box (index disabled)
    return;
  }
  function clearInactive() {
    if (search.className == "inactive") {
      search.value = "";
      search.className = "";
    }
  }
  function restoreInactive() {
    if (search.value !== "") {
      return;
    }
    if (search.type != "search") {
      search.value = search.getAttribute("placeholder");
    }
    search.className = "inactive";
  }
  restoreInactive();
  bindEvent(search, 'focus', clearInactive);
  bindEvent(search, 'blur', restoreInactive);
}

変更後 (doc/godocs.js):

function bindSearchEvents() {
  var search = $('#search');
  if (search.length === 0) {
    return; // no search box
  }
  function clearInactive() {
    if (search.is('.inactive')) {
      search.val('');
      search.removeClass('inactive');
    }
  }
  function restoreInactive() {
    if (search.val() !== '') {
      return;
    }
    search.val(search.attr('placeholder'));
    search.addClass('inactive');
  }
  search.on('focus', clearInactive);
  search.on('blur', restoreInactive);
  restoreInactive();
}

lib/godoc/godoc.html の変更例

変更前 (lib/godoc/godoc.html):

<link type="text/css" rel="stylesheet" href="/doc/style.css">
<script type="text/javascript" src="/doc/godocs.js"></script>
...
<input type="text" id="search" name="q" class="inactive" value="Search">

変更後 (lib/godoc/godoc.html):

<link type="text/css" rel="stylesheet" href="/doc/style.css">
<script type="text/javascript" src="/doc/jquery.js"></script>
<script type="text/javascript" src="/doc/godocs.js"></script>
...
<input type="text" id="search" name="q" class="inactive" value="Search" placeholder="Search">

コアとなるコードの解説

doc/godocs.js の変更解説

bindSearchEvents関数の変更は、jQuery導入によるコードの簡素化と効率化を明確に示しています。

  • 要素の選択:
    • 変更前: document.getElementById('search') を使用してDOM要素を直接取得していました。
    • 変更後: $('#search') というjQueryセレクタを使用しています。これにより、IDによる要素選択がより簡潔になり、返されるオブジェクトはjQueryオブジェクトであるため、後続のjQueryメソッドをチェーンして呼び出すことができます。
  • クラスの操作:
    • 変更前: search.className == "inactive" でクラスの状態をチェックし、search.className = ""search.className = "inactive" でクラスを直接操作していました。これは、複数のクラスがある場合に複雑になる可能性があります。
    • 変更後: search.is('.inactive') でクラスの有無をチェックし、search.removeClass('inactive')search.addClass('inactive') を使用してクラスを追加・削除しています。これにより、クラス操作がより安全かつ柔軟になります。
  • 値の取得/設定:
    • 変更前: search.value = ""search.value !== "" で入力フィールドの値を直接操作していました。
    • 変更後: search.val('')search.val() !== '' を使用しています。val()メソッドは、フォーム要素の値の取得と設定を簡潔に行うjQueryのメソッドです。
  • 属性の取得/設定:
    • 変更前: search.getAttribute("placeholder") を使用していました。
    • 変更後: search.attr('placeholder') を使用しています。attr()メソッドは、HTML要素の属性の取得と設定を簡潔に行うjQueryのメソッドです。
  • イベントリスナーの登録:
    • 変更前: bindEvent(search, 'focus', clearInactive) のように、カスタムのbindEvent関数を使用してイベントリスナーを登録していました。
    • 変更後: search.on('focus', clearInactive) のように、jQueryの.on()メソッドを使用しています。.on()は、イベント委譲や複数のイベントタイプへの対応など、より高度なイベントハンドリング機能を提供します。

これらの変更により、godocs.jsのコードはより短く、読みやすく、そして保守しやすくなりました。jQueryが提供する抽象化レイヤーによって、開発者はブラウザ間の差異を意識することなく、高レベルなAPIでDOMとイベントを操作できるようになります。

lib/godoc/godoc.html の変更解説

このHTMLファイルの変更は、godocが生成するドキュメントページにjQueryを組み込むためのものです。

  • jQueryスクリプトの追加: <script type="text/javascript" src="/doc/jquery.js"></script> の行が、既存のgodocs.jsのスクリプトタグの前に挿入されています。JavaScriptの実行順序の原則として、依存関係のあるライブラリは、それを使用するスクリプトよりも先に読み込まれる必要があります。したがって、godocs.jsがjQueryに依存するため、jQueryが先にロードされるように配置されています。
  • 検索ボックスのプレースホルダー: <input type="text" ... value="Search">placeholder="Search" 属性が追加されました。placeholder属性はHTML5で導入されたもので、入力フィールドが空の場合に表示される短いヒントテキストを指定します。これにより、ユーザーは入力フィールドの目的を直感的に理解できるようになります。以前はJavaScriptで同様の機能を実現していましたが、HTML属性として直接指定することで、よりセマンティックでシンプルな実装になりました。

これらのHTMLの変更は、godocが生成するすべてのドキュメントページにjQueryの機能と改善された検索ボックスのUIを適用するための基盤となります。

関連リンク

参考にした情報源リンク