ESLint 
Next.js 提供了一个开箱即用的集成 ESLint 体验。将 next lint 作为脚本添加到 package.json:
{
  "scripts": {
    "lint": "next lint"
  }
}然后运行 npm run lint 或 yarn lint:
yarn lint如果您的应用程序中尚未配置 ESLint,系统将引导您完成安装和配置过程。
yarn lint您将看到一个类似的提示:
? 您想如何配置 ESLint?
❯ 严格(推荐) 基础 取消
可以选择以下三种选项之一:
- 严格:包括 Next.js 的基础 ESLint 配置以及更严格的 核心 Web 性能指标规则集。这是为第一次设置 ESLint 的开发人员推荐的配置。 json- { "extends": "next/core-web-vitals" }
- 基础:包括 Next.js 的基础 ESLint 配置。 json- { "extends": "next" }
- 取消:不包含任何 ESLint 配置。只有在您计划设置自己的自定义 ESLint 配置时,才选择此选项。 
如果选择了这两种配置选项中的任何一种,Next.js 将自动在您的应用程序中安装 eslint 和 eslint-config-next 作为依赖项,并在项目根目录创建一个包含您所选配置的 .eslintrc.json 文件。
现在,您可以随时运行 next lint 来运行 ESLint 以捕获错误。一旦设置好 ESLint,它还会在每次构建时自动运行(next build)。错误将导致构建失败,而警告则不会。
我们建议使用适当的 集成 在开发期间直接在代码编辑器中查看警告和错误。
ESLint 配置 
默认配置(eslint-config-next)包含了在 Next.js 中拥有最佳开箱即用 linting 体验所需的一切。如果您的应用程序中尚未配置 ESLint,我们建议您使用 next lint 来设置 ESLint 以及此配置。
如果您想在使用
eslint-config-next的同时使用其他 ESLint 配置,请参考 额外配置 部分,了解如何避免造成任何冲突。
eslint-config-next 中使用了以下 ESLint 插件的推荐规则集:
这将优先于 next.config.js 中的配置。
ESLint Plugin 
Next.js provides an ESLint plugin, eslint-plugin-next, already bundled within the base configuration that makes it possible to catch common issues and problems in a Next.js application. The full set of rules is as follows:
| Rule | Description | |
|---|---|---|
| @next/next/google-font-display | Enforce font-display behavior with Google Fonts. | |
| @next/next/google-font-preconnect | Ensure preconnectis used with Google Fonts. | |
| @next/next/inline-script-id | Enforce idattribute onnext/scriptcomponents with inline content. | |
| @next/next/next-script-for-ga | Prefer next/scriptcomponent when using the inline script for Google Analytics. | |
| @next/next/no-assign-module-variable | Prevent assignment to the modulevariable. | |
| @next/next/no-async-client-component | Prevent client components from being async functions. | |
| @next/next/no-before-interactive-script-outside-document | Prevent usage of next/script'sbeforeInteractivestrategy outside ofpages/_document.js. | |
| @next/next/no-css-tags | Prevent manual stylesheet tags. | |
| @next/next/no-document-import-in-page | Prevent importing next/documentoutside ofpages/_document.js. | |
| @next/next/no-duplicate-head | Prevent duplicate usage of <Head>inpages/_document.js. | |
| @next/next/no-head-element | Prevent usage of <head>element. | |
| @next/next/no-head-import-in-document | Prevent usage of next/headinpages/_document.js. | |
| @next/next/no-html-link-for-pages | Prevent usage of <a>elements to navigate to internal Next.js pages. | |
| @next/next/no-img-element | Prevent usage of <img>element due to slower LCP and higher bandwidth. | |
| @next/next/no-page-custom-font | Prevent page-only custom fonts. | |
| @next/next/no-script-component-in-head | Prevent usage of next/scriptinnext/headcomponent. | |
| @next/next/no-styled-jsx-in-document | Prevent usage of styled-jsxinpages/_document.js. | |
| @next/next/no-sync-scripts | Prevent synchronous scripts. | |
| @next/next/no-title-in-document-head | Prevent usage of <title>withHeadcomponent fromnext/document. | |
| @next/next/no-typos | Prevent common typos in Next.js's data fetching functions | |
| @next/next/no-unwanted-polyfillio | Prevent duplicate polyfills from Polyfill.io. | 
If you already have ESLint configured in your application, we recommend extending from this plugin directly instead of including eslint-config-next unless a few conditions are met. Refer to the Recommended Plugin Ruleset to learn more.
自定义设置 
rootDir 
如果你在一个项目中使用 eslint-plugin-next,而 Next.js 并未安装在项目的根目录(例如在 monorepo 中),你可以使用 .eslintrc 中的 settings 属性来告诉 eslint-plugin-next 你的 Next.js 应用在哪里:
{
  "extends": "next",
  "settings": {
    "next": {
      "rootDir": "packages/my-app/"
    }
  }
}rootDir 可以是路径(相对或绝对)、一个全局模式(例如 "packages/*/"),或者是一个路径和/或全局模式的数组。
检查自定义目录和文件 
默认情况下,Next.js 会为 pages/、app/、components/、lib/ 和 src/ 目录中的所有文件运行 ESLint。然而,你可以在 next.config.js 中的 eslint 配置的 dirs 选项中指定要检查的目录,以用于生产构建:
module.exports = {
  eslint: {
    dirs: ['pages', 'utils'], // 仅在生产构建期间(next build)运行 ESLint,针对 'pages' 和 'utils' 目录
  },
}类似地,--dir 和 --file 标志可用于 next lint 以检查特定的目录和文件:
next lint --dir pages --dir utils --file bar.js缓存 
next lint --no-cache禁用规则 
如果你想修改或禁用由支持的插件(react、react-hooks、next)提供的任何规则,你可以直接在 .eslintrc 中的 rules 属性中更改它们:
{
  "extends": "next",
  "rules": {
    "react/no-unescaped-entities": "off",
    "@next/next/no-page-custom-font": "off"
  }
}核心网络指标 
当首次运行 next lint 并选择 strict 选项时,会启用 next/core-web-vitals 规则集。
{
  "extends": "next/core-web-vitals"
}next/core-web-vitals 更新 eslint-plugin-next,以在默认情况下为警告的规则上出现错误,如果它们影响 核心网络指标。
对于使用 Create Next App 构建的新应用程序,
next/core-web-vitals入口点会自动包含。
使用其他工具 
Prettier 
ESLint 还包含代码格式化规则,这可能与您现有的 Prettier 设置冲突。我们建议您在 ESLint 配置中包含 eslint-config-prettier,以便让 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 配置中:
{
  "extends": ["next", "prettier"]
}lint-staged 
如果您想使用 next lint 与 lint-staged 一起运行,以便在暂存的 git 文件上运行 linter,您需要在项目根目录下的 .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],
}迁移现有配置 
推荐的插件规则集 
如果您已经在应用程序中配置了 ESLint,并且以下任一条件为真:
- 您已经安装了一个或多个以下插件(无论是单独安装还是通过 airbnb或react-app等不同配置):- react
- react-hooks
- jsx-a11y
- import
 
- 您定义了特定的 parserOptions,这些选项与 Next.js 中 Babel 的配置不同(除非您已经 自定义了您的 Babel 配置)
- 您已经安装了 eslint-plugin-import并定义了 Node.js 和/或 TypeScript 解析器 以处理导入
那么我们建议您要么删除这些设置,如果您更喜欢这些属性在 eslint-config-next 中的配置方式,要么直接从 Next.js ESLint 插件扩展:
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,请确保在其他配置之后最后扩展它。例如:
{
  "extends": ["eslint:recommended", "next"]
}next 配置已经处理了为 parser、plugins 和 settings 属性设置默认值。除非您的用例需要不同的配置,否则无需手动重新声明这些属性。
如果您包含任何其他可共享的配置,您需要确保这些属性不会被覆盖或修改。否则,我们建议您删除与 next 配置共享行为的任何配置,或如上所述直接从 Next.js ESLint 插件扩展。