JavaScript
Node.js
ESLint
Node.jsDay 7

ESLint2について調べた

More than 3 years have passed since last update.

Node.js Advent Calendar 2015の7日目の記事です。遅刻してごめんなさいごめんなさい。

sinopiaをs3対応して記事を書こうと思ったのですが、思ったより手こずってしまい、ESLintの2系のalpha版が出たので、そちらについて調べました。

ESLint v2.0.0-alpha-1 released


新しいルール

下記のルールが新しく追加される。


マイグレーションが必要そうなところ

Migrating to v2.0.0


設定ファイル

.eslintrcpackage.jsoneslintConfigフィールドの両方がある場合、現状は両方の設定がマージされ適用されるが、2.0.0からは.eslintrc.*が存在する場合はpackage.jsoneslintCofigフィールドは無視される。

.eslintrc.*package.jsoneslintConfigフィールドが併用されている環境がある場合は、どちらかに寄せよう。


組み込みのグローバル変数

2.0.0以前はES6の機能であるPromise, Map, Set, Symbolが何も設定しなくてもグローバル変数と認識されており、ES5の環境で上記の機能が使えない場合にも、no-undefルール等でエラーとして認識されないという問題があった。

$ eslint -v

v1.10.3

$ cat .eslintrc.json
{
"extends": "eslint:recommended"
}

$ cat index.js
'use strict';
// Promiseを使ったコード
new Promise(function (resolve) {
resolve(10000);
});

$ eslint index.js

# 何もエラーが出ない

2.0.0からは、明示的にenv: { es6: true }を設定しないとエラーになった。

$ eslint -v

v2.0.0-alpha-1

$ cat .eslintrc.json
{
"extends": "eslint:recommended"
}

$ cat index.js
'use strict';
// Promiseを使ったコード
new Promise(function (resolve) {
resolve(10000);
});

$ eslint index.js

/Users/pirosikick/src/github.com/pirosikick/eslint-next-playground/next/index.js
2:5 error "Promise" is not defined no-undef

✖ 1 problem (1 error, 0 warnings)

# env: { es6: true }を追加
$ cat .eslintrc.json
{
"env": {
"es6": true
},
"extends": "eslint:recommended"
}

$ eslint index.js

# 何もエラーが出ない


ecmaFeaturesオプション

2.0.0からecmaFeaturesオプションのES6系のフラグ(arrowFunctionsblockBindingsなど。modules, jsx, experimentalObjectRestSpread以外)は廃止になって、代わりにparserOptions.ecmaVersionオプションに6を設定するとES6系のフラグを全部trueにしたのと同じになる。


.eslintrc.js

module.exports = {

parserOptions: {
// 3, 5 ,6が設定可能で、デフォルトは5
ecmaVersion: 6
}
};

ecmaFeaturesmodulesフラグは廃止になり、parserOptions.souceType"module"を設定すると同じ設定になる。


.eslintrc.js

module.exports = {

parserOptions: {
// "script"と"module"が設定可能で、デフォルトは"script"
sourceType: "module"
}
};

ecmaFeaturesjsxフラグとexperimentalObjectRestSpreadフラグはparserOptions.ecmaFeaturesに設定する。


.eslintrc.js

module.exports = {

parserOptions: {
ecmaFeatures: {
jsx: true,
experimentalObjectRestSpread: true
}
}
};

ルール開発周りのSchemaの修正とCode Path Analysisについては、もうちょっと調べて書きます。