最近にわかに話題に挙がっているのがGoです。多数のライブラリが世界中で開発されています。そんな中、Goに含まれるツールとして注目を集めているのが文法の整形ツールgofmtです。 プログラミングソースは各人によって形が変わるものですが、それをGoの提示するフォーマットに整形してくれるのは便利です。それを受けて生み出されたのがjsfmt、JavaScript用のフォーマット整形ツールです。

jsfmtの使い方

最も簡単な使い方はインデントなどの整形でしょう。例えば以下のようなコードがあります。

var values = [1, 2, 3, 4];_.reduce(values, function(sum, value) {return sum + value;}, 0);

ワンライナーで書けるのがJavaScriptらしさですが、これでは可読性が悪いです。そこでjsfmtを使ってみます。

$ jsfmt --format=false before.js 
var values = [1, 2, 3, 4];
_.reduce(values, function(sum, value) {
  return sum + value;
}, 0);

このようにセミコロンで改行し、インデントも適用されています。これでぐっと見やすくなりました。

jsfmtのヘルプを見てみましょう。

$ jsfmt 
jsfmt [flags] [path ...]
	Action:
	--format=false, -f=false: format the input javascript
	--search="", -s="": search rule (e.g., 'a.slice')
	--rewrite="", -r="": rewrite rule (e.g., 'a.slice(b, len(a) -> a.slice(b)')

	Output (default is stdout):
	--list=false, -l=false: list files whose formatting differs from jsfmt's
	--diff=false, -d=false: display diffs instead of rewriting files
	--write=false, -w=false: write result to (source) file instead of stdout

	Config:
	--comments=true, -c=true: include comments in result

searchとrewriteというオプションがあります。これはJavaScriptのコードを検索したり、置換してくれる機能です。とは言え単なる置換ではなく、パターンを踏まえた上で置換します。

例えば先ほどのコードに対して置換を行ってみます。

$ jsfmt --rewrite "_.reduce(a, b, c) -> a.reduce(b, c)" before.js 
var values = [1, 2, 3, 4];
values.reduce(function (sum, value) {
    return sum + value;
}, 0);

valuesという変数が関数の第一引数から左へ移動したのが分かるでしょうか。こういった構文を解釈した上での置換がメリットと言えます。難読化したJavaScriptソースしかない場合も、jsfmtを使うと理解が進みやすそうです。

何よりJavaScriptはコールバックが多いのでヘタに書くとあっという間にスパゲティになってしまいます。分かりづらいコードを避けるためにもjsfmtによる整形結果と見比べてみても良いかも知れません。

jsfmtはnode/JavaScript製のオープンソース・ソフトウェア(Apache License 2.0)です。

rdio/jsfmt