nuxt3.svg

【Nuxt 3】ESLintの導入

Nuxt3

はじめに

ESLintのv9.0.0からFlat Configがデフォルトで採用されており、従来の設定ファイルより構造がシンプルになっています。 この記事では、Nuxt3にFlat Configを用いてESLintの導入方法について解説していきます。

導入

Nuxt3の公式ドキュメントに記載の通り、Nuxt ESLint (@nuxt/eslint)を使用します。

インストールは以下のコマンドを実行します。

$ npx nuxi module add eslint

内部的には以下の処理が行われています。

  • @nuxt/eslintのインストール(執筆時はv0.6.0)
  • nuxt.config.tsmodulesに追加
    nuxt.config.ts
    export default defineNuxtConfig({
      devtools: { enabled: true },
      modules: ['@nuxt/eslint']  //ここ
    })
  • eslint.config.mjsの生成
    eslint.config.mjs
    // @ts-check
    import withNuxt from './.nuxt/eslint.config.mjs'
    
    export default withNuxt(
      // Your custom configs here
    )

ESLintの設定は、従来の.eslintrcではなく、生成されたeslint.config.mjsにて行います。

設定

eslint.config.mjs

生成されたeslint.config.mjsに設定を記述します。

eslint.config.mjs
// @ts-check
import withNuxt from './.nuxt/eslint.config.mjs'

export default withNuxt(
  {
    files: ['**/*.vue', '**/*.js', '**/*.ts'],
    rules: {
      "no-console": "off",
      "@typescript-eslint/no-explicit-any": "off"
      //...
    }
  },
  {
    files: ['**/*.vue'],
    rules: {
      "vue/multi-word-component-names": "warn"
      //...
    }
  }
)

filesで対象ファイルを定義し、rulesに検査ルールを定義します。 上記例のように複数分けて定義することができます。

ルールについては、各ドキュメントを参照してください。 一部ルールのみ記載しておきます。

  • ESLint

    https://eslint.org/docs/latest/rules/

    ルール名説明デフォルト設定
    no-unused-vars使用されていない変数を報告するerror
    no-undef定義されていない変数を報告するerror
    no-consoleconsole.logなどのコンソール出力を報告するwarn
    curlyif/for/whileなどのブロックをカンマで閉じるerror
    no-varvarの使用を報告するerror
    prefer-const定数を宣言する際にconstを推奨するerror
    eqeqeq厳密等価演算子(===)の使用を強制するerror
    no-duplicate-imports同じモジュールの複数のインポートを禁止するerror
    no-implicit-coercion暗黙の型変換を禁止するerror
    no-shadow変数のスコープに関する影響を報告するerror
  • Typescript

    https://typescript-eslint.io/rules/

    ルール名説明デフォルト値
    @typescript-eslint/no-unused-vars未使用の変数を検出error
    @typescript-eslint/no-explicit-anyany型の使用を禁止error
    @typescript-eslint/no-empty-function空の関数を禁止error
    @typescript-eslint/no-floating-promisesプロミスのチェーンが無視されていることを検出error
    @typescript-eslint/indentインデントのスタイルをチェックoff
    @typescript-eslint/quotesシングルクォートとダブルクォートの使用をチェックoff
    @typescript-eslint/member-orderingメンバーの順序をチェックoff
    @typescript-eslint/no-implicit-any-catchcatchブロックでany型を使用しないerror
    @typescript-eslint/no-unsafe-assignment安全でない代入を禁止error
    @typescript-eslint/no-var-requiresrequireを使ったモジュールのインポートを禁止error
    @typescript-eslint/no-unnecessary-type-assertion不要な型断定を禁止error
  • Vue

    https://eslint.vuejs.org/rules/MX

    ルール名説明デフォルト設定
    vue/comment-directive<template>内のコメントディレクティブをサポートoff
    vue/jsx-uses-varsJSXで使用される変数を未使用として報告しないoff
    vue/multi-word-component-namesコンポーネント名を必ず複数単語にするerror
    vue/no-arrow-functions-in-watchwatch属性でのアロー関数の使用を禁止error
    vue/no-async-in-computed-propertiescomputedプロパティ内での非同期処理を禁止error
    vue/no-child-contentディレクティブ(例:v-htmlv-text)で上書きされる子要素の使用を禁止error
    vue/no-computed-properties-in-datadataプロパティ内でのcomputedプロパティの使用を禁止error
    vue/no-custom-modifiers-on-v-modelv-modelにカスタムモディファイアを使用しないerror

Stylistic

@nuxt/eslintには、コードの整形を行うためのESLint Stylisticが含まれています。 コード整形といえばPrettierが有名ですが、ESLint Stylisticがあれば不要です。 ESLint Stylisticは、nuxt.config.tsに以下のように設定します。

nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxt/eslint',],
  eslint: {
    config: {
      stylistic: {
        arrowParens: true,
        blockSpacing: true,
        braceStyle: 'stroustrup',
        commaDangle: 'always',
        flat: true,
        indent: 2,
        quoteProps: 'as-needed',
        quotes: 'single',
        semi: false,
      },
    },
  },
},)
項目説明
arrowParenstrue,falseアロー関数の引数を括弧で囲むか否か
blockSpacingtrue, falseブロック({})の開始後、終了前にスペースを追加するか否か
braceStyle1tbs, stroustrup, allmanif-elseのようにブロックが続く場合の{}の位置を指定
commaDanglenever, always, always-multiline, only-multilineオブジェクト等最終項目の末尾のカンマの付け方について指定
flattrue, falseFlat Configを使用するか否か
indentインデントの数, tabタブの設定を指定
quotePropsalways,as-needed, consistent, consistent-as-neededオブジェクトのプロパティをクォートで囲むか否か
quotessingle, doubleシングルクォートかダブルクォートかを指定
semitrue, falseコード末尾にセミコロンをつけるか否か

実行

ESLintを実行するために、package.jsonに以下のスクリプトを追加します。

package.json
{
  "scripts": {
    ...
    "lint": "eslint .",
    "lint:fix": "eslint . --fix",
    ...
  },
}
$ npm run lint
$ npm run lint:fix
実行結果例
  9:7  error  'test' is assigned a value but never used. Allowed unused vars must match /^_/u  @typescript-eslint/no-unused-vars

 1 problem (1 error, 0 warnings)

実行すると上記のような結果が表示されます。 この例の場合、@typescript-eslint/no-unused-varsのルールに従い、使用されていないtestが対象ファイルの指定行にあることを教えてくれています。

stylisticの設定や一部のルールについては--fixによって自動で整形してくれます。

VSCodeの設定

VSCodeを使用している場合は、ESLintの拡張機能を追加し、.vscode/settings.jsonを追加します。 この設定により、ファイル保存時に--fixが実行され整形が行われます。

実行されない場合は設定が反映されていない可能性があるため、VSCodeを再起動してみるなどしてください。

ESLint - https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint

settings.json
{
  "eslint.useFlatConfig": true,  //Flat Configを適用
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit"  //保存時に整形
  }
}