使用 VSCode 自定义 Create React App 的 ESLint 配置,并同时配合 Prettier
关于本文
我之前有机会在Visual Studio Code(以下简称VSCode)中为使用Create React App(以下简称CRA)创建的应用程序配置ESLint。我还能够自定义ESLint并与Prettier一起使用。
当时是在开发中的应用程序设置中进行调整,所以我整理了一份步骤,以便在使用Create React App从头开始创建应用程序时可以再现。最后,即使是在从头开始创建应用程序的情况下,所做的事情也没有变化,所以我应该能够按照本文的方法对正在开发中的应用程序的ESLint进行定制。
环境
- OS: macOS
应用程序开发
使用Create React App创建应用程序。
以下是使用Yarn作为包管理工具,使用TypeScript作为开发语言的情况下的命令。
$ yarn create react-app cra_ts --template typescript
当时使用的 Create React App 版本是 v5.0.1。
安装ESLint
CRA 已经包含了 ESLint。因此不需要自行安装 ESLint。
定制 ESLint 时需要注意的事项。
使用 CRA 时,如果启动 CRA(yarn start),则会在标准输出中显示 ESLint 执行结果。这是 CRA 的 lint 功能。
根据 CRA 文档,据说即使自定义了 ESLint 的设置,CRA 的 lint 功能也不会使用已经定制的配置,所以请注意。
请注意,即使您自定义了ESLint配置,这些更改仅会影响到编辑器的整合。
配置您的编辑器 | 创建React应用程序
然而,当我实际运行应用程序(yarn start)时,我发现它使用了自定义的设置并使用了 CRA 的 lint 功能。另外,根据同一份文档,在浏览器开发者工具的控制台中似乎还会显示 ESLint 的执行结果,但是我没有看到。文档可能过时了吗?
不管怎样,由于在 VSCode 中进行了 lint 检查,所以我决定不深入研究 CRA 的 lint 功能。
定制政策
在 CRA(Create React App)中,已经默认具有 ESLint 的设置。
这些设置是写在 package.json 文件中的。
{
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
}
}
这个 react-app 和 react-app/jest 中具体的设置已经被写在文档中。这些文档和源代码可以在 eslint-config-react-app 的 GitHub 上找到。
好吧,对于扩展eslint-config-react-app的设置,是应该进行还是可以忽略呢?
在CRA的文档中,写得如下所示。
我们强烈建议扩展基本配置,因为删除它可能会引入难以找到的问题。
我們決定按照這個方針來擴展 eslint-config-react-app。
为自定义 ESLint 进行准备。
将 package.json 中的 eslintConfig 移动到 .eslintrc.js 中。
这不是必需的。但是出于个人管理方便的考虑,我建议在一个专门的文件中编写 ESLint 的配置。
在应用的根目录下创建 .eslintrc.js 文件,并按照以下方式进行编写。
/**
* ESLint の設定です。ドキュメントは以下です。
* https://eslint.org/docs/latest/use/configure/
*/
module.exports = {
extends: [
/**
* 以下 2 つは Create React App のデフォルトの ESLint の設定です。
* Create React App ではこれを拡張する形で設定することを推奨しています。
* そのため以下 2 つは消さずに、config を追加する際はその下に記載してください。
* 詳細は以下ドキュメントを参照してください。
* https://create-react-app.dev/docs/setting-up-your-editor
* https://github.com/facebook/create-react-app/tree/main/packages/eslint-config-react-app
*/
"react-app",
"react-app/jest",
],
ignorePatterns: [
"/build/", // ビルド出力
]
};
我们添加了ignorePatterns。/build/表示不对构建(yarn build)的输出进行lint。顺便提一下,node_modules目录无需特别设置即可被排除在lint的检查范围之外(ESLint文档)。
可以在 .eslintignore 文件中设置排除文件,但是由于 .eslintignore 文件在 ESLint v8.25.0 中已被弃用,因此使用 ignorePatterns 指定要排除的文件。
删除 package.json 中的 eslintConfig。
在VSCode中配置执行ESLint自动修复
首先,安装VSCode扩展程序ESLint(dbaeumer.vscode-eslint)。
创建并编写.vscode/settings.json 文件如下。
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
}
}
使用这个选项,ESLint 的自动修正将在文件保存时执行。
同时,您还可以在编辑器中查看 ESLint 的提醒。
如果你不想强迫团队按照这个设置来做,可以在 .gitignore 文件中排除它。
+ /.vscode/settings.json
美化器的安装
如果在使用ESLint的同时使用Prettier进行格式化,可以按以下方式进行设置。
首先,安装 Prettier 和 eslint-config-prettier。
$ yarn add -D prettier eslint-config-prettier
eslint-config-prettier(GitHub)是Prettier官方提供的ESLint配置。
由于它会将与Prettier冲突的ESLint设置关闭,因此安装它可以解决问题。
安装VSCode的Prettier – Code formatter(esbenp.prettier-vscode)扩展功能。
然后更新 .eslintrc.js 文件。
extends: [
/**
* 以下 2 つは Create React App のデフォルトの ESLint の設定です。
* Create React App ではこれを拡張する形で設定することを推奨しています。
* そのため以下 2 つは消さずに、config を追加する際はその下に記載してください。
* 詳細は以下ドキュメントを参照してください。
* https://create-react-app.dev/docs/setting-up-your-editor
* https://github.com/facebook/create-react-app/tree/main/packages/eslint-config-react-app
*/
"react-app",
"react-app/jest",
+
+ "prettier",
],
在Prettier的文件中,将prettier放在extends的最后(Prettier的文件)。
更新.vscode/settings.json文件。
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
- }
+ },
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.formatOnSave": true
这样,当文件保存时,Prettier 将会被执行。
在使用Docker进行开发时要注意的事项
如果在您的本地(包括eslint和prettier)没有安装相关包的情况下,您会使用内置的eslint和prettier扩展功能,这可能会导致某些扩展功能无法使用或出现错误。
简单的解决方法是在本地安装这些包(执行yarn install)。
另外,有可能通过一些方法在Docker容器内使用eslint和prettier,但需要一些技巧。
另外,使用Docker Compose的时候,例如,如果在frontend目录下有一个React应用程序,则需要在.vscode/settings.json文件中添加以下设置。
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
- "editor.formatOnSave": true
+ "editor.formatOnSave": true,
+ "eslint.workingDirectories": ["./frontend"]
}
尝试添加ESLint配置
尝试添加 Airbnb 的配置。
$ yarn add -D eslint-config-airbnb eslint-config-airbnb-typescript
更新 .eslintrc.js 文件。
extends: [
/**
* 以下 2 つは Create React App のデフォルトの ESLint の設定です。
* Create React App ではこれを拡張する形で設定することを推奨しています。
* そのため以下 2 つは消さずに、config を追加する際はその下に記載してください。
* 詳細は以下ドキュメントを参照してください。
* https://create-react-app.dev/docs/setting-up-your-editor
* https://github.com/facebook/create-react-app/tree/main/packages/eslint-config-react-app
*/
"react-app",
"react-app/jest",
+ "airbnb",
+ "airbnb-typescript",
"prettier",
],
+ parserOptions: {
+ project: "./tsconfig.json",
+ },
ignorePatterns: [
+ "/.eslintrc.js",
"/build/", // ビルド出力
],
在这里,”prettier”要放在”extends”的最后(Prettier的文档)。
当添加了airbnb-typescript时,如果不添加parserOptions,将会出现以下错误。顺便说一下,如果在VSCode中运行命令面板(shift+cmd+p),可以执行ESLint: Show Output Channel命令来查看。
Error: Error while loading rule '@typescript-eslint/dot-notation': You have used a rule which requires parserServices to be generated. You must therefore provide a value for the "parserOptions.project" property for @typescript-eslint/parser.
当添加了airbnb-typescript时,如果没有将”/.eslintrc.js”添加到ignorePatterns中,那么”.eslintrc.js”本身将受到lint的影响并出现以下错误。为了避免这个错误,我们需要像上面的 “.eslintrc.js”那样配置,即设置不对”.eslintrc.js”进行lint。请参考typescript-eslint的文档。
Parsing error: ESLint was configured to run on `<tsconfigRootDir>/.eslintrc.js` using `parserOptions.project`: /{path_to_app}/tsconfig.json
However, that TSConfig does not include this file.
轻轻地测试一下功能。
尝试在 src/App.tsx 中添加以下内容。
function App() {
+ var re = /foo bar/
return (
当保存后,会被修改为以下的样子。
function App() {
- var re = /foo bar/
+ const re = /foo {3}bar/;
return (
更详细地说,正在执行以下操作。
-
- Prettier によるフォーマット
インデント調整
; の付加
ESLint による自動修正
no-regix-spaces の違反の修正
{3} になっているところ
no-var の違反の修正
var が const になっているところ
これは eslint-config-airbnb によってチェックされるようになった項目(ソースは多分ここ)
此外,ESLint 还提供以下指导意见。
're' is assigned a value but never used.
最终配置文件
.eslintrs.js的中文翻译:只需要一种选项
/**
* ESLint の設定です。ドキュメントは以下です。
* https://eslint.org/docs/latest/use/configure/
*/
module.exports = {
extends: [
/**
* 以下 2 つは Create React App のデフォルトの ESLint の設定です。
* これを拡張する形で設定するため、config を追加する際はこの下に記載してください。
* 詳細は以下ドキュメントを参照してください。
* https://create-react-app.dev/docs/setting-up-your-editor
* https://github.com/facebook/create-react-app/tree/main/packages/eslint-config-react-app
*/
"react-app",
"react-app/jest",
"airbnb",
"airbnb-typescript",
"prettier",
],
parserOptions: {
project: "./tsconfig.json",
},
ignorePatterns: [
"/.eslintrc.js",
"/build/", // ビルド出力
],
};
.vscode/settings.json的原文翻译为中文:
.vscode/settings.json 文件。
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
}
请参考以下网站
在上述的过程中,我们最终参考了官方文件,但在调查过程中,以下的文章对我们非常有帮助。非常感谢您。
-
- ESLint 設定を作成する技術
-
- TypeScrip + ESLint + Prettier + Jest のプロジェクト設定にハマる – かもメモ
- [VSCode] TypeScriptにESLintを入れると Parsing error: “parserOptions.project” has been set for @typescript-eslint/parser. が表示される │ wonwon eater