ESLint

Next.js 默认提供了开箱即用的 ESLint 集成体验。将 next lint 作为脚本添加到 package.json

package.json
{
  "scripts": {
    "lint": "next lint"
  }
}

然后运行 npm run lintyarn lint

Terminal
yarn lint

如果您的应用尚未配置 ESLint,系统将引导您完成安装和配置过程。

Terminal
yarn lint

您将看到如下提示:

? 您希望如何配置 ESLint?

❯ 严格模式 (推荐)
基础模式
取消

可以选择以下三种选项之一:

  • 严格模式:包含 Next.js 的基础 ESLint 配置以及更严格的 核心 Web 指标规则集。这是首次设置 ESLint 的开发者的推荐配置。

    .eslintrc.json
    {
      "extends": "next/core-web-vitals"
    }
  • 基础模式:仅包含 Next.js 的基础 ESLint 配置。

    .eslintrc.json
    {
      "extends": "next"
    }
  • 取消:不包含任何 ESLint 配置。仅当您计划设置自定义 ESLint 配置时选择此选项。

如果选择了前两种配置选项之一,Next.js 将自动在您的应用中安装 eslinteslint-config-next 作为依赖项,并在项目根目录创建包含所选配置的 .eslintrc.json 文件。

现在您可以在需要捕获错误时随时运行 next lint。ESLint 设置完成后,还会在每次构建 (next build) 时自动运行。错误会导致构建失败,而警告则不会。

如果不希望 ESLint 在 next build 期间运行,请参阅 忽略 ESLint 文档。

我们建议使用合适的 集成工具 在开发期间直接在代码编辑器中查看警告和错误。

ESLint 配置

默认配置 (eslint-config-next) 包含您在 Next.js 中获得开箱即用最佳 linting 体验所需的一切。如果您的应用尚未配置 ESLint,我们建议使用 next lint 来设置 ESLint 及此配置。

如果希望将 eslint-config-next 与其他 ESLint 配置一起使用,请参阅 附加配置 部分了解如何操作而不引起冲突。

eslint-config-next 中使用了以下 ESLint 插件的推荐规则集:

这将优先于 next.config.js 中的配置。

ESLint 插件

Next.js 提供了一个 ESLint 插件 eslint-plugin-next,已捆绑在基础配置中,可捕获 Next.js 应用中的常见问题和错误。完整规则集如下:

Check Icon 在推荐配置中启用

规则描述
Check Icon@next/next/google-font-display强制 Google 字体的 font-display 行为。
Check Icon@next/next/google-font-preconnect确保 Google 字体使用 preconnect
Check Icon@next/next/inline-script-id强制内联内容的 next/script 组件具有 id 属性。
Check Icon@next/next/next-script-for-ga使用 Google Analytics 内联脚本时优先使用 next/script 组件。
Check Icon@next/next/no-assign-module-variable防止对 module 变量进行赋值。
Check Icon@next/next/no-async-client-component防止客户端组件成为异步函数。
Check Icon@next/next/no-before-interactive-script-outside-document防止在 pages/_document.js 之外使用 next/scriptbeforeInteractive 策略。
Check Icon@next/next/no-css-tags防止手动添加样式表标签。
Check Icon@next/next/no-document-import-in-page防止在 pages/_document.js 之外导入 next/document
Check Icon@next/next/no-duplicate-head防止在 pages/_document.js 中重复使用 <Head>
Check Icon@next/next/no-head-element防止使用 <head> 元素。
Check Icon@next/next/no-head-import-in-document防止在 pages/_document.js 中使用 next/head
Check Icon@next/next/no-html-link-for-pages防止使用 <a> 元素导航到内部 Next.js 页面。
Check Icon@next/next/no-img-element由于较慢的 LCP 和更高带宽,防止使用 <img> 元素。
Check Icon@next/next/no-page-custom-font防止仅页面级自定义字体。
Check Icon@next/next/no-script-component-in-head防止在 next/head 组件中使用 next/script
Check Icon@next/next/no-styled-jsx-in-document防止在 pages/_document.js 中使用 styled-jsx
Check Icon@next/next/no-sync-scripts防止同步脚本。
Check Icon@next/next/no-title-in-document-head防止在 next/documentHead 组件中使用 <title>
Check Icon@next/next/no-typos防止 Next.js 数据获取函数 中的常见拼写错误
Check Icon@next/next/no-unwanted-polyfillio防止 Polyfill.io 的重复 polyfill。

