迁移
ESLint 在 v8.53.0 中弃用了其格式化规则 并建议用户迁移到 ESLint 风格。虽然 ESLint 从未删除弃用的规则,但这仍然意味着弃用的规则将不会收到任何未来的更新。在 ESLint 风格中,我们已经迁移了所有这些规则,并将继续维护它们。
本指南将帮助您进行迁移。
手动迁移
ESLint 风格从 3 个不同的源包迁移而来
eslint
->@stylistic/eslint-plugin-js
- JavaScript 的内置风格规则
@typescript-eslint/eslint-plugin
->@stylistic/eslint-plugin-ts
- TypeScript 的风格规则
eslint-plugin-react
->@stylistic/eslint-plugin-jsx
- 与框架无关的 JSX 规则
有两种方法可以将您的项目迁移到 ESLint 风格
- 方法 1:迁移到单个插件:JavaScript、TypeScript 和 JSX 的单个包。这是推荐的方法。
- 方法 2:迁移到 1 对 1 插件:每个源包一个包。规则是 1:1 映射,迁移起来会更容易。
方法 1:迁移到单个插件
为了使规则配置更容易,我们将所有三个插件合并到一个单个插件中。
sh
npm i -D @stylistic/eslint-plugin
js
// .eslintrc.js [Legacy Config]
module.exports = {
plugins: [
'@stylistic'
],
rules: {
// ESLint built-in stylistic rules:
// Add `@stylistic/` prefix
'semi': 'error',
'@stylistic/semi': 'error',
// `@typescript-eslint` rules:
// Change `@typescript-eslint/` to `@stylistic/` prefix
'@typescript-eslint/semi': 'error',
'@stylistic/semi': 'error',
// `eslint-plugin-react` rules:
// Change `react/` to `@stylistic/` prefix
'react/jsx-indent': 'error',
'@stylistic/jsx-indent': 'error',
}
}
通常,typescript-eslint 会要求您禁用内置规则,转而使用 @typescript-eslint
版本。使用 ESLint Stylistic,您只需要一个规则来处理 JavaScript 和 TypeScript。
js
// .eslintrc.js [Legacy Config]
module.exports = {
plugins: [
'@stylistic'
],
rules: {
// Previously, you need to disable the built-in rule
'semi': 'off',
'@typescript-eslint/semi': 'error',
// Now only need one rule
'@stylistic/semi': 'error',
}
}
方法 2:迁移到 1 对 1 插件
为了简化迁移过程,我们还为每个源包的插件提供了 1 对 1 的映射。与 单插件方法 不同,您需要安装 3 个不同的包,并在规则中添加额外的前缀。
ESLint 代码 (JavaScript)
sh
npm i -D @stylistic/eslint-plugin-js
js
// .eslint.config.js
import stylisticJs from '@stylistic/eslint-plugin-js'
export default [
plugins: {
'@stylistic/js': stylisticJs
},
rules: {
// ESLint built-in stylistic rules:
// Add `@stylistic/js/` prefix
'semi': 'error',
'@stylistic/js/semi': 'error',
}
]
js
// .eslintrc.js
module.exports = {
plugins: [
'@stylistic/js'
],
rules: {
// ESLint built-in stylistic rules:
// Add `@stylistic/js/` prefix
'semi': 'error',
'@stylistic/js/semi': 'error',
}
}
TypeScript
sh
npm i -D @stylistic/eslint-plugin-ts
js
// .eslint.conf.js
import stylisticTs from '@stylistic/eslint-plugin-ts'
export default [
plugins: {
'@stylistic/ts': stylisticTs
},
rules: {
// `@typescript-eslint` rules:
// Change `@typescript-eslint/` to `@stylistic/ts/` prefix
'@typescript-eslint/semi': 'error',
'@stylistic/ts/semi': 'error',
}
]
js
// .eslintrc.js
module.exports = {
plugins: [
'@stylistic/ts'
],
rules: {
// `@typescript-eslint` rules:
// Change `@typescript-eslint/` to `@stylistic/ts/` prefix
'@typescript-eslint/semi': 'error',
'@stylistic/ts/semi': 'error',
}
}
JSX
sh
npm i -D @stylistic/eslint-plugin-jsx
js
// .eslint.conf.js
import stylisticJsx from '@stylistic/eslint-plugin-jsx'
export default [
plugins: [
'@stylistic/jsx'
],
rules: {
// `eslint-plugin-react` rules:
// Change `react/` to `@stylistic/jsx/` prefix
'react/jsx-indent': 'error',
'@stylistic/jsx/jsx-indent': 'error',
}
]
js
// .eslintrc.js
module.exports = {
plugins: [
'@stylistic/jsx'
],
rules: {
// `eslint-plugin-react` rules:
// Change `react/` to `@stylistic/jsx/` prefix
'react/jsx-indent': 'error',
'@stylistic/jsx/jsx-indent': 'error',
}
}
ESLint 迁移插件
我们提供一个 ESLint 插件,用于将内置的样式规则迁移到 @stylistic
命名空间。
sh
npm i -D @stylistic/eslint-plugin-migrate
js
// .eslintrc.js
module.exports = {
plugins: [
'@stylistic/migrate'
],
}
并在您的 eslint 配置文件中选择加入,方法是在文件顶部添加 eslint 注释
js
// Migrate built-in rules to @stylistic/js namespace
/* eslint @stylistic/migrate/migrate-js: "error" */
// Migrate `@typescript-eslint` rules to @stylistic/ts namespace
/* eslint @stylistic/migrate/migrate-ts: "error" */
module.exports = {
rules: {
indent: ['error', 2], // Error: Use @stylistic/js/indent instead
'@typescript-eslint/indent': ['error', 2], // Error: Use @stylistic/ts/indent instead
}
}
禁用传统规则
如果您扩展了一些仍然包含传统规则且尚未迁移的预设,我们提供配置预设来禁用所有这些规则。
js
// eslint.config.js
import { FlatCompat } from '@eslint/eslintrc'
import StylisticPlugin from '@stylistic/eslint-plugin'
const compat = new FlatCompat()
export default [
// `extends` is not supported in flat config, can you use `@eslint/eslintrc` to handle it
...compat({
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
// ...
],
}),
// override the legacy rules
StylisticPlugin.configs['disable-legacy'],
// your own rules
{
plugins: {
stylistic: StylisticPlugin
},
rules: {
'stylistic/semi': 'error',
// ...
}
}
]
js
// .eslintrc.js
module.exports = {
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
// ...
'plugin:@stylistic/disable-legacy',
],
plugins: [
'@stylistic'
],
rules: {
'@stylistic/semi': 'error',
// ...
}
}
包元数据
如果您想自行处理迁移,我们也公开了元数据以方便您进行编程使用。
sh
npm i -D @eslint-stylistic/metadata
js
import { rules, packages } from '@eslint-stylistic/metadata'
console.log(rules)