Skip to content
On this page

Monorepo中的ESLint

共享配置

在多个工作区之间共享 ESLint 配置可以使所有工作区更加一致,从而大大提高工作效率。

让我们想象一个这样的 monorepo:

apps
├─ docs
│  ├─ package.json
│  └─ .eslintrc.js
└─ web
   ├─ package.json
   └─ .eslintrc.js
packages
└─ eslint-config-custom
   ├─ index.js
   └─ package.json

我们有一个名为 eslint-config-custom 的包,还有两个应用程序,每个应用程序都有自己的 .eslintrc.js

eslint-config-custom

我们的 eslint-config-custom 文件只包含一个单独的文件 index.js。是这个样子的:

js
module.exports = {
  extends: ['next', 'turbo', 'prettier'],
  rules: {
    '@next/next/no-html-link-for-pages': 'off'
  }
}

这是典型的 ESLint 配置,没什么花哨的。这个 package.json 看起来是这样的:

json
{
  "name": "eslint-config-custom",
  "main": "index.js",
  "version": "1.0.0",
  "dependencies": {
    "eslint": "latest",
    "eslint-config-next": "latest",
    "eslint-config-prettier": "latest",
    "eslint-plugin-react": "latest",
    "eslint-config-turbo": "latest"
  }
}

这里有两点值得注意。首先,主字段指向 index.js。这允许文件轻松导入此配置。

其次,这里列出了 ESLint 依赖项。这个很有用 —— 这意味着我们不需要在导入 eslint-config-custom 的应用程序中重新指定依赖项。

如何使用 eslint-config-custom

在我们的 web 应用程序中,我们首先需要添加 eslint-config-custom 作为一个依赖项。

json
{
  "dependencies": {
    "eslint-config-custom": "*"
  }
}
json
{
  "dependencies": {
    "eslint-config-custom": "*"
  }
}
json
{
  "dependencies": {
    "eslint-config-custom": "workspace:*"
  }
}

然后我们可以这样导入配置:

js
// apps/web/.eslintrc.js
module.exports = {
  root: true,
  extends: ['custom']
}

通过将 custom 添加到 extends 数组中,我们告诉 ESLint 寻找一个名为 eslint-config-custom 的包,它会找到我们的工作区。

概要

默认情况下,当您使用 npx create-turbo@latest 创建一个新的 Monorepo 时,此设置会附带。您还可以查看我们的基本示例来查看工作版本。

设置 lint 任务

我们建议按照基础部分的设置进行操作。但要做一个修改,每个 package.json 脚本应该是这样的:

json
// packages/*/package.json
{
  "scripts": {
    "lint": "eslint"
  }
}