開設して15年以上になるGo to Everyone!ですが、こちらのコンテンツを管理するツールをGitHubで管理しています。
先日、ここで利用している TypeScript の Linter を TSLint から ESLint に変更しました。
フロントエンドはライブラリやツール周りの設定・利用方法が複雑なことや、最近業務でも同様の対応をしたことを踏まえ、忘れないように手順を残しておきます。
ベースは上記リポジトリです。
前提
- サーバサイドに CakePHP を使い、一部フロントで Vue.js を利用している
- 昨年フロントは JavaScript ではなく TypeScript で記載するよう修正した
- JavaScript で記載していた頃は ESLint を利用していた
- TypeScript でも JavaScript で書いていた頃同様 Linter でチェックしたいと思い TSLint を導入した
- ただ、TSLint では Vue の単一ファイルコンポーネントをチェックするプラグインとうまく連携できないなど、JavaScript 自体の資産をうまく引き継げず、なんとかしたいと思っていた
そして 2019年
TypeScript でも本格的に ESLint がサポートされるようになりました。
The future of TypeScript on ESLint:https://t.co/PTCWKWN22s
— ESLint (@geteslint) 2019年1月18日
それに伴い、TSLint ではなく ESLint を利用するよう対応しました。
やったこと
連携させる内容やプロジェクトの内容によって必要なライブラリは変わるので、あえて分けて記載しています。
Yarn を使う想定で記載していますので、npm
を使う場合は適宜 npm i -D
に読みかえてください。
ライブラリ追加
ESLint
yarn add -D eslint
ESLint と webpack を連携するためのライブラリ
yarn add -D eslint-loader
ESLint と Vue を連携させるためのライブラリ
yarn add -D vue-eslint-parser eslint-plugin-vue
ESLint と Prettier を連携させるためのライブラリ
コードを自動でフォーマットしてくれる Prettier が便利なので合わせて導入しておきます。
Atom や VSCode などではプラグインが提供されていますので、導入も簡単です。
yarn add -D prettier eslint-config-prettier eslint-plugin-prettier
ESLint と TypeScript を連携させるためのライブラリを追加
yarn add -D eslint-config-typescript @typescript-eslint/eslint-plugin @typescript-eslint/parser
設定ファイル追加・修正
ESLint 用の設定ファイル (.eslintrc) 追加
{
"env": {
"node": true,
"es6": true
},
"extends": ["prettier", "plugin:vue/recommended", "plugin:@typescript-eslint/recommended"],
"overrides": [
{
"files": ["*.ts", "*.vue"]
}
],
"parser": "vue-eslint-parser",
"parserOptions": {
"ecmaVersion": 6,
"parser": "@typescript-eslint/parser"
},
"plugins": ["prettier", "vue", "@typescript-eslint"],
"rules": {
"comma-dangle": ["error", "always-multiline"],
"indent": ["error", 2, { "SwitchCase": 1 }],
"linebreak-style": ["error", "unix"],
"no-console": ["warn"],
"no-trailing-spaces": ["error"],
"no-useless-escape": ["off"],
"quotes": ["error", "single"],
"semi": ["error", "always"],
"vue/attributes-order": ["error"],
"vue/max-attributes-per-line": [
2,
{
"singleline": 20,
"multiline": {
"max": 1,
"allowFirstLine": false
}
}
],
"@typescript-eslint/indent": ["error", 2]
}
}
※ @typescript-eslint/indent
は ESLint のルールだけだと .ts
ファイルがうまくチェックできなかったため追加しています。
ESLint のチェック除外パス設定ファイル (.eslintignore) 追加
/node_modules
prettier 用の設定ファイル (.prettierrc) 追加
{
"tabWidth": 2,
"trailingComma": "all",
"semi": true,
"singleQuote": true,
"printWidth": 100
}
webpack.config.js を修正
module.exports = () => {
return [
{
// モジュールに eslint-loader を追加
module: {
rules: [
// ESLint のチェックをさせるため追加
{
enforce: 'pre', // 他のローダーより先にチェックさせたいので enforce を指定
test: /\.(js|vue|ts)$/, // テスト対象ファイル
exclude: /node_modules/,
use: [
{
loader: 'eslint-loader',
options: {
esModule: true,
cache: true, // 実行結果をキャッシュして、次回以降の起動時に差分が無いファイルをチェックしないことで高速化する
},
},
],
},
],
},
},
];
};
package.json 修正
ESLint 用のスクリプトを追加し、TSLint 用のスクリプトは削除しました。
{
"scripts": {
"eslint": "eslint --ext .ts,.vue ./resources/assets/ts",
"eslint:fix": "yarn run eslint --fix",
},
}
コードの修正
ルールを調整しながらコードを修正していきました。
ライブラリ削除
TSLint
yarn remove tslint
設定ファイル削除
TSLint 用の設定ファイル (tslint.json) 削除
先ほど確認したら削除し忘れていました…。
後程削除しておきます。
結果
導入は結構大変でしたが、以下のような理由から十分メリットが得られていると感じています。
- プラグインが豊富
- 情報・ノウハウが多い
- JavaScript ファイルと混在した場合も同じツールでチェックできる
同様の対応をしようと思っている方の参考になれば幸いです。