如何将 ESLint 集成到创建反应应用程序中?

当我运行 npx create-react-app ...时,一个基本的 React 项目正在为我创建。 When I then peek into package.json, there seems to be some evidence of ESLint to be present, as there is this:

"eslintConfig": {
"extends": "react-app"
},

但是,每当我将 ESLint 作为开发人员依赖项安装并配置它时——正如我通常所做的那样—— VS Code 似乎都会使用它。 在这种情况下,VS 代码似乎不认识到存在任何类型的线程存在/配置。 这并不特别令人惊讶,因为 ESLint 不是我刚刚生成的 React 项目的依赖项——至少根据 package.json不是这样。 当我尝试在项目的根目录中运行 eslint .时,它显示“ command not found”。

我试图通过扩展 ESLint 配置来为它注入生命力,所以现在我有了这个:

"eslintConfig": {
"extends": ["react-app", "eslint:recommended", "google"],
"rules": {
"semi": ["error", "always"],
"quotes": ["error", "double"]
}
},

这改变不了什么。 我操纵源代码的方式,我知道它违反了上面的配置,但是,我没有得到任何不当行为的信号。

这让我想到一个简单的问题: create-react-app生成的项目是否带有某种 ESLint 配置,如果是,如何正确启用和扩展它?

当我被提到 搜索“ create response app eslint”时出现的 Google 搜索结果时——我显然已经读过了—— ,让我澄清一下我的意思:

显然,如果使用 像这样将 ESLint 手动添加到项目中,那么它将以不同的方式集成到 Create React App 中。 这不仅仅是因为有大量的人在帖子中谈到他们为了让两人合作而进行的斗争。 这也是显而易见的..。

  • ... 无法在项目根目录中运行 eslint命令。
  • ... ESLint 似乎不是 package.json中的依赖项。
  • ... VS 代码没有发现有 ESLint 存在。
  • ... 在项目根目录中没有 .eslintrc.*文件。
  • 等等。

So: How do I go about ESLint in the context of Create React App? For starters: How do I run it? How do I expand it? And why does VS Code not pick it up -- even though it usually notices the presence of ESLint?

69328 次浏览

是的,create-react-app附带 eslint配置。

如何正确启用和扩展它?

您可以检查如何扩展它 给你

{
"eslintConfig": {
"extends": ["react-app", "shared-config"],
"rules": {
"additional-rule": "warn"
},
"overrides": [
{
"files": ["**/*.ts?(x)"],
"rules": {
"additional-typescript-only-rule": "warn"
}
}
]
}
}

我如何启用它?

你需要 将其与 IDE 集成

我怎么运行它?

集成之后,一个 eslint 服务器将在后台运行,并为 IDE 启用 linting (有时需要重新启动 IDE)。


在运行 npx create-react-app example之后,我检查了你所有的索赔:

...one cannot run the eslint command in the project root.

You can:

enter image description here

Eslint 是作为项目依赖项的一部分安装的,只需在全局范围内运行 eslint (eslint [cmd])就可以确保它在全局范围内安装(不推荐这样做)。

... ESLint 似乎不是 package.json 中的依赖项。

为什么?这就是为什么你使用像 CRA 这样的启动器。这是一种内在的依赖,你不必担心,这是 CRA 的工作。

... VS 代码没有发现有 ESLint 存在。

确实如此,请检查 OUTPUT选项卡并查找 ESLint以查看服务器的输出。

enter image description here

... 在项目根目录中没有. eslintrc. * 文件。

您可以从 CRA 获得默认配置(因为专注于编码而隐藏了它)。 Add such file if you want to override it (you can also extend it, check the docs).


了解 eslint 实际上是什么以及我们如何使用它是非常有用的。

你的问题很有道理,我发现这个方法很有效:

  • run ESLint in VS Code with 'npx eslint' (shows all the options) or also 'npx eslint .'
  • 将一个脚本添加到 package.json“ lint”: “ eslint”,然后使用‘ npm run lint’

在将 ESLint 集成到 VS 代码中时,我没有遇到任何问题。在安装了用于 ESLint 的 VS Code 扩展之后,我会自动看到“问题”下的 VS Code 中的警告/错误。

详细说明最上面那条评论的答案:

...ESLint does not seem to be a dependency within package.json.

