跳至內容

ESLint

Next.js 提供開箱即用的整合式 ESLint 體驗。將 next lint 作為指令碼新增至 package.json

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

然後執行 npm run lintyarn lint

終端機
yarn lint

如果您的應用程式中尚未設定 ESLint,系統將會引導您完成安裝和設定程序。

終端機
yarn lint

您會看到如下提示

?您想要如何設定 ESLint?

❯ 嚴格 (建議)
基本
取消

您可以選擇以下三個選項之一:

  • 嚴格:包含 Next.js 的基本 ESLint 設定,以及更嚴格的核心網頁指標規則集。這是推薦給首次設定 ESLint 的開發人員的配置。

    .eslintrc.json
    {
      "extends": "next/core-web-vitals"
    }
  • 基本:包含 Next.js 的基本 ESLint 設定。

    .eslintrc.json
    {
      "extends": "next"
    }
  • 取消:不包含任何 ESLint 設定。僅當您打算設定自己的自訂 ESLint 設定時,才選擇此選項。

如果選擇了其中任何一個設定選項,Next.js 會自動將 eslinteslint-config-next 安裝為應用程式中的 dependencies,並在專案的根目錄中建立一個包含您所選設定的 .eslintrc.json 檔案。

現在,您每次想要執行 ESLint 以捕捉錯誤時,都可以執行 next lint。設定好 ESLint 後,它也會在每次建置 (next build) 期間自動執行。錯誤將導致建置失敗,而警告則不會。

如果您不希望 ESLint 在 next build 期間執行,請參閱忽略 ESLint的說明文件。

我們建議您使用適當的整合,以便在開發期間直接在程式碼編輯器中檢視警告和錯誤。

ESLint 設定

預設設定 (eslint-config-next) 包含您在 Next.js 中獲得最佳開箱即用程式碼檢查體驗所需的一切。如果您的應用程式中尚未設定 ESLint,我們建議您使用 next lint 來設定 ESLint 以及此設定。

如果您想將 eslint-config-next 與其他 ESLint 設定一起使用,請參閱其他設定章節,了解如何在不造成任何衝突的情況下進行設定。

eslint-config-next 中使用了以下 ESLint 外掛程式中推薦的規則集:

這將優先於 next.config.js 中的設定。

ESLint 外掛程式

Next.js 提供了一個 ESLint 外掛程式,eslint-plugin-next,它已捆綁在基本設定中,可以捕捉 Next.js 應用程式中的常見問題。完整的規則集如下:

在建議的設定中已啟用

規則說明
@next/next/google-font-display使用 Google Fonts 時強制執行 font-display 行為。
@next/next/google-font-preconnect確保在使用 Google Fonts 時使用 preconnect
@next/next/inline-script-id強制在具有內嵌內容的 next/script 元件上使用 id 屬性。
@next/next/next-script-for-ga使用 Google Analytics 的內嵌程式碼時,建議使用 next/script 元件。
@next/next/no-assign-module-variable防止對 module 變數進行賦值。
@next/next/no-async-client-component防止客戶端元件成為非同步函式。
@next/next/no-before-interactive-script-outside-document防止在 pages/_document.js 之外使用 next/scriptbeforeInteractive 策略。
@next/next/no-css-tags防止手動樣式表標籤。
@next/next/no-document-import-in-page防止在 pages/_document.js 之外導入 next/document
@next/next/no-duplicate-head防止在 pages/_document.js 中重複使用 <Head>
@next/next/no-head-element防止使用 <head> 元素。
@next/next/no-head-import-in-document防止在 pages/_document.js 中使用 next/head
@next/next/no-html-link-for-pages防止使用 <a> 元素導航到內部 Next.js 頁面。
@next/next/no-img-element由於較慢的 LCP 和較高的頻寬,防止使用 <img> 元素。
@next/next/no-page-custom-font防止僅限頁面的自訂字體。
@next/next/no-script-component-in-head防止在 next/head 元件中使用 next/script
@next/next/no-styled-jsx-in-document防止在 pages/_document.js 中使用 styled-jsx
@next/next/no-sync-scripts防止同步腳本。
@next/next/no-title-in-document-head防止使用來自 next/documentHead 元件中的 <title>
@next/next/no-typos防止在Next.js 的資料擷取函式中出現常見的拼寫錯誤。
@next/next/no-unwanted-polyfillio防止來自 Polyfill.io 的重複 polyfills。

如果您已在應用程式中設定 ESLint,我們建議直接從這個外掛程式延伸,而不是包含 eslint-config-next,除非滿足一些條件。請參閱建議的外掛程式規則集了解更多資訊。

自訂設定 rootDir

如果您在 Next.js 並未安裝於專案根目錄的專案中使用 eslint-plugin-next(例如 monorepo),您可以使用 .eslintrc 中的 settings 屬性來告訴 eslint-plugin-next Next.js 應用程式的位置。

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

rootDir 可以是一個路徑(相對或絕對)、一個 glob(例如 "packages/*/"),或是一個路徑和/或 glob 的陣列。

Lint 指定目錄和檔案

預設情況下,Next.js 會對 pages/app/components/lib/src/ 目錄中的所有檔案執行 ESLint。然而,您可以使用 next.config.jseslint 設定的 dirs 選項來指定要檢查的目錄(適用於正式版建置)。

next.config.js
module.exports = {
  eslint: {
    dirs: ['pages', 'utils'], // Only run ESLint on the 'pages' and 'utils' directories during production builds (next build)
  },
}

同樣地,--dir--file 旗標可以用於 next lint 來 lint 指定的目錄和檔案。

終端機
next lint --dir pages --dir utils --file bar.js

快取 建置目錄中。如果您包含任何依賴於單一原始檔內容以外的 ESLint 規則,並且需要停用快取,請在使用 next lint 時加上 --no-cache 旗標。

終端機
next lint --no-cache

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

核心網頁指標
.eslintrc.json
{
  "extends": "next/core-web-vitals"
}

next/core-web-vitals 會將 eslint-plugin-next 更新,使其針對影響 核心網頁指標 的一些預設為警告的規則顯示錯誤。

使用 Create Next App 建立的新應用程式會自動包含 next/core-web-vitals 進入點。

TypeScript

除了 Next.js 的 ESLint 規則外,create-next-app --typescript 也會使用 next/typescript 將 TypeScript 特定的程式碼檢查規則新增到您的設定中。

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

這些規則基於 plugin:@typescript-eslint/recommended。詳情請參閱 typescript-eslint > 設定

與其他工具一起使用

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 設定中

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

lint-staged

如果您想使用 next lint 搭配 lint-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,且符合以下任何條件:

那麼,如果您偏好 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 插件繼承。