Плагин ESLint
Next.js включает плагин ESLint eslint-plugin-next, который входит в базовую конфигурацию и помогает выявлять распространённые проблемы в приложениях Next.js.
Справочник
Рекомендуемые наборы правил из следующих плагинов ESLint используются в eslint-config-next:
Эти настройки имеют приоритет над конфигурацией из next.config.js.
Правила
Полный набор правил выглядит следующим образом:
| Включено в рекомендованной конфигурации | Правило | Описание |
|---|---|---|
| @next/next/google-font-display | Обеспечивает правильное поведение font-display для Google Fonts. | |
| @next/next/google-font-preconnect | Гарантирует использование preconnect с Google Fonts. | |
| @next/next/inline-script-id | Требует наличие атрибута id для компонентов next/script с встроенным содержимым. | |
| @next/next/next-script-for-ga | Рекомендует использовать компонент next/script для встроенных скриптов Google Analytics. | |
| @next/next/no-assign-module-variable | Запрещает присваивание переменной module. | |
| @next/next/no-async-client-component | Запрещает использование асинхронных функций в Client Components. | |
| @next/next/no-before-interactive-script-outside-document | Запрещает использование стратегии beforeInteractive для next/script вне pages/_document.js. | |
| @next/next/no-css-tags | Запрещает ручное добавление тегов стилей. | |
| @next/next/no-document-import-in-page | Запрещает импорт next/document вне pages/_document.js. | |
| @next/next/no-duplicate-head | Запрещает дублирование <Head> в pages/_document.js. | |
| @next/next/no-head-element | Запрещает использование элемента <head>. | |
| @next/next/no-head-import-in-document | Запрещает использование next/head в pages/_document.js. | |
| @next/next/no-html-link-for-pages | Запрещает использование элементов <a> для навигации по внутренним страницам Next.js. | |
| @next/next/no-img-element | Запрещает использование элемента <img> из-за снижения LCP и увеличения трафика. | |
| @next/next/no-page-custom-font | Запрещает использование пользовательских шрифтов только для отдельных страниц. | |
| @next/next/no-script-component-in-head | Запрещает использование next/script в компоненте next/head. | |
| @next/next/no-styled-jsx-in-document | Запрещает использование styled-jsx в pages/_document.js. | |
| @next/next/no-sync-scripts | Запрещает синхронные скрипты. | |
| @next/next/no-title-in-document-head | Запрещает использование <title> с компонентом Head из next/document. | |
| @next/next/no-typos | Предотвращает распространённые опечатки в функциях получения данных Next.js | |
| @next/next/no-unwanted-polyfillio | Предотвращает дублирование полифилов из Polyfill.io. |
Рекомендуем использовать подходящую интеграцию для отображения предупреждений и ошибок прямо в редакторе кода во время разработки.
Примеры
Линтинг пользовательских директорий и файлов
По умолчанию Next.js запускает ESLint для всех файлов в директориях pages/, app/, components/, lib/ и src/. Однако вы можете указать конкретные директории с помощью опции dirs в конфигурации eslint в next.config.js для production-сборок:
module.exports = {
eslint: {
dirs: ['pages', 'utils'], // Запускать ESLint только для директорий 'pages' и 'utils' во время production-сборок (next build)
},
}Аналогично, флаги --dir и --file можно использовать с next lint для линтинга конкретных директорий и файлов:
next lint --dir pages --dir utils --file bar.jsУказание корневой директории в монорепозитории
Если вы используете eslint-plugin-next в проекте, где Next.js не установлен в корневой директории (например, в монорепозитории), вы можете указать eslint-plugin-next, где находится ваше приложение Next.js, с помощью свойства settings в вашем .eslintrc:
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 eslintConfigrootDir может быть путём (относительным или абсолютным), glob-шаблоном (например, "packages/*/") или массивом путей и/или шаблонов.
Отключение кеширования
Для повышения производительности информация о файлах, обработанных ESLint, по умолчанию кешируется. Кеш хранится в .next/cache или в указанной вами директории сборки. Если вы используете правила ESLint, которые зависят от содержимого нескольких исходных файлов, и вам нужно отключить кеширование, используйте флаг --no-cache с next lint.
next lint --no-cacheОтключение правил
Если вы хотите изменить или отключить какие-либо правила из поддерживаемых плагинов (react, react-hooks, next), вы можете сделать это напрямую с помощью свойства rules в вашем .eslintrc:
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, если выбран строгий вариант.
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 eslintConfignext/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 в вашу конфигурацию:
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.
Сначала установите зависимость:
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:
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.
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 nextConfigconst nextConfig = {
eslint: {
// Предупреждение: Это позволяет успешно завершать production-сборки,
// даже если в вашем проекте есть ошибки ESLint.
ignoreDuringBuilds: true,
},
}
export default nextConfigМиграция существующей конфигурации
Если у вас уже настроен ESLint в вашем приложении, мы рекомендуем расширять этот плагин напрямую вместо включения eslint-config-next, за исключением нескольких случаев.
Рекомендуемый набор правил плагина
Если выполняются следующие условия:
- У вас уже установлен один или несколько следующих плагинов (отдельно или через другую конфигурацию, такую как
airbnbилиreact-app):reactreact-hooksjsx-a11yimport
- Вы определили специфичные
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:
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, убедитесь, что она расширяется последней после других конфигураций. Например:
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, как упоминалось выше.