きれいなJSを書きたい。JavaScriptのスタイルを管理するためのES6に対応したESLintの使い方 -『javascript』

table of contents

    ESLintは、JavaScriptをより綺麗で一貫性のあるルールとスタイルで書くための構文チェックツールです。構文チェックツールを使用することで、どうすれば美しいコードが実現するのか、考えるきっかけや勉強になるので、JavaScript初学者の次のステップには導入しておきたいツールだとおもいます。

    JavaScriptの構文チェックツールは他に、「JSHint」「JSLint」「JSCS」などがあり、ESLintの特徴としては、項目が豊富に用意されていて、それをルールとして自由に選択できるようになっています。そしてルールごとにアラートの強さを設定することができ、プロジェクトに合わせたルールを作りやすくなっています。

    ES6に対応したESLintをgulpで扱う環境をつくる

    タスクランナーのgulp.jsで、ES6で記述されているスクリプトをbabelでコンパイルする前にESLintを実行する環境を構築します。

    gulp環境の構築はこちらを参照してください。

    必要なパッケージをインストール

    プロジェクトのルートに「gulp-eslint」をインストールします。

    terminal

    npm i -D gulp-eslint
    

    babelを扱うのでパーサーとして「babel-eslint」が必要になるので、これもインストールします。

    terminal

    npm i -D babel-eslint
    

    gulpfile.jsには以下のように記述します。

    gulpfile.js


    var plumber = require('gulp-plumber'); var notify = require('gulp-notify'); var babel = require('gulp-babel'); var rename = require('gulp-rename'); var eslint = require('gulp-eslint'); gulp.task('js', function(){ gulp.src(scriptPath) .pipe(plumber({ errorHandler: notify.onError('Error: <%= error.message %>') })) .pipe(eslint({useEslintrc: true})) .pipe(eslint.format()) .pipe(eslint.failAfterError()) .pipe(babel()) .pipe(rename(function (path) { var cutLength = path.basename.length - 6; path.basename = path.basename.slice(0, cutLength); })) .pipe(gulp.dest(jsPath + '/babel/')); });

    エラーを出力するのに「gulp-notify」、スクリプトを常に実行するために「gulp-plumber」、babelを実行するのに「gulp-babel」、コンパイル後にファイル名を変更するのに「gulp-rename」を使用しています。gulp jsとターミナルでコマンドを入力するとタスクが実行され、コンパイルされます。

    設定ファイル.eslintrcをつくる

    ESLintの特徴はチェックする内容を柔軟にカスタマイズできることですが、その設定ファイル「.eslintrc」を作成しプロジェクトルートに設置します。ここに記述されたJSONの内容で、環境やルールの追加・変更などができるようになります。

    具体的なルールや項目についてはここに詳細に解説されています。

    .eslintrc


    { "parser": "babel-eslint", "extends": "eslint:recommended", "env": { "browser": true, "node": true, "jquery": true, "es6": true }, "rules": { "strict": 2, "no-console": 1, "quotes": ["error", "single"], "array-bracket-spacing": [2, "never"], "block-spacing": 2, "brace-style": 2, "camelcase": 2, "comma-spacing": [2, {"before": false, "after": true}], "computed-property-spacing": [2, "never"], "eol-last": 2, "func-style": [2, "expression"], "indent": [2, 2, { "VariableDeclarator": { "var": 2, "let": 2, "const": 3 } }], "key-spacing": ["error", { "mode": "strict" }], "lines-around-comment": 2, "no-multiple-empty-lines": [2, {max: 2}], "no-spaced-func": 2, "no-trailing-spaces": 2, "object-curly-spacing": [2, "never"], "padded-blocks": [2, "always"], "require-jsdoc": 2, "semi-spacing": [2, {"before": false, "after": true}], "keyword-spacing": [2, {"before": true}], "space-before-blocks": 2, "space-before-function-paren": [2, "never"], "space-in-parens": [2, "never"], "space-infix-ops": 2, "space-unary-ops": 2, "arrow-spacing": 2, "no-var": 2 } }

    設定ファイル.eslintrcの解説

    "extends": "eslint:recommended"
    

    とすることで、ESLintのオススメの設定を呼び出しています。設定内容は List of available rules – ESLintに記載されているチェックがついた項目になっています。ESLintは初期状態だと何もチェックしないので、ひとまずこれで最低限のルールをチェックできるようになります。これ基準にルールをカスタマイズしていきます。

    "parser": "babel-eslint",
    

    「babel-eslint」をparserに指定しています。これでbabelでコンパイルすることを前提にスクリプトを記述できます。


    "env": { "browser": true, "node": true, "jquery": true, "es6": true }

    envに記述している内容は、環境設定のようなものです。上記ではES6の記法でjQueryを使用するような環境を想定しています。ESLintは様々な環境下での使用に対応していて、特定の環境下やライブラリが読み込まれていることが前提でチェックを行うように指定しておきます。

    rulesにルールを渡します。今回記述した内容だけになりますが、解説しておきます。

    アラートの強さ

    0
    チェックしない
    1
    warning (警告)
    2
    error (アラート)

    パラメータ

    array-bracket-spacing
    配列のカッコ内の間隔
    block-spacing
    単一行ブロックの内側のスペースを強制
    camelcase
    キャメルケース記法(先頭と末尾のアンダースコア、定数のような大文字とアンダースコアは許容)
    comma-spacing
    カンマの前後の間隔
    computed-property-spacing
    計算されたプロパティの内側のパディング
    eol-last
    複数の空白行で、ファイルの最後に改行
    func-style
    関数宣言の方法
    id-length
    識別子の長さ
    index
    タブとスペース幅
    key-spacing
    オブジェクトのキーと値の間の間隔とスタイル
    lines-around-comment
    コメントの上の行を空行にする
    no-mixed-spaces-and-tabs
    タブとスペースを混合しない
    no-multiple-empty-lines
    最大改行数
    no-spaced-func
    関数と()の間にスペースを禁止
    no-trailing-spaces
    行末の空白を禁止
    object-curly-spacing
    オブジェクトの中括弧内のパディング
    padded-blocks
    ブロック内のパディング
    require-jsdoc
    Docスタイルのコメント
    semi-spacing
    セミコロン前後のスペース
    keyword-spacing
    キーワードの後のスペース
    space-before-blocks
    ブロック前のスペース
    space-before-function-paren
    関数の括弧の前のスペース
    space-in-parens
    カッコ内のスペース
    space-infix-ops
    演算子の前後のスペース
    space-return-throw-case
    return throw caseのスペース
    space-unary-ops
    単項演算子前後のスペース
    arrow-spacing
    アロー関数の矢印の前後にスペース
    no-var
    varの禁止

    ESLintは設定項目が多く、把握しきれないと思うので、「.eslintrc」ファイルはジェネレーターで簡単に作ってしまうのがいいかもしれません。

    .eslintrcのジェネレーター

    そうして「.eslintrc」ファイルを設置するとターミナルでgulp jsを入力すれば、タスクが動くようになります。実行してエラーが出ると以下のように、行やエラー内容、そのパラメータ名がターミナルに明示されるので、場所やその内容が把握しやすくなっています。

    3:1   error  There must be a space inside this paren  space-in-parens
    

    こんなときどうする

    トラブルシューティング的なことをまとめておきます。

    グローバルの変数を宣言したいとき

    別ファイルのプラグインにオプションを渡したいときなどvarletなしでグローバルの変数にアクセスしたいときがありますが、この場合エラーが出てしまいます。

    対処法としては、「.eslintrc」にあらかじめ任意のグローバル変数の文字列を記述しておくことでエラーをスルーしてくれます。


    "globals": { "paceOptions": true, "Pace": true }

    ESLintでうつくしいコード

    構文チェックツールESLintを使うと、一貫したルールやスタイルを共有することができ、そのルールを考える過程でどんなコードが読みやすいのか、美しいのか、と考えるきっかけになることもすごく重要だとおもいます。設定ファイルは簡単に共有・アップデートできるので、積極的にプロジェクトやリソースに合わせて検討を重ねてベターな環境をつくるといいかとおもいます。

    おわります。

    きれいなJSを書きたい。JavaScriptのスタイルを管理するためのES6に対応したESLintの使い方 -『javascript』のアイキャッチ画像

    share

    related