Sublime Text 2 の JSLint から node がみつからない - メモログと関連して、少しの間JSLintを使用していたのですが、jQueryなどglobalに定義されている変数があるとそこで定義されていないと言われたりなどしてしまい、若干使い勝手が悪い。
それでJSHintを使い始めてみている。JSHintについてはAbout – JSHintを参照。
JSHint is a fork of JSLint, the tool written and maintained by Douglas Crockford. The project originally started as an effort to make a more configurable version of JSLint-the one that doesn’t enforce one particular coding style on its users-but then transformed into a separate static analysis tool with its own goals and ideals.
JSLintのチェックをいろいろ設定可能な状態にするところからスタートして、いまは静的コード解析までしてくれるらしい。
Sublime Text 2へのJSHintのインストールは下記のような感じ。
- nodeが入っていなかったらnodeをインストール(homebrewが入っていたらbrew install nodeでインストールできる。RVM / JewelryBox / Homebrew をインストール - メモログ)
- [sudo] npm install -g jshint で、nodeからJSHintをインストール
- メニューのTools - Command Paletteを開いて、「Package Controll: Install Package」を選択して、JSHintを選択
Sublime Text 2のJSHintの設定は、~/Library/Application Support/Sublime Text 2/Packages/JSHint/.jshintrc にあります。デフォルトの設定を変更したい場合は、これをUserのディレクトリにコピーして、それを編集します。
1 | cd ~/Library/Application Support/Sublime Text 2/Packages/ |
設定はDocumentation – JSHintを参照。Enforcing optionsは書き方を制限する系の設定で、Relaxing optionsは逆に制限を緩める(warningなどを出さないように抑制する)系の設定で、Environmentsは環境関連。jquery: trueにすると、JQueryや$などはどこかでglobal変数に定義されているものとして扱ってくれます。
Environmentsで用意されていないものについては、“globals”: {“define”:false,“require”:false}のような感じで、globalsで設定すると同じことができます。
設定の中で「maxcomplexity」の設定は興味深くて、 Cyclomatic complexityを計算して、complexityを設定した値で制限してくれるみたいです。Testable JavaScriptに書かれていた内容によると、Thomas J. McCabeは、すべてのメソッドはCyclomatic complexityを10以下にすべしとしているそうです。Software Integrity Blog » Blog Archive » McCabe Cyclomatic Complexity: the proof in the puddingの調査では25くらいまではバグとの相関関係あまり変わらないみたいですけど、Project Metrics Help - Complexity metricsの話だとCyclomatic complexityが上がってくると、Bad fix probabilityも上がると。やはり10くらいが妥当だという話で、とりあえず10に設定してみました。
そしてそして、Sublime Text 2で保存したときにJSHintを自動的に実行したい場合は、SublimeOnSaveBuildを別途インストールします。インストールは、メニューのTools - Command Paletteを開いて、「Package Controll: Install Package」を選択して、「SublimeOnSaveBuild」を選びます。インストールするだけで特に設定は必要ありません。