Closure コンパイラ サービスのサポートが終了し、今後削除されます。 代わりにコンパイラをローカルで実行することを検討してください。
概要
API との通信では、Closure Compiler サービスとの通信方法の基本について説明しましたが、API を使用して、JavaScript の 1 行からコメントを削除する方法だけを取り上げています。このチュートリアルでは、より現実的な開発シナリオ(JavaScript ファイル全体を処理してサイズを大幅に削減する)で Closure Compiler サービスを使用する方法について説明します。
このチュートリアルは、JavaScript と HTTP に関する基本的な知識があることを前提としています。Python スクリプトを使用して Closure Compiler サービスに JavaScript を送信しますが、この例に沿って Python を知る必要はありません。
ファイルの圧縮
API と通信するの例では、コマンドライン パラメータとして JavaScript 文字列をコンパイル スクリプトに渡します。しかし、このサイズは、実数規模の JavaScript プログラムではうまくいきません。コードが数行を超えると JavaScript 文字列はすぐに手に負えなくなります。大規模なプログラムの場合は、code_url
リクエスト パラメータを使用して、処理する JavaScript ファイルの名前を指定できます。js_code
に加えて、code_url
を使用するか、js_code
の代わりに使用できます。
たとえば、次の JavaScript プログラムについて考えてみます。
/**
* A simple script for adding a list of notes to a page. The list diplays
* the text of each note under its title.
*/
/**
* Creates the DOM structure for a note and adds it to the document.
*/
function makeNoteDom(noteTitle, noteContent, noteContainer) {
// Create DOM structure to represent the note.
var headerElement = document.createElement('div');
var headerText = document.createTextNode(noteTitle);
headerElement.appendChild(headerText);
var contentElement = document.createElement('div');
var contentText = document.createTextNode(noteContent);
contentElement.appendChild(contentText);
var newNote = document.createElement('div');
newNote.appendChild(headerElement);
newNote.appendChild(contentElement);
// Add the note's DOM structure to the document.
noteContainer.appendChild(newNote);
}
/**
* Iterates over a list of note data objects and creates a DOM
*/
function makeNotes(data, noteContainer) {
for (var i = 0; i < data.length; i++) {
makeNoteDom(data[i].title, data[i].content, noteContainer);
}
}
function main() {
var noteData = [
{title: 'Note 1', content: 'Content of Note 1'},
{title: 'Note 2', content: 'Content of Note 2'}];
var noteListElement = document.getElementById('notes');
makeNotes(noteData, noteListElement);
}
main();
このプログラムは、1 つの大きな文字列ではなく、ファイルとして Closure Compiler サービスに簡単に渡すことができます。サービスを使用してファイルを処理する手順は次のとおりです。
- JavaScript をファイルに保存します。
- ファイルをウェブからアクセスできるようにします(ウェブサーバーにアップロードするなど)。
- API との通信に示すように、Closure Compiler サービスに POST リクエストを送信します。ただし、
js_code
パラメータにcode_url
パラメータを指定します。code_url
の値は、ステップ 1 で作成した JavaScript ファイルの URL にする必要があります。
たとえば、この例の JavaScript は tutorial2.js
ファイルにあります。このファイルを Closure Compiler Service API で処理するには、code_url
を使用するように Python プログラムと API の通信から変更します。
#!/usr/bin/python2.4
import httplib, urllib, sys
# Define the parameters for the POST request and encode them in
# a URL-safe format.
params = urllib.urlencode([
('code_url', sys.argv[1]), # <--- This parameter has a new name!
('compilation_level', 'WHITESPACE_ONLY'),
('output_format', 'text'),
('output_info', 'compiled_code'),
])
# Always use the following value for the Content-type header.
headers = { "Content-type": "application/x-www-form-urlencoded" }
conn = httplib.HTTPSConnection('closure-compiler.appspot.com')
conn.request('POST', '/compile', params, headers)
response = conn.getresponse()
data = response.read()
print data
conn.close()
注: このサンプルを再現するには、Windows ユーザーが Python のインストールが必要になる場合があります。Windows で Python をインストールして使用する手順については、Python Windows に関するよくある質問をご覧ください。
次のコマンドを使用して、コードを Closure Compiler サービスに送信します。
$ python compile.py https://closure-compiler.appspot.com/closure/compiler/samples/tutorial2.js
Closure Compiler サービスは https://closure-compiler.appspot.com/closure/compiler/samples/tutorial2.js
からファイルを取得し、レスポンスで圧縮された JavaScript を返します。
複数の出力ファイルを 1 つの出力ファイルにコンパイルするには、次の例に示すように複数の code_url
パラメータを含めます。
params = urllib.urlencode([
# Multiple code_url parameters:
('code_url', 'http://yourserver.com/yourJsPart1.js'),
('code_url', 'http://yourserver.com/yourJsPart2.js'),
('compilation_level', 'WHITESPACE_ONLY'),
('output_format', 'text'),
('output_info', 'compiled_code'),
])
圧縮の改善
これまでの例では、WHITESPACE_ONLY
の compilation_level
を使用していました。コメントと空白文字を削除するだけです。SIMPLE_OPTIMIZATIONS
圧縮レベルを使用すると、圧縮率がはるかに高くなります。SIMPLE_OPTIMIZATIONS
圧縮を使用するには、compilation_level
パラメータを SIMPLE_OPTIMIZATIONS
に変更します。
params = urllib.urlencode([
('code_url', sys.argv[1]),
('compilation_level', 'SIMPLE_OPTIMIZATIONS'), # <--- This parameter has a new value!
('output_format', 'text'),
('output_info', 'compiled_code'),
])
前と同様にスクリプトを実行します。
$ python compile.py https://closure-compiler.appspot.com/closure/compiler/samples/tutorial2.js
出力は次のようになります。
var GLOBAL_document=document,$$PROP_appendChild="appendChild";function makeNoteDom(a,b,c){var d=GLOBAL_document.createElement("div");a=GLOBAL_document.createTextNode(a);d[$$PROP_appendChild](a);a=GLOBAL_document.createElement("div");b=GLOBAL_document.createTextNode(b);a[$$PROP_appendChild](b);b=GLOBAL_document.createElement("div");b[$$PROP_appendChild](d);b[$$PROP_appendChild](a);c[$$PROP_appendChild](b)}function makeNotes(a,b){for(var c=0;c<a.length;c++)makeNoteDom(a[c].title,a[c].content,b)} function main(){var a=[{title:"Note 1",content:"Content of Note 1"},{title:"Note 2",content:"Content of Note 2"}],b=GLOBAL_document.getElementById("notes");makeNotes(a,b)}main();
このコードはソース プログラムよりも読みにくいですが、そのサイズは小さくなっています。
コードがどれだけ小さくなるか
リクエスト パラメータの output_info
を compiled_code
から statistics
に変更すると、どのくらいのスペースが削減されたかを正確に確認できます。
Original Size: 1372 Compressed Size: 677 Compilation Time: 0
新しい JavaScript が元のサイズの半分未満になっています。
Closure Compiler Service でプログラムの規模縮小を実現したのはなぜですか?
この場合、Closure Compiler はローカル変数の名前を変更することで、サイズを小さくできます。たとえば、元のファイルには次のコード行が含まれています。
var headerElement = document.createElement('div');
Closure Compiler の文は以下のように変更されます。
var d=document.createElement("div");
クロージャ コンパイラは、関数 makeNoteDom
内のどこでもシンボル headerElement
を d
に変更し、機能を保持します。ただし、headerElement
の 13 文字が、表示される 3 つの場所それぞれで 1 文字に短縮されています。これにより、合計で 36 文字の削減が可能になります。
SIMPLE_OPTIMIZATIONS
でコンパイルすると、文字列名(たとえば、eval()
ステートメント)を使用してローカル変数にアクセスしない限り、構文的に有効な JavaScript の機能が保持されます。
次のステップ
SIMPLE_OPTIMIZATIONS
とそのサービスの使用に関する基本的な仕組みを理解したところで、次に ADVANCED_OPTIMIZATIONS
のコンパイル レベルについて学習します。このレベルでは、JavaScript がコンパイル前後で同じように動作するように、追加の手順が必要になりますが、JavaScript はさらに小さくなります。ADVANCED_OPTIMIZATIONS
については、高度なコンパイルとエクスターンをご覧ください。