为什么?这就是为什么你使用像 CRA 这样的启动器。这是一种内在的依赖,你不必担心,这是 CRA 的工作。

使用 create-response-app 创建的项目将使用 react-scripts作为依赖项。

react-scriptseslint作为依赖项安装,如 反应脚本 package.json所示。

通过在项目根目录中运行 npm ls <package>,可以查看包是否安装(以及安装位置)。

npm ls eslint显示:

└─┬ react-scripts@4.0.3
└── eslint@7.21.0

这显示了我们通过查看 GitHub 中的 response-script 手动调查的依赖树。

因此,创建-反应-应用程序的项目确实与 eslint 一起出现。因为它是一个依赖项,而不是全局安装的,所以必须使用 npm 脚本运行它。

这就是为什么在终端中运行 eslint .不起作用,而是使用

    "lint": "eslint .",

然后 npm run lint做。(虽然你可以使命令 eslint --ignore-path .gitignore .由于一个 current bug)。

类似地,eslint 配置安装在 react-scripts中,然后在默认项目输出的自己的 package.json中引用。

每个创建反应应用程序依赖于通过 react-scripts的 ESLint

我相信我已经回答了各部门的大部分问题 下面。
Here is a summary.

create-react-app生成的项目是否带有某种 ESLint 配置?

– Yes, ESLint gets installed and configured.
(Section 1 below.)

如何正确启用和扩展它?

- 它已经启用。你扩展它完全正如你已经建议 除了你不需要改变下面的任何东西 the extends attribute.
(Sections 1 & 2 below.)

显然,ESLint 被集成到 CreateReact 应用程序中 way than it would be if it had been manually added to the project 使用
[ npm install eslint --save-devnpm init @eslint/config? ]

No, it's not.
再次安装 ESLint (npm install eslint --save-dev) < em > 确实增加了
  "devDependencies": {
"eslint": "^7.32.0"
}
package.json。 But that's all it does.
实际意义是没有的,因为 "eslint": "^7.32.0"是 已经通过 react-scripts作为依赖项安装。

我建议 反对运行 npm init @eslint/config 创建 .eslintrc.*配置文件的命令。 If you run this command, consider moving all the contents of .eslintrc.* to package.json under eslintConfig.
然后删除有问题的 .eslintrc.*文件。 也许能帮你减轻 很多的痛苦。 1
(下文第1及5节)

不能在项目 root [ ? ]中运行 eslint命令

你可以的!
npx eslint . --ext .js
(下文第4节)

ESLint 似乎不是 package.json中的依赖项[ ? ]

没错!
依赖关系是 间接的,因为 react-scripts依赖于 在 ESLint 和其他包的 很多上。
(Section 1 below.)

VS 代码没有发现存在 ESLint [ ? ]

- 运行 npx eslint . --ext .js
如果您至少得到一个警告或错误,那么您就知道应该看到 它在 VS 代码以及。
(下文第3节-请参阅 抓到你了。)

there is no .eslintrc.* file in the project root.

庆幸没有吧! 也不要把它放在那里!
(下文第5条)

0. 先决条件

为了能够回答你的问题,我创建了一个应用程序: 2

npx create-react-app how-is-eslint-integrated-into-create-react-app

I then deleted all files in the src subdirectory, and inserted my own 版本的 App.jsApp.cssindex.jsindex.css,以及 包含 Button组件的 components子目录。

package.json中,我删除了一些不相关的行,比如 "version": "0.1.0",
"private": true,以及 production属性 在 browserslist下。

由此产生的 package.json:

{
"name": "how-is-eslint-integrated-into-create-react-app",
"dependencies": {
"@testing-library/jest-dom": "^5.16.2",
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^13.5.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-scripts": "5.0.0",
"web-vitals": "^2.1.4"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"development": [
"last 1 chrome version"
]
}
}

两年多前你写这个问题的时候, eslintConfig属性是

,
"eslintConfig": {
"extends": "react-app"
}

而现在呢

,
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
}

我将假设这个更改对于问题和 你提出的问题
(除非有人证明我错了)。

过去两年的另一个不同之处——除了显而易见的 版本号的变化-是增加的 web-vitals属性:

,
"web-vitals": "^2.1.4"

