使用 ESLint 和 Prettier

有关配置 ESLint 和 Prettier 以格式化 Expo 应用的指南。


ESLint 是一个 JavaScript linter,可以帮助你查找并修复代码中的错误。它是一个很棒的工具,可以帮助你编写更好的代码并在错误投入生产之前发现错误。你可以结合使用 Prettier,这是一种代码格式化程序,可确保所有代码文件遵循一致的样式。

¥ESLint is a JavaScript linter that helps you find and fix errors in your code. It's a great tool to help you write better code and catch mistakes before they make it to production. In conjunction, you can use Prettier, a code formatter that ensures all the code files follow a consistent styling.

本指南提供设置和配置 ESLint 和 Prettier 的步骤。

¥This guide provides steps to set up and configure ESLint and Prettier.

ESLint

设置

¥Setup

要在你的 Expo 项目中设置 ESLint,你可以使用 Expo CLI 安装必要的依赖。运行此命令还会在项目根目录创建一个 eslint.config.js 文件,该文件扩展了 eslint-config-expo 的配置。

¥To set up ESLint in your Expo project, you can use the Expo CLI to install the necessary dependencies. Running this command also creates a eslint.config.js file at the root of your project which extends configuration from eslint-config-expo.

Terminal
# Install and configure ESLint
npx expo lint
从 SDK 53 开始,创建的 ESLint 配置文件将使用 扁平化配置 格式。但是,旧版配置也将受支持。
Setup instructions for SDK 50 and below

1

Install ESLint, and eslint-config-expo in your project.

Terminal
npx expo install eslint@8 eslint-config-expo --dev
Terminal
npx expo install eslint@8 eslint-config-expo "--" --dev

2

Create an ESLint configuration file called .eslintrc.js at the root of your project. The configuration in .eslintrc.js extends eslint-config-expo.

.eslintrc.js
module.exports = {
  extends: 'expo',
};

3

Add a script to your package.json to run ESLint.

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

You can replace the . with specific directories or files to lint. For example, if you use Expo Router, you can use the eslint app command to lint only your routes inside the app directory.

Usage

Recommended: If you're using VS Code, install the ESLint extension to lint your code as you type.

You can lint your code manually from the command line with the npx expo lint script:

Terminal
# After ESLint has been configured, run the command again to lint your code.
npx expo lint

Running the above command will run the lint script from package.json.

Terminal
# Example output for npx expo lint command
/app/components/HelloWave.tsx 22:6 warning React Hook useEffect has a missing dependency: "rotateAnimation". Either include it or remove the dependency array react-hooks/exhaustive-deps
✖ 1 problem (0 errors, 1 warning)
Terminal
npm run lint

Environment configuration

ESLint is generally configured for a single environment. However, the source code is written in JavaScript in an Expo app that runs in multiple different environments. For example, the app.config.js, metro.config.js, babel.config.js, and app/+html.tsx files are run in a Node.js environment. It means they have access to the global __dirname variable and can use Node.js modules such as path. Standard Expo project files like app/index.js can be run in Hermes, Node.js, or the web browser.

You can add the eslint-env comment directive to the top of a file to tell ESLint which environment the file is running in. For example, to tell ESLint that a file is run in Node.js, add the following comment to the top of the file:

metro.config.js
/* eslint-env node */
const { getDefaultConfig } = require('expo/metro-config');

/** @type {import('expo/metro-config').MetroConfig} */
const config = getDefaultConfig(
  __dirname
);

module.exports = config;

Prettier

Installation

To install Prettier in your project:

Terminal
npx expo install prettier eslint-config-prettier eslint-plugin-prettier --dev
Terminal
npx expo install prettier eslint-config-prettier eslint-plugin-prettier "--" --dev

Setup

To integrate Prettier with ESLint, update your eslint.config.js:

eslint.config.js
const { defineConfig } = require('eslint/config');
const expoConfig = require('eslint-config-expo/flat');
const eslintPluginPrettierRecommended = require('eslint-plugin-prettier/recommended');

module.exports = defineConfig([
  expoConfig,
  eslintPluginPrettierRecommended,
  {
    ignores: ['dist/*'],
  },
]);

To integrate Prettier with ESlint, update your .eslintrc.js:

.eslintrc.js
module.exports = {
  extends: ['expo', 'prettier'],
  plugins: ['prettier'],
  rules: {
    'prettier/prettier': 'error',
  },
};

Note: In the above configuration, you can use "prettier/prettier": "warn" if you prefer these formatting issues as warnings instead of errors.

Now, when you run npx expo lint, anything that is not aligned with Prettier formatting will be caught as an error.

To customize Prettier settings, create a .prettierrc file at the root of your project and add your configuration.

自定义 Prettier 配置

了解有关自定义 Prettier 配置的更多信息。

Troubleshooting

ESLint is not updating in VS Code

If you're using VS Code, install the ESLint extension to lint your code as you type. You can try restarting the ESLint server by running the command ESLint: Restart ESLint Server from the command palette.

ESLint is slow

ESLint can be slow to run on large projects. The easiest way to speed up the process is to lint fewer files. Add a .eslintignore file to your project root to ignore certain files and directories such as:

.eslintignore
/.expo
node_modules

Migration to Flat config

info 注释:Expo SDK 53 及更高版本支持扁平配置。

¥info Note: Flat config is supported in Expo SDK 53 and above.

升级 ESLint 和 eslint-config-expo

¥Upgrade ESLint and eslint-config-expo:

Terminal
npx expo install eslint eslint-config-expo --dev
Terminal
npx expo install eslint eslint-config-expo "--" --dev

如果你根本没有自定义 ESLint 配置,请删除 .eslintrc.js 并使用以下命令生成新配置:

¥If you haven't customized your ESLint config at all, delete your .eslintrc.js and generate the new config with:

Terminal
npx expo lint

或者,你可以根据 ESLint 迁移指南 迁移你的配置。npx expo lint 同时支持旧版配置和扁平化配置,因此 CLI 将自动选择新配置。

¥Alternatively, migrate your config based on the ESLint's migration guide. npx expo lint supports both legacy and flat config, so the new config will automatically be picked up by the CLI.