|
| 1 | +# ESLint |
| 2 | + |
| 3 | +[ESLint](http://eslint.org/ "ESLint")はJavaScriptのコードをJavaScriptで書かれたルールによって検証するLintツールです。 |
| 4 | + |
| 5 | +大まかな動作としては、検証したいJavaScriptのコードをパースしてできたAST(抽象構文木)を、ルールで検証し、エラーや警告を出力します。 |
| 6 | + |
| 7 | +このルールがプラグインとして書けるようになっていて、ESLintの全てのルールがプラグインとして実装されています。 |
| 8 | + |
| 9 | +> The pluggable linting utility for JavaScript and JSX |
| 10 | +
|
| 11 | +ESLintサイト上には、上記のように書かれていることからもわかりますが、プラグインに重きを置いた設計となっているので、 |
| 12 | +今回はESLintのプラグインアーキテクチャについてを見て行きましょう |
| 13 | + |
| 14 | +## どう書ける? |
| 15 | + |
| 16 | +[import, no-console.js](../../src/ESLint/no-console.js) |
| 17 | + |
| 18 | +## どういう仕組み? |
| 19 | +## どういう用途に向いている? |
| 20 | +## どういう用途に向いていない? |
| 21 | +## この仕組みを使ってるもの |
| 22 | +## 実装してみよう |
| 23 | + |
| 24 | +今回は、ESLintのルールを解釈できるシンプルなLintの処理を書いてみます。 |
| 25 | + |
| 26 | +利用するルールは先ほども出てきた[no-console.js](#no-console.js)をそのまま使い、 |
| 27 | +このルールを使って同じようにJavaScriptのコードを検証できる`MyLinter`を書いてみます。 |
| 28 | + |
| 29 | +### MyLinter |
| 30 | + |
| 31 | +MyLinterは単純で以下の2つのメソッドを持つクラスとして実装しました。 |
| 32 | + |
| 33 | +- `MyLinter#loadRule(rule): void` |
| 34 | + - 利用するルールを登録する処理 |
| 35 | + - `rule`は[no-console.js](#no-console.js)がexportしたもの |
| 36 | +- `MyLinter#lint(code): string[]` |
| 37 | + - `code`を受け取りルールによってLintした結果を返す |
| 38 | + - Lint結果はエラーメッセージの配列とする |
| 39 | + |
| 40 | +実際に実装したものが以下のようになっています。 |
| 41 | + |
| 42 | +[import, src/ESLint/MyLinter.js](../../src/ESLint/MyLinter.js) |
| 43 | + |
| 44 | +MyLinterで[no-console.js](#no-console.js)を読み込ませて、 |
| 45 | + |
| 46 | +```js |
| 47 | +function add(x, y){{ |
| 48 | + console.log(x, y); |
| 49 | + return x + y; |
| 50 | +} |
| 51 | +add(1, 3); |
| 52 | +``` |
| 53 | +
|
| 54 | +というコードをLintしてみます。 |
| 55 | +
|
| 56 | +[import, src/ESLint/MyLinter-example.js](../../src/ESLint/MyLinter-example.js) |
| 57 | +
|
| 58 | +コードには`console`というオブジェクトが含まれているので_"Unexpected console statement."_というエラーメッセージが取得出来ました。 |
| 59 | +
|
| 60 | +### RuleContext |
| 61 | +
|
| 62 | +もう一度、[MyLinter.js](#MyLinter.js)を見てみると、`RuleContext`というシンプルなクラスがあることに気づくと思います。 |
| 63 | +
|
| 64 | +この`RuleContext`はいわゆるルールから使えるユーティリティメソッドをまとめたもので、 |
| 65 | +今回は`RuleContext#report`というエラーメッセージをルールからMyLinterへ通知するものだけを実装しています。 |
| 66 | +
|
| 67 | +ESLintのプラグインアーキテクチャの特徴でもありますが、プラグインが本体の実装がについては知らなくて、 |
| 68 | +Contextという本体から与えられたものだけを使うので、ルールが行える事を制御しやすい作りといえます。 |
| 69 | +
|
| 70 | +## エコシステム |
0 commit comments