如果您的应用已配置 ESLint,我们建议直接扩展此插件而不是包含 eslint-config-next,除非满足某些条件。有关更多信息,请参阅 推荐插件规则集

自定义设置

rootDir

如果您在 Next.js 未安装在根目录的项目(如 monorepo)中使用 eslint-plugin-next,可以通过 .eslintrc 中的 settings 属性告诉 eslint-plugin-next 在哪里找到您的 Next.js 应用:

.eslintrc.json
{
  "extends": "next",
  "settings": {
    "next": {
      "rootDir": "packages/my-app/"
    }
  }
}

rootDir 可以是路径(相对或绝对)、通配符(如 "packages/*/")或路径和/或通配符的数组。

检查自定义目录和文件

默认情况下,Next.js 会对 pages/app/components/lib/src/ 目录中的所有文件运行 ESLint。但您可以在 next.config.jseslint 配置中使用 dirs 选项为生产构建指定目录:

next.config.js
module.exports = {
  eslint: {
    dirs: ['pages', 'utils'], // 仅在生产构建 (next build) 期间对 'pages' 和 'utils' 目录运行 ESLint
  },
}

类似地,next lint 可以使用 --dir--file 标志来检查特定目录和文件:

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

缓存

为了提高性能,ESLint 处理的文件信息默认会被缓存。这些信息存储在 .next/cache 或您定义的 构建目录 中。如果包含任何依赖于多个源文件内容而不仅仅是单个源文件内容的 ESLint 规则,并需要禁用缓存,请使用 next lint--no-cache 标志。

Terminal
next lint --no-cache

禁用规则

如果希望修改或禁用支持插件 (reactreact-hooksnext) 提供的任何规则,可以直接通过 .eslintrc 中的 rules 属性进行更改:

.eslintrc.json
{
  "extends": "next",
  "rules": {
    "react/no-unescaped-entities": "off",
    "@next/next/no-page-custom-font": "off"
  }
}

核心 Web 指标

当首次运行 next lint 并选择 严格 选项时,会启用 next/core-web-vitals 规则集。

.eslintrc.json
{
  "extends": "next/core-web-vitals"
}

next/core-web-vitals 更新 eslint-plugin-next,如果规则影响 核心 Web 指标,则将默认警告的多个规则设为错误。

对于使用 Create Next App 构建的新应用,会自动包含 next/core-web-vitals 入口点。

TypeScript

除了 Next.js ESLint 规则外,create-next-app --typescript 还会通过 next/typescript 将 TypeScript 特定的 lint 规则添加到您的配置中:

.eslintrc.json
{
  "extends": ["next/core-web-vitals", "next/typescript"]
}

这些规则基于 plugin:@typescript-eslint/recommended。 有关更多详细信息,请参阅 typescript-eslint > 配置

与其他工具一起使用

Prettier

ESLint 还包含代码格式化规则,可能与您现有的 Prettier 设置冲突。我们建议在 ESLint 配置中包含 eslint-config-prettier 以使 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 配置中:

.eslintrc.json
{
  "extends": ["next", "prettier"]
}

lint-staged

如果希望将 next lintlint-staged 一起使用以对暂存的 git 文件运行 linter,必须在项目根目录的 .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],
}

迁移现有配置

推荐插件规则集

如果您的应用中已配置了 ESLint 且符合以下任一条件:

  • 已安装以下任一插件(单独安装或通过其他配置如 airbnbreact-app):
    • react
    • react-hooks
    • jsx-a11y
    • import
  • 自定义了与 Next.js 内部 Babel 配置不同的 parserOptions(除非您已 自定义 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,请确保将其作为最后一项继承。例如:

.eslintrc.json
{
  "extends": ["eslint:recommended", "next"]
}

next 配置已默认处理了 parserpluginssettings 属性的设置。除非有特殊需求,否则无需手动重复声明这些属性。

若包含其他可共享配置,需确保这些属性不会被覆盖或修改。否则,我们建议移除与 next 配置功能重叠的部分,或如前文所述直接继承 Next.js ESLint 插件。

On this page