这是一个用 JavaScript 测量性能指标的包。 3
Thus, web-vitals is irrelevant for your questions.

您可以下载结果 包含所有必要项目文件 的 zip 文件。

一旦下载-从项目的根目录(目录 Q59633005) 运行 npm install
预计需要4到11分钟才能完成。

下一次运行 npm start
期望你的默认浏览器打开和 - 击中 F12后-显示: 4

'npm start' opens the App in the default web browser

现在从终端关闭服务器 Ctrl + C.

Take a look inside App.js. The contents are :

// App.js
import React, { useCallback, useState } from 'react';
import "./App.css";
import Button from "./components/UI/Button/Button"


function App(unUsedArgument) {
const [unUsedVariable, setShowParagraph] = useState(true);
const showParagraphFcn = useCallback(() => {
setShowParagraph((prevToggle) => !prevToggle);
},[]);
console.log("App RUNNING");
return (
<div className="app">
<h1>Hi there!</h1>
<Button onClick={showParagraphFcn}>A Button</Button>
</div>
);
}
export default App;

I now have project to help answer your questions.

1. ESLint in Visual Studio Code

VS Code does not seem to recognize that there is any kind of linter 存在/配置。 This is not super surprising, as ESLint is not a dependency of the React project I just generated -- at least not according to package.json.

The npx create-react-app ... 确实安装了 ESLint.

ESLint 深深地埋藏在 react-scripts的依赖树中 包裹。
react-scripts中 ESLint 的顶部节点是 eslint-config-react-app5

一些 基本的配置也是交易的一部分。 所以 ESLint 是的可以开箱即用。

VS 代码在 App.js的第7行显示了对 unUsedVariable的警告
(但由于某种原因,第6行的 unUsedArgument没有)。

在 VS Code 中,期望看到:

ESLint works out of the box for Create React App. VS Code shows 1 warning.

2. 如何展开 ESLint

如何展开[创建应用程序中的 ESLint ] ?

中的 eslintConfig下添加 rules package.json,正如您在您的 有个问题。

To try your example, replace

,
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
}

,
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
],
"rules": {
"semi": [
"error",
"always"
],
"quotes": [
"error",
"double"
]
}
}

重新启动 VS 代码后,它仍然显示 unUsedVariable在第7行,但是现在在第2行也有一个错误 单引号而不是双引号,以及第4行的 行尾缺少分号。

With ESLint 'rules' set, VS Code shows a warnings and errors

这表明您已经正确地回答了如何展开 创建应用程序。

对于另一个示例,请考虑查看 package.json | eslintConfig of 这个答案.


3. VS 代码的一些陷阱

仍然没有看到截图中的错误和警告 上面? 我知道这可能行不通。

Three gotchas to check :

4. A much faster way to check if ESLint works

首先: 我如何运行它?

回答: 6

npx eslint . --ext .js

11 errors and 1 warning when running ESLint from the command line

答复的前四行:

C:\stackexchange\stackoverflow\linting\eslint\Q59633005\src\App.js
2:46 error    Strings must use doublequote                         quotes
4:51 error    Missing semicolon                                    semi
7:10 warning  'unUsedVariable' is assigned a value but never used  no-unused-vars

- 在不到10秒钟,你得到相同的信息,关于错误 and warnings as in VS Code.

5. 一句警告

如果您不喜欢难以调试的错误,例如

然后是 根本不要使用任何 .eslintrc.*文件。 1

In my experience, you can put all ESLint configurations under package.json中的 eslintConfig,如上文第2节所述。 你不需要任何 .eslintrc.*文件。

参考文献


1 如果你想知道 为什么,比较 this long answer这个简短的回答。

2 我在 Windows 10上,但是我期待所有的命令 这里提供的操作系统在 Linux 和 macOS 上都可以很好地工作-除了 除非另有说明。

3 You can find that out by running npm ll.

4 我使用的是 Google Chrome Version 98.0.4758.102,64位。 在 Windows10上运行。

我是从 NPMGraph-可视化 NPM 模块依赖关系。

6 或者,如果你在 MicrosoftWindows (反斜杠)。
Use the second line if you are on Linux or macOS (forward slashes).

node*modules\.bin\eslint . --ext .js
node*modules/.bin/eslint . --ext .js