👀

AstroのプロジェクトにESLintを導入する

2024/04/24に公開

eslint-plugin-astro

Astro のプロジェクトに ESLint を導入したので、メモとして残しておきます。

基本的には Astro の公式ドキュメントで紹介されているeslint-plugin-astro のドキュメントに従って進めていきます。

https://ota-meshi.github.io/eslint-plugin-astro/user-guide/

ESLint とプラグインのインストール

ESLint、eslint-plugin-astro に加えて、アクセシビリティチェックのために eslint-plugin-jsx-a11y をインストールします。このプロジェクトでは TypeScript は使っていないので、TypeScript 用のプラグインはインストールしません。

npm install --save-dev eslint eslint-plugin-astro eslint-plugin-jsx-a11y

ESLint の設定ファイルを作成

今回は ESLint の Flat Config を使用します。プロジェクトのルートに eslint.config.js ファイルを作成し、必要な記述を追加します。

https://eslint.org/docs/latest/use/configure/configuration-files#configuration-file

最終的に完成した eslint.config.js は以下の通りです。

eslint.config.js
import js from '@eslint/js';
import globals from 'globals';
import eslintPluginAstro from 'eslint-plugin-astro';
import eslintConfigPrettier from 'eslint-config-prettier';

export default [
  js.configs.recommended,
  eslintConfigPrettier,
  ...eslintPluginAstro.configs['flat/recommended'],
  ...eslintPluginAstro.configs['flat/jsx-a11y-recommended'],
  {
    languageOptions: {
      globals: {
        ...globals.browser,
        dataLayer: false,
      },
    },
  },
];

以下はこの設定ファイルのポイントです。

Prettier との併用

eslint-config-prettier を追加しています。これにより、Prettier と ESLint のルールが競合する部分を無効化します。

https://github.com/prettier/eslint-config-prettier

npm install --save-dev eslint-config-prettier
eslint.config.js
// ...
import eslintConfigPrettier from 'eslint-config-prettier';

export default [
  // ...
  eslintConfigPrettier,
  // ...
];

Google Analytics のコードに対応する

本プロジェクトでは、Astro のメンテナーの方の記事を参考にして Google Analytics の設定を行っています。

https://www.kevinzunigacuellar.com/blog/google-analytics-in-astro/

Google Analytics で生成されたコードを埋め込むと最終的に以下のようになりますが、error 'dataLayer' is not defined no-undef として、この中の dataLayer が未定義としてエラーになってしまいます。

<!-- Google Analytics -->
<script
  type="text/partytown"
  src="https://www.googletagmanager.com/gtag/js?id=G-8ZCMEEKWF9"
></script>
<script type="text/partytown">
  window.dataLayer = window.dataLayer || [];
  function gtag() {
    window.dataLayer.push(arguments);
  }
  gtag('js', new Date());
  gtag('config', 'G-XXXXXXXXXX');
</script>

これを解決するため、以下の記述を加えています。

eslint.config.js
{
  languageOptions: {
    globals: {
      dataLayer: false,
    },
  },
},

参考にした記事など

https://ota-meshi.github.io/eslint-plugin-astro/user-guide/

https://eslint.org/docs/latest/use/configure/

https://eslint.org/docs/latest/use/configure/language-options

https://github.com/prettier/eslint-config-prettier

Discussion