Плагин ESLint

Next.js включает плагин ESLint eslint-plugin-next, который входит в базовую конфигурацию и помогает выявлять распространённые проблемы в приложениях Next.js.

Справочник

Рекомендуемые наборы правил из следующих плагинов ESLint используются в eslint-config-next:

Эти настройки имеют приоритет над конфигурацией из next.config.js.

Правила

Полный набор правил выглядит следующим образом:

Включено в рекомендованной конфигурацииПравилоОписание
Check Icon@next/next/google-font-displayОбеспечивает правильное поведение font-display для Google Fonts.
Check Icon@next/next/google-font-preconnectГарантирует использование preconnect с Google Fonts.
Check Icon@next/next/inline-script-idТребует наличие атрибута id для компонентов next/script с встроенным содержимым.
Check Icon@next/next/next-script-for-gaРекомендует использовать компонент next/script для встроенных скриптов Google Analytics.
Check Icon@next/next/no-assign-module-variableЗапрещает присваивание переменной module.
Check Icon@next/next/no-async-client-componentЗапрещает использование асинхронных функций в Client Components.
Check Icon@next/next/no-before-interactive-script-outside-documentЗапрещает использование стратегии beforeInteractive для next/script вне pages/_document.js.
Check Icon@next/next/no-css-tagsЗапрещает ручное добавление тегов стилей.
Check Icon@next/next/no-document-import-in-pageЗапрещает импорт next/document вне pages/_document.js.
Check Icon@next/next/no-duplicate-headЗапрещает дублирование <Head> в pages/_document.js.
Check Icon@next/next/no-head-elementЗапрещает использование элемента <head>.
Check Icon@next/next/no-head-import-in-documentЗапрещает использование next/head в pages/_document.js.
Check Icon@next/next/no-html-link-for-pagesЗапрещает использование элементов <a> для навигации по внутренним страницам Next.js.
Check Icon@next/next/no-img-elementЗапрещает использование элемента <img> из-за снижения LCP и увеличения трафика.
Check Icon@next/next/no-page-custom-fontЗапрещает использование пользовательских шрифтов только для отдельных страниц.
Check Icon@next/next/no-script-component-in-headЗапрещает использование next/script в компоненте next/head.
Check Icon@next/next/no-styled-jsx-in-documentЗапрещает использование styled-jsx в pages/_document.js.
Check Icon@next/next/no-sync-scriptsЗапрещает синхронные скрипты.
Check Icon@next/next/no-title-in-document-headЗапрещает использование <title> с компонентом Head из next/document.
Check Icon@next/next/no-typosПредотвращает распространённые опечатки в функциях получения данных Next.js
Check Icon@next/next/no-unwanted-polyfillioПредотвращает дублирование полифилов из Polyfill.io.

Рекомендуем использовать подходящую интеграцию для отображения предупреждений и ошибок прямо в редакторе кода во время разработки.

Примеры

Линтинг пользовательских директорий и файлов

По умолчанию Next.js запускает ESLint для всех файлов в директориях pages/, app/, components/, lib/ и src/. Однако вы можете указать конкретные директории с помощью опции dirs в конфигурации eslint в next.config.js для production-сборок:

next.config.js
module.exports = {
  eslint: {
    dirs: ['pages', 'utils'], // Запускать ESLint только для директорий 'pages' и 'utils' во время production-сборок (next build)
  },
}

Аналогично, флаги --dir и --file можно использовать с next lint для линтинга конкретных директорий и файлов:

Terminal
next lint --dir pages --dir utils --file bar.js

Указание корневой директории в монорепозитории

Если вы используете eslint-plugin-next в проекте, где Next.js не установлен в корневой директории (например, в монорепозитории), вы можете указать eslint-plugin-next, где находится ваше приложение Next.js, с помощью свойства settings в вашем .eslintrc:

eslint.config.mjs
import { FlatCompat } from '@eslint/eslintrc'

const compat = new FlatCompat({
  // import.meta.dirname доступен начиная с Node.js v20.11.0
  baseDirectory: import.meta.dirname,
})

const eslintConfig = [
  ...compat.config({
    extends: ['next'],
    settings: {
      next: {
        rootDir: 'packages/my-app/',
      },
    },
  }),
]

export default eslintConfig

rootDir может быть путём (относительным или абсолютным), glob-шаблоном (например, "packages/*/") или массивом путей и/или шаблонов.

Отключение кеширования

Для повышения производительности информация о файлах, обработанных ESLint, по умолчанию кешируется. Кеш хранится в .next/cache или в указанной вами директории сборки. Если вы используете правила ESLint, которые зависят от содержимого нескольких исходных файлов, и вам нужно отключить кеширование, используйте флаг --no-cache с next lint.

Terminal
next lint --no-cache

Отключение правил

Если вы хотите изменить или отключить какие-либо правила из поддерживаемых плагинов (react, react-hooks, next), вы можете сделать это напрямую с помощью свойства rules в вашем .eslintrc:

eslint.config.mjs
import { FlatCompat } from '@eslint/eslintrc'

const compat = new FlatCompat({
  // import.meta.dirname доступен начиная с Node.js v20.11.0
  baseDirectory: import.meta.dirname,
})

const eslintConfig = [
  ...compat.config({
    extends: ['next'],
    rules: {
      'react/no-unescaped-entities': 'off',
      '@next/next/no-page-custom-font': 'off',
    },
  }),
]

export default eslintConfig

С Core Web Vitals

Набор правил next/core-web-vitals активируется при первом запуске next lint, если выбран строгий вариант.

eslint.config.mjs
import { FlatCompat } from '@eslint/eslintrc'

const compat = new FlatCompat({
  // import.meta.dirname доступен начиная с Node.js v20.11.0
  baseDirectory: import.meta.dirname,
})

const eslintConfig = [
  ...compat.config({
    extends: ['next/core-web-vitals'],
  }),
]

export default eslintConfig

next/core-web-vitals обновляет eslint-plugin-next, чтобы выдавать ошибки для ряда правил, которые по умолчанию являются предупреждениями, если они влияют на Core Web Vitals.

Точка входа next/core-web-vitals автоматически включается для новых приложений, созданных с помощью Create Next App.

С TypeScript

В дополнение к правилам ESLint Next.js, create-next-app --typescript также добавит специфичные для TypeScript правила линтинга с next/typescript в вашу конфигурацию:

eslint.config.mjs
import { FlatCompat } from '@eslint/eslintrc'

const compat = new FlatCompat({
  // import.meta.dirname доступен начиная с Node.js v20.11.0
  baseDirectory: import.meta.dirname,
})

const eslintConfig = [
  ...compat.config({
    extends: ['next/core-web-vitals', 'next/typescript'],
  }),
]

export default eslintConfig

Эти правила основаны на plugin:@typescript-eslint/recommended. Подробнее см. в typescript-eslint > Configs.

С Prettier

ESLint также включает правила форматирования кода, которые могут конфликтовать с вашей текущей настройкой Prettier. Рекомендуем включить eslint-config-prettier в вашу конфигурацию ESLint для совместной работы ESLint и Prettier.

Сначала установите зависимость:

Terminal
npm install --save-dev eslint-config-prettier

yarn add --dev eslint-config-prettier

pnpm add --save-dev eslint-config-prettier

bun add --dev eslint-config-prettier

Затем добавьте prettier в вашу существующую конфигурацию ESLint:

eslint.config.mjs
import { FlatCompat } from '@eslint/eslintrc'

const compat = new FlatCompat({
  // import.meta.dirname доступен начиная с Node.js v20.11.0
  baseDirectory: import.meta.dirname,
})

const eslintConfig = [
  ...compat.config({
    extends: ['next', 'prettier'],
  }),
]

export default eslintConfig

Запуск линтинга для staged-файлов

Если вы хотите использовать next lint с lint-staged для запуска линтера на staged-файлах git, вам нужно добавить следующее в файл .lintstagedrc.js в корне вашего проекта, чтобы указать использование флага --file.

.lintstagedrc.js
const path = require('path')

const buildEslintCommand = (filenames) =>
  `next lint --fix --file ${filenames
    .map((f) => path.relative(process.cwd(), f))
    .join(' --file ')}`

module.exports = {
  '*.{js,jsx,ts,tsx}': [buildEslintCommand],
}

Отключение линтинга во время production-сборок

Если вы не хотите, чтобы ESLint запускался во время next build, вы можете установить опцию eslint.ignoreDuringBuilds в next.config.js в значение true:

import type { NextConfig } from 'next'

const nextConfig: NextConfig = {
  eslint: {
    // Предупреждение: Это позволяет успешно завершать production-сборки,
    // даже если в вашем проекте есть ошибки ESLint.
    ignoreDuringBuilds: true,
  },
}

export default nextConfig
const nextConfig = {
  eslint: {
    // Предупреждение: Это позволяет успешно завершать production-сборки,
    // даже если в вашем проекте есть ошибки ESLint.
    ignoreDuringBuilds: true,
  },
}

export default nextConfig

Миграция существующей конфигурации

Если у вас уже настроен ESLint в вашем приложении, мы рекомендуем расширять этот плагин напрямую вместо включения eslint-config-next, за исключением нескольких случаев.

Рекомендуемый набор правил плагина

Если выполняются следующие условия:

  • У вас уже установлен один или несколько следующих плагинов (отдельно или через другую конфигурацию, такую как airbnb или react-app):
    • react
    • react-hooks
    • jsx-a11y
    • import
  • Вы определили специфичные parserOptions, которые отличаются от настройки Babel в Next.js (это не рекомендуется, если вы не настроили Babel вручную)
  • У вас установлен eslint-plugin-import с Node.js и/или TypeScript резолверами для обработки импортов

Тогда мы рекомендуем либо удалить эти настройки, если вы предпочитаете конфигурацию этих свойств в eslint-config-next, либо расширять плагин ESLint Next.js напрямую:

module.exports = {
  extends: [
    //...
    'plugin:@next/next/recommended',
  ],
}

Плагин можно установить обычным образом в вашем проекте без необходимости запускать next lint:

Terminal
npm install --save-dev @next/eslint-plugin-next

yarn add --dev @next/eslint-plugin-next

pnpm add --save-dev @next/eslint-plugin-next

bun add --dev @next/eslint-plugin-next

Это устраняет риск конфликтов или ошибок, которые могут возникнуть из-за импорта одного и того же плагина или парсера в нескольких конфигурациях.

Дополнительные конфигурации

Если вы уже используете отдельную конфигурацию ESLint и хотите включить eslint-config-next, убедитесь, что она расширяется последней после других конфигураций. Например:

eslint.config.mjs
import js from '@eslint/js'
import { FlatCompat } from '@eslint/eslintrc'

const compat = new FlatCompat({
  // import.meta.dirname доступен начиная с Node.js v20.11.0
  baseDirectory: import.meta.dirname,
  recommendedConfig: js.configs.recommended,
})

const eslintConfig = [
  ...compat.config({
    extends: ['eslint:recommended', 'next'],
  }),
]

export default eslintConfig

Конфигурация next уже обрабатывает установку значений по умолчанию для свойств parser, plugins и settings. Нет необходимости вручную переопределять эти свойства, если только вам не требуется другая конфигурация для вашего случая использования.

Если вы включаете какие-либо другие общие конфигурации, вам нужно убедиться, что эти свойства не перезаписываются и не изменяются. В противном случае мы рекомендуем удалить любые конфигурации, которые дублируют поведение конфигурации next, или расширяться напрямую из плагина ESLint для Next.js, как упоминалось